解开CFBlog的index.js的面纱

CFBlog的index.js是混淆过的,不易理解,tg群里也问过作者,说不打算开源,这让一些爱折腾的人不好折腾了。

经过本人多日的研究,梳理逻辑,将其进行人工格式化(不包含OPT配置),并附件上注释,以供大家学习。

在线查看index_decrypt.js

这里除了添加换行、缩进和注释外,并未做其他改动。比如

"https://raw.githubusercontent.com/gdtool/cloudflare-workers-blog/master/themes/default/"==OPT.themeURL&&(OPT.themeURL="https://raw.githubusercontent.com/gdtool/cloudflare-workers-blog/master/themes/default2.0/")

其实正常代码应该是

//如果采用默认default主题,则改为加载default2.0主题
if("https://raw.githubusercontent.com/gdtool/cloudflare-workers-blog/master/themes/default/"==OPT.themeURL){
    OPT.themeURL="https://raw.githubusercontent.com/gdtool/cloudflare-workers-blog/master/themes/default2.0/"
}

但为了保持与源码的一致性,依旧保留了第一种的方式。
后续会根据自己的理解,自行写一套阅读性强的源码并开源,敬请期待。

大纲结构

1~26行是一个主函数,27~末尾是这个函数的参数,这个参数是一个数组类型,包含3个函数,通过这个主函数加载这3个函数。

数组中的第一个函数(第28行)不用搭理。

数组中的第二个函数(第31~584行)是真实的处理逻辑,下面会展开介绍。

数组中的第二个函数(第586行~末)是引入mustanche.js ,也不用搭理。

解析第二个函数

从图中可以看出是一个集合列表

前面(第35~138行)是定义了一堆函数(已混淆),大部分的函数已经加上注释了。

//博客前端主页
//async function a(t,e,r){

//getKVArticleCategory
//function i(t,e,r=OPT.pageSize){

//返回上篇、本篇、下篇文章
//function s(t){

//翻页
//function o(t,e=OPT.pageSize){

//KV读取,t:key值,e:格式是否为json,默认true
//function l(t,e=!1){

//写入kv
//function c(t,e){

//获取主题指定页的模板源码
//function g(t){

//获取标签、分类列表?
//function f(t){

//判断是否为对象,若为字符串,则尝试转json后再判断
//function h(t){

//排序
//function p(t,e,r=!0){

第162行是关键代码。用过cf workers的都知道,监听请求都是用addEventListener这个函数。

addEventListener中的函数说明

这里只列举一下所在行,不进行展开说明,感兴趣的可以根据下面的方式进行自行阅读理解。

  1. 进行Base Auth(第184行)
  2. 导出文章(第206行)
  3. 处理主题预览及分页(第235行)
  4. 访问robots.txt(第243行)
  5. 访问favicon.ico(第252行)
  6. 访问sitemap.xml(第271行)
  7. 访问博客前台-分页(第298行)
  8. 访问博客前台-分类页(第348行)
  9. 访问博客前台-标签页(第352行)
  10. 访问博客前台-文章详情页(第356行)
  11. 访问博客管理后台-新建页(第413行)
  12. 请求博客管理后台接口-发布(第429行)
  13. 访问博客管理后台接口-文章列表页(第459行)
  14. 请求博客管理后台接口-修改文章(第466行)
  15. 请求博客管理后台接口-保存配置(第481行)
  16. 请求博客管理后台接口-导入(第492行)
  17. 请求博客管理后台接口-保存新建的文章(第504行)
  18. 设置浏览器缓存时间(第575行)

阅读方式参考

左侧源码,右侧函数列表,看到函数调用就看看右侧的函数说明。