Hexo博客同步至优快云

本文介绍了如何实现从Hexo博客到优快云的自动同步,包括Markdown渲染、图片替换、URL编码处理和登录等关键步骤。在Markdown渲染中,通过Python调用Node.js进行渲染和代码高亮。图片处理涉及防盗链和更新检测。URL编码问题在提交时解决。此外,文章详细讨论了预处理和后处理细节,如代码块语言规范化和Mathjax公式渲染的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文首发在我的个人博客:https://jlice.top/p/7vexu/。欢迎大家前去参观,么么哒~

使用百度搜索,优快云上的文章经常排在前面,可是,我并不喜欢在优快云上写博客。而且,如果使用GitHub Pages搭建个人博客,由于GitHub屏蔽了百度的蜘蛛,百度会抓取失败,网站也就没有索引和流量了。虽然Google对于个人博客的收录比较快,也没那么麻烦,但国内使用百度搜索的还是比较多的。除了考虑不用GitHub Pages搭建,还可以考虑把文章同步到优快云,使用优快云来进行导流。

上网一查基本都是优快云文章导出Markdown到Hexo,却没有Hexo博客同步到优快云的,在GitHub上也没有找到相关的开源程序,无奈之下,只好自己搞一个了。本文就记录一下其中踩到的坑以及解决方案。

Markdown渲染

在优快云上创建Markdown文章时,会发送一个POST请求,有markdowncontentcontent字段:前者是Markdown内容,在使用优快云的Markdown编辑器时会使用这个字段;后者是渲染后的内容,在页面上显示博客会使用这个字段。这两个字段是独立的,也就是在页面上显示博客取决于content,和markdowncontent没有关系,反之亦然。

既然如此,在提交数据时,我们就需要自行渲染Markdown。Markdown的渲染器其实很丰富,所以Markdown渲染似乎是比较简单的。可是,代码块语法高亮呢?

经过观察,发现代码块的标签有prism类:

<pre><code class="prism language-python">
</code></pre>

prism是一个语法高亮的库,是基于JavaScript的。可是,我对JavaScript不是很熟,贸然使用JavaScript搞这个东西会很慢。所以,没办法,那就用Python调用nodejs吧,把要交换的数据写到文件里,这种方式虽然不够优雅,但可以简单地解决这个问题。这里我直接使用标准输入作为nodejs的输入,懒:

const md = require('markdown-it')({
    html: true,
});
const prism = require('markdown-it-prism');
const mathjax = require('markdown-it-mathjax');

const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim();
md.use(prism);
md.use(mathjax());
const ret = md.render(input);
console.log(ret);

其中markdown-it用来渲染Markdown,markdown-it-prism用来进行语法高亮,markdown-it-mathjax用来处理公式。

然后供Python调用。由于使用了/dev/stdin,所以与Windows不兼容。在Python中,先创建临时文件,然后把Markdown内容写入,再通过管道传给nodejs作为标准输入,读取结果,也就是Markdown渲染后的HTML。

_, tmp = mkstemp()
with open(tmp, "w") as f:
    f.write(markdown)
cmd = "cat '{}' | node {}".format(tmp, self.CONVERT_JS_PATH)
logger.info(cmd)
html = subprocess.check_output(cmd, shell=True).decode("utf-8")
return html

替换图片

我的个人博客使用对象存储来保存图片,并且启用了防盗链,这样可以节约流量。但是,放在优快云上的文章,我打算将图片传到优快云,用优快云站内的图片链接,这样我依然可以对对象存储启用防盗链,也避免优快云上的流量消耗我对象存储的流量。如果只考虑新增文章,那么没什么问题,但假如我想更新文章,那岂不要重新传一遍图片?如果不重新传图片,那么假如我要更新图片呢?

为此,可以把图片在对象存储的链接存到alt属性里,这样就可以知道是否需要更新图片了。不过,由于对图片链接进行了替换,在后面检查是否需要更新文章时需要做一下处理。

下面是整个过程的流程:

https://jlice-top.oss-cn-beijing.aliyuncs.com/b40e370c813311e99c6cdc4a3ef82d4f.jpg

新建文章和更新文章的过程是一样的,在优快云里它们使用的是相同的API,区别就在于前者没有指定文章id,后者指定了。

在预处理和后处理阶段需要针对图片链接进行调整。在优快云博客比较预处理时,需要去掉imgsrc属性,并使用alt属性作为图片链接:

<!-- before -->
<img src="https://img-blog.csdnimg.cn/img.jpg" alt="https://jlice.top/img.jpg">
<!-- after -->
![](https://jlice.top/img.jpg)

而在渲染后处理阶段,检查图片链接是否来自优快云,如果不是,那就下载并上传图片,把图片的下载链接保存到alt里,以供比较预处理阶段使用。

URL编码

按照上述的过程保存文章到优快云,会发现+号不见了。由于+号在代码里用的还是比较多的,这一点还是需要处理的。本来还以为是优快云的BUG,查看提交的Form Data也没有发现什么问题。但是,当点击view source后,就发现了问题所在:

https://jlice-top.oss-cn-beijing.aliyuncs.com/4ed334b6813611e9b52edc4a3ef82d4f.jpg

原来这些内容是经过URL编码的呀,遂加上URL编码:

url = "https://mp.youkuaiyun.com/mdeditor/saveArticle"
data = {
    "title": quote(title),
    "markdowncontent": quote(markdowncontent),
    "content": quote(content),
    "id": id,
    "private": private,
    "read_need_vip": read_need_vip,
    "tags": quote(tags),
    "status": status,
    "categories": quote(categories),
    "channel": channel,
    "type": type,
    "articleedittype": articleedittype,
    "Description": description,
    "csrf_token": csrf_token,
}
j = self.sess.post(url, data=data).json()

不过,Description别加URL编码,在查看Form Data时也可以看出Description没有URL编码。如果Description使用了URL编码,在看文章列表时会显示的是URL编码后的内容:

https://jlice-top.oss-cn-beijing.aliyuncs.com/ed04b1e6813611e9a9eedc4a3ef82d4f.jpg

细节处理

比较预处理

由于可以在Markdown里写HTML,所以可以利用HTML注释将文章的一些信息存到Markdown内容里。由于对图片地址进行了替换,因此,在比较预处理阶段需进行处理,否则每次都会是不一致的。

代码块语言

代码块的语言需要规范,否则prism会不识别。首先,需要是小写,例如Python需写为python,然后,不能用符号,例如c#需写为csharp。但是,我的Hexo博客是能识别的,而我又不想改博客Markdown文件。为了优快云而作调整,假如我以后又想同步到别的平台,又要做调整呢?所以,可以在预处理阶段将其规范化为prism支持的形式。

但是,在使用时发现,C++代码依然是不能语法高亮的,即使语言改为了cpp,prism依然无法解析。不过,改为C语言就可以。然而,C++和C语言的语法毕竟是不一样的,这样做并不完美。然后,通过看源码,发现markdown-it-prism调用了prismjs。在经过一番Debug之后,终于发现prismjs在加载node_modules/prismjs/components/prism-cpp.js时出错,修改一下就好了:

// before
Prism.languages.cpp = Prism.languages.extend('c', {
// after
Prism.languages.cpp = Prism.languages.extend('clike', {

公式渲染

由于习惯使用\(来插入行内公式,用\)$来插入行间公式,这并不是Mathjax默认的写法,这个可以通过markdown-it-mathjax这个模块来进行调整。

但是,我有的公式写的并不那么规范,因为不同的渲染器表现不一样,所以我只保证我个人博客上的渲染效果正常。例如,对于行内公式,如果公式和$之间有空格,markdown-it-mathjax将不会处理,不过行间公式可以,因此,需要在预处理阶段进行调整。这个可以用一个正则解决,然后配合Front-matter里的mathjax字段进行判断,虽然不100%准确,但基本上是可行的:

re.sub(r'(?<!\$)`?\$\s*(.*?)\s*\$`?(?!\$)', r'$\1$', markdown)

登录

使用用户名密码登录时,看请求的内容里有fkid、loginType、pwdOrVerifyCode、uaToken、userIdentification、webUmidToken,userIdentification和pwdOrVerifyCode分别是用户名和密码,loginType为1时表示使用用户名密码登录,其它几个字段不清楚怎么来的。不过,我发现webUmidToken随便写个什么就可以了,也就是只传userIdentification、pwdOrVerifyCode、loginType、webUmidToken就可以登录了。

但是,登录几次之后就出现了服务器错误的提示。好吧,还是直接用Cookies吧。


由于nodejs从/dev/stdin读取输入,使得程序不支持Windows(不过,这个好解决)。然后,程序里利用了我Hexo博客个性化的一些设置,例如,我的Hexo博客为每篇文章分配一个abbrlink,这样可以让文章链接很短且不重复。所以,程序并不通用。为了让程序变得通用,需要做较多修改,暂时并无打算,所以暂不开源了~

<think>好的,用户想了解如何将优快云博客迁移到Hexo平台。我需要先整理现有的信息,看看有没有现有的工具或方法。根据用户提供的引用,他们提到了一个叫CsdnSyncHexo的工具,应该能帮助自动化迁移。 首先,我应该确认这个工具的使用步骤。用户可能需要安装Python环境,因为很多这类工具都是用Python写的。然后,下载工具,配置优快云的账号信息,比如用户名和密码,或者可能需要获取博客的API接口。接下来,运行工具导出博文为Markdown格式,这很关键,因为Hexo使用Markdown来管理内容。 然后,用户需要将导出的文件放到Hexo的source/_posts目录下。之后,用Hexo生成静态页面并部署。这部分可能需要检查Hexo的基本命令,比如hexo generate和hexo deploy。另外,用户可能还需要处理图片迁移的问题,因为优快云的图片可能存储在远程,需要下载到本地或者使用图床,避免链接失效。 另外,用户可能关心换了电脑怎么更新博客,引用[1]提到了使用Git来管理Hexo项目,这样可以在不同电脑间同步。这部分可能需要提醒用户将整个Hexo目录上传到Git仓库,包括主题和配置文件,方便后续迁移。 还需要考虑是否有其他工具或方法,比如手动导出优快云博客,或者使用其他脚本工具。但根据引用[2],CsdnSyncHexo似乎是一个比较方便的工具,可以节省时间,避免手动一篇篇迁移。 可能的问题包括工具是否仍然维护,有没有兼容性问题,比如Python版本,或者优快云接口变动。如果用户遇到问题,可能需要建议他们查看工具的GitHub页面,或者寻找替代方案。 此外,处理特殊格式的转换,比如代码块、数学公式等,是否在导出过程中保留正确格式。Hexo通常使用Markdown的语法,所以需要确保导出的文件正确转换了这些元素,可能需要后续手动调整。 最后,用户可能想知道迁移后的后续步骤,比如如何部署到服务器或GitHub Pages,如何配置主题等,但问题主要聚焦在迁移方法,所以可能不需要深入这些方面,除非用户后续提问。</think>### 如何迁移 优快云 博客Hexo 平台? #### 步骤说明 1. **使用自动化工具迁移** 推荐使用开源工具 `CsdnSyncHexo`[^2],它能将 优快云 博客自动导出为 Hexo 兼容的 Markdown 文件。操作流程如下: - **安装依赖**:确保已安装 Python 环境。 - **下载工具**:从 GitHub 获取 `CsdnSyncHexo` 仓库: ```bash git clone https://github.com/Freed-Wu/CsdnSyncHexo.git ``` - **配置信息**:在 `config.yaml` 中填写 优快云 账号和密码,或直接通过博客列表 API 导出(无需密码)。 - **执行导出**:运行脚本生成 Markdown 文件,默认保存在 `output` 目录。 2. **手动迁移(备用方案)** 若工具失效,可手动操作: - **导出 优快云 文章**:在 优快云 后台通过“导出为 Markdown”功能单篇下载。 - **整理文件**:将导出的 `.md` 文件按 Hexo 格式命名(如 `YYYY-MM-DD-标题.md`),并添加 Front Matter: ```markdown title: 文章标题 date: 2023-01-01 categories: [分类] tags: [标签1, 标签2] ``` 3. **处理图片资源** - **本地化图片**:将 优快云 的远程图片下载到 Hexo 的 `source/images` 目录,并在 Markdown 中替换路径为 `/images/文件名`。 - **图床替代方案**:使用云存储(如阿里云 OSS)或 GitHub 仓库托管图片,避免本地路径依赖。 4. **部署到 Hexo** - 将生成的 Markdown 文件复制到 Hexo 博客的 `source/_posts` 目录。 - 执行命令生成静态页面并部署: ```bash hexo clean && hexo generate && hexo deploy ``` #### 关键注意事项 - **格式兼容性**:检查导出的 Markdown 是否包含 Hexo 不支持的语法(如特殊表格、数学公式),需手动调整。数学公式需用 `$$...$$` 包裹[^1]。 - **多设备同步**:通过 Git 管理 Hexo 项目,将源码(含主题、配置、文章)推送至远程仓库,换设备时克隆后恢复依赖: ```bash git clone <仓库地址> && npm install ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值