与FreeHostia的缘分还是到了尽头。最近发现主机IP已经开始主动拒绝国内的IP访问,估计是国内外太多机器人爬小站,每个月都要爬掉50多G流量,才导致被ban了。无奈之下还是要找好下一个窝,于是就盯上了静态网页托管。但是搬家之旅真的很难受很恶心。我花了整整一个下午去挑选排错,最终选择了netlify+bitbucket+typora这一套方案。

基本逻辑比较简单: bitbucket上使用master分支存储hexo项目代码,然后hexo deploy生成静态文件推送到bitbucket上的hexo分支。netlify导入bitbucket的hexo分支直接构建网站。虽然netlify的Domain Management上说要把域名的NS修改成他提供的,但是亲测只需要添加域名,不必修改NS。域名可以在DNSPOD下托管,把原来的A记录切换为CNAME,指向netlify提供的域名(*.netlify.app)。

恶心的点:

  1. 我想要使用vscode或者typora编辑markdown,但是都2024年了,MD的图片上传依旧非常恶心人。我试过了hexo-image-link等插件依旧不能完美解决的问题,明明已经读取到了图片,但是却不给我生成<img />标签;把图片删掉,又能生成标签了。最终还是选择妥协,以后的文章尽量不放任何图片。
  2. 主题只展示一页,没有页面选择。好不容易找到个喜欢的主题,结果是没有paginator的!!在主题内部找到paginator.ejs发现并没有被使用,而且没有样式。手动补全样式然后在layout.ejs中body下调用<%- partial('_partial/paginator') %>
  3. 公式支持非常麻烦。有些主题下我的公式显示异常,好像还和MD的解析器有关系,我折腾不动了,刚好这个主题有MathJax,就用着吧…

折腾Hexo的时候也试了试Hugo,还是不太满意,感觉不如Hexo灵活好用,毕竟是用JS开发的,我更加熟悉一些。

附上一张旧博客的截图:
old_log_shot
博客后期一直被广告bot刷评论,有些文章浏览量都快破3万了…封禁IP都封不完,换了个新域名之后好了很多。

附上导出Typecho文章代码:

参考typecho2Hexo,我自己修改了一下,把文件名的中文替换成了拼音,这样稳定一些。Typecho文章导出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
// github.com/NewbMiao/typecho2Hexo
$db = new mysqli();
// 根据实际情况更改
$db->connect('localhost','root','root','lujia49_blog');
$prefix = 'typecho_';
$sql = <<<TEXT
select title,text,created,category,tags from {$prefix}contents c,
(select cid,group_concat(m.name) tags from {$prefix}metas m,{$prefix}relationships r where m.mid=r.mid and m.type='tag' group by cid ) t1,
(select cid,m.name category from {$prefix}metas m,{$prefix}relationships r where m.mid=r.mid and m.type='category') t2
where t1.cid=t2.cid and c.cid=t1.cid
TEXT;
$res = $db->query($sql);
if ($res) {
if ($res->num_rows > 0) {
while ($r = $res->fetch_object()) {
$_c = @date('Y-m-d H:i:s', $r->created);
$_c_date = date('ymd', $r->created);
$_t = str_replace('<!--markdown-->', '', $r->text);
$_tmp = <<<TMP
---
title: {$r->title}
categories: [{$r->category}]
tags: [{$r->tags}]
date: {$_c}
---
{$_t}
TMP;
// windows下把文件名从UTF-8编码转换为GBK编码,避免出现生成的文件名为乱码的情况
$name = $r->title;
$name = pinyin::utf8_to($name);

if (strpos(PHP_OS, "WIN") !== false) {
$name = iconv("UTF-8", "GBK//IGNORE", $name);
}
// 替换不合法文件名字符
$filename = $_c_date . '_' . preg_replace("/[ \?\:\*-]+/", '-', $name);
// $filename = $_c_date . '_' . $name;
file_put_contents($filename . ".md", $_tmp);
echo $r->title . " --> " . $filename . '<br>';
}
}
$res->free();
}
$db->close();


// 此类是根据ASCII码转换,GB2312库对多音字也无能为力。
// GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换,如:“镕”字。
class pinyin{
public static function utf8_to($s, $isfirst = false) {
return self::to(self::utf8_to_gb2312($s), $isfirst);
}

public static function utf8_to_gb2312($s) {
return iconv('UTF-8', 'GB2312//IGNORE', $s);
}

// 字符串必须为GB2312编码
public static function to($s, $isfirst = false) {
$res = '';
$len = strlen($s);
$pinyin_arr = self::get_pinyin_array();
for($i=0; $i<$len; $i++) {
$org = $s{$i};
$ascii = ord($s{$i});
if($ascii > 0x80) {
$ascii2 = ord($s{++$i});
$ascii = $ascii * 256 + $ascii2 - 65536;
}

if($ascii < 255 && $ascii > 0) {
if(($ascii >= 48 && $ascii <= 57) || ($ascii >= 97 && $ascii <= 122)) {
$res .= $s{$i}; // 0-9 a-z
}elseif($ascii >= 65 && $ascii <= 90) {
$res .= ($s{$i}); // A-Z
}else{
$res .= $org;
}
}elseif($ascii < -20319 || $ascii > -10247) {
$res .= $org;
}else{
foreach($pinyin_arr as $py=>$asc) {
if($asc <= $ascii) {
$res .= $isfirst ? ($py{0}) : (ucfirst($py));
break;
}
}
}
}
return $res;
}

public static function to_first($s) {
$ascii = ord($s{0});
if($ascii > 0xE0) {
$s = self::utf8_to_gb2312($s{0}.$s{1}.$s{2});
}elseif($ascii < 0x80) {
if($ascii >= 65 && $ascii <= 90) {
return strtolower($s{0});
}elseif($ascii >= 97 && $ascii <= 122) {
return $s{0};
}else{
return false;
}
}

if(strlen($s) < 2) {
return false;
}

$asc = ord($s{0}) * 256 + ord($s{1}) - 65536;

if($asc>=-20319 && $asc<=-20284) return 'a';
if($asc>=-20283 && $asc<=-19776) return 'b';
if($asc>=-19775 && $asc<=-19219) return 'c';
if($asc>=-19218 && $asc<=-18711) return 'd';
if($asc>=-18710 && $asc<=-18527) return 'e';
if($asc>=-18526 && $asc<=-18240) return 'f';
if($asc>=-18239 && $asc<=-17923) return 'g';
if($asc>=-17922 && $asc<=-17418) return 'h';
if($asc>=-17417 && $asc<=-16475) return 'j';
if($asc>=-16474 && $asc<=-16213) return 'k';
if($asc>=-16212 && $asc<=-15641) return 'l';
if($asc>=-15640 && $asc<=-15166) return 'm';
if($asc>=-15165 && $asc<=-14923) return 'n';
if($asc>=-14922 && $asc<=-14915) return 'o';
if($asc>=-14914 && $asc<=-14631) return 'p';
if($asc>=-14630 && $asc<=-14150) return 'q';
if($asc>=-14149 && $asc<=-14091) return 'r';
if($asc>=-14090 && $asc<=-13319) return 's';
if($asc>=-13318 && $asc<=-12839) return 't';
if($asc>=-12838 && $asc<=-12557) return 'w';
if($asc>=-12556 && $asc<=-11848) return 'x';
if($asc>=-11847 && $asc<=-11056) return 'y';
if($asc>=-11055 && $asc<=-10247) return 'z';
return false;
}

public static function get_pinyin_array() {
static $py_arr;
if(isset($py_arr)) return $py_arr;

$k = 'a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo';
$v = '-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274|-10270|-10262|-10260|-10256|-10254';
$key = explode('|', $k);
$val = explode('|', $v);
$py_arr = array_combine($key, $val);
arsort($py_arr);

return $py_arr;
}
}