跳到主要内容

· 阅读需 1 分钟
Niko
---
title: 欢迎来到 Docusaurus v2
description: 这是我关于 Docusaurus 2 的第一篇博文。
slug: welcome-docusaurus-v2
authors:
- name: Joel Marcey
title: Docusaurus 1 合作创造者
url: https://github.com/JoelMarcey
image_url: https://github.com/JoelMarcey.png
- name: Sébastien Lorber
title: Docusaurus 维护者
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
tags: [hello, docusaurus-v2]
image: https://i.imgur.com/mErPwqL.png
hide_table_of_contents: false
---

欢迎来到本博客。 此博客使用 [**Docusaurus 2**](https://docusaurus.io/) 搭建。

· 阅读需 4 分钟
Niko

Docker部署私有笔记,欢迎使用!

为知笔记是一款老牌笔记应用了,支持markdown等多功能,本人也用了好几年了。云同步功能付费,每年60,作为白嫖党还是有点点心疼的,毕竟不是买断制收费。

好在最近推出了docker私有化部署的功能,可以支持5个用户,当然这个是可以破解的,已实现vip功能(会放在安装教程后)

部署docker镜像

先贴上官方教程:https://www.wiz.cn/zh-cn/docker

cd ~
mkdir wizdata // 这是数据目录,可迁移可备份
// 创建docker
// linux版
docker run --name wiz --restart=always -it -d -v ~/wizdata:/wiz/storage -v /etc/localtime:/etc/localtime -p 8848:80 -p 9269:9269/udp wiznote/wizserver
// mac版
docker run --name wiz --restart=always -it -d -v ~/wizdata:/wiz/storage -e TZ=`ls -la /etc/localtime | cut -d/ -f8-9` -p 8848:80 -p 9269:9269/udp wiznote/wizserver

这样就已经部署好了,端口是8848,可自行更改(本人没有群晖设备,但大致应该都和Linux版差不太多,可自行探索)

如果想要搜索文本功能,可以加上“-e SEARCH=true”,不过内存要求4g左右才够用!

使用私有为知笔记

第一次运行镜像,因为需要下载docker镜像,并且初始化数据,速度要慢一些。请耐心等待。(根据网络状况,可能需要10分钟或者更长时间。)在下载完成后,第一次启动镜像大概需要2-3分钟时间。

然后打开浏览器,在地址栏里面输入:http://localhost:8090,如果服务正常,则会出现下面的界面

默认管理员账号:admin@wiz.cn,密码:123456。请在部署完成后,使用这个账号,登录网页版,然后修改管理员密码。其他用户,请自行注册。免费版本可以注册5个用户(不包含管理员账号)

破解vip功能

PS:破解方法非原创哈~之前在看雪上翻到的大佬教程,搜索了下没找到,有找到的可以提供下链接,下面开始教学

// 进入容器
docker exec -it wiz bash
// 编辑核心文件
vi /wiz/app/wizserver/node_modules/node-rsa/src/NodeRSA.js

输入“/NodeRSA.prototype.decryptPublic”回车,找到破解位置,替换NodeRSA.prototype.decryptPublic = function (buffer, encoding)方法

/**
* Decrypting data method with public key
*
* Parameters same as `decrypt` method
*/
NodeRSA.prototype.decryptPublic = function (buffer, encoding) {
// return this.$decryptKey(true, buffer, encoding);
var data = this.$decryptKey(true, buffer, encoding);
try {
var v = JSON.parse(data);
if (v.count == 5) {
v.count = 999;
v.type = 'license_vip';
v.oem = '红叶';
data = Buffer.from(JSON.stringify(v));
}
} catch (e) {}
return data;
};

其中v.count是授权账号数、v.oem是显示授权账号名,均可自行修改。

重启容器docker restart wiz后,进入管理员账号,打开系统管理,即可显示如下图

破解文件映射镜像

文件已上传github:下载链接

下载到~/wizdata/crack文件夹中

// linux版
docker run --name wiz --restart=always -it -d -v ~/wizdata:/wiz/storage -v /etc/localtime:/etc/localtime -p 8848:80 -p 9269:9269/udp -v ~/wizdata/crack/NodeRSA.js:/wiz/app/wizserver/node_modules/node-rsa/src/NodeRSA.js:ro wiznote/wizserver

· 阅读需 5 分钟
Niko
  1. 微博图床:以前我是经常用的,后来开启防盗链就开始麻烦起来了,所以果断放弃
  2. SM.MS:稳定,经营了四年多了,但是是国外服务器,速度堪忧
  3. 大厂储存服务:例如七牛云、又拍云、腾讯云COS、阿里云OSS等,操作繁琐,又是实名认证又是域名备案的,麻烦,而且还要花钱(有钱又不怕麻烦的当我没说)
  4. GitHub图床:免费,但是国内访问速度慢(不过没关系,利用 jsDelivr 提供的免费的 CDN 加速 速度足够了)

方法

新建 GitHub 仓库

生成一个 Token

  • 点击用户头像 -> 选择 设置

  • 点击开发者设置

  • 点击Personal access tokens

  • 点击Generate new token

  • 填写Token描述,勾选repo然后点击Generate token生成一个Token

  • 获取 Token密钥

注意这个 Token 只会显示一次,自己先保存下来,或者等后面配置好 PicGo 后再关闭此网页

配置 PicGo 并使用 jsdelivr 作为 CDN 加速

前往下载PicG(点击下载),安装好后开始配置图床

设定仓库名:按照用户名/图床仓库名 的格式填写

设定分支名:main

设定 Token:粘贴之前生成的Token

指定存储路径:填写想要储存的路径,如 img/,这样就会在仓库下创建一个名为img的文件夹,图片将会储存在此文件夹中

设定自定义域名:它的的作用是,在图片上传后,PicGo 会按照自定义域名+上传的图片名的方式生成访问链接,放到粘贴板上,因为我们要使用 jsDelivr 加速访问,所以可以设置为https://cdn.jsdelivr.net/gh/用户名/图床仓库名@分支 #默认是main

使用第三方图床使用GitHub图床

因为GitHub服务器在国外,国内经常抽风,导致上传失败,这时候就可以自己白嫖一个国外服务器然后搭建一个api通过这个api上传到GitHub,个人版本;当然如果你嫌烦,可以用吹逼图床

  • 在picGo下载插件
  • 然后登录使用GitHub登录吹逼图床,然后再次点击用户图标进行设置

  • 然后在主界面复制你的接口[注意不要泄露这个接口,不然他人就可以使用你的接口上传图片]

  • 回到picGo进行配置

接下来你就可以愉快的使用GitHub+jsdelivr当作图库啦

值得注意的是,理论上讲GitHub仓库大小是100g,但到了1g就会有人工审核,而使用jsdelivr加速的文件到达50m[也就是仓库大小]仓库里的资源就有可能失效,仓库理论上是无限建的,到了50m可以新建一个新的来达到白嫖的效果

此外 PicGo还有相册功能,可以对已上传的图片进行删除,修改链接等快捷操作,PicGo还可以生成不同格式的链接、支持批量上传、快捷键上传、自定义链接格式、上传前重命名等,更多功能自己去探索吧!

完成之后就可以畅快书写,上传直接快捷键完成,复制粘贴,再也不用手动去拖动图片上传了,更过功能尽情去体验吧!

· 阅读需 21 分钟
Niko

hexo部署

hexo new a #新建

hexo s --debug #本地部署

hexo g -d #github部署

Markdown 语法

Markdown 语法简明便捷,既弥补了传统纯文本缺少样式的不足,又降低了传统 Word、HTML 等样式文本的技术门槛,自 2004 年被 John Gruber 创造以来,得到一定范围的传播和使用。2012 年 Github 强势崛起,并官方推荐 Markdown 格式,这几年得以广泛传播,甚至衍生出了林林总总数十种版本 / 变体。不过,今天我只谈 Hexo 相关内容,Hexo 默认自带的 Markdown 渲染器为hexo-renderer-marked,本文就是对其支持语法的一个总结。

由于暂时用不上数学公式,本文 不包含 LaTeX 公式 相关语法。

分级标题

语法

# { 一级标题 }
## { 二级标题 }
### { 三级标题 }
#### { 四级标题 }
##### { 五级标题 }
###### { 六级标题 }

# 开头,以标题内容结尾,中间填充至少一个Space。标题共有 6 级。一级标题和二级标题也可以使用如下语法:

{ 一级标题 }
===
{ 二级标题 }
---

示例

# 中华人民共和国
## 湖北省
### 武汉市
#### 武昌区
##### 徐东街道
###### 群星城社区

效果

中华人民共和国

湖北省

武汉市

武昌区

徐东街道
群星城社区

层级列表

语法

* { 一级目录名称 }
* { 二级目录名称 }
* { 三级目录名称 }
* { 四级目录名称 }
* { 五级目录名称 }
...

层级列表每下一级的缩进都要比上一级多 2 个 Space 或 1 个Tab,且第一级前面不可超过 3 个空格。层级列表一般仅用一、二、三级列表,第一级的标识为实心圆点,第二级的标识为空心圆点,第三级的标识为实心方点。不过理论上可以有无数层级,但从第三级开始层级标识均为实心方点。

示例

* 文档
* 什么是 Hexo
* 安装
* 安装前提
* 安装 Git
* Git 注意事项
* 安装 Node.js
* 安装 Hexo
* 使用

效果

  • 文档
    • 什么是 Hexo
    • 安装
      • 安装前提
        • 安装 Git
          • Git 注意事项
        • 安装 Node.js
        • 安装 Hexo
    • 使用

斜体 / 粗体 / 删除线 / 高亮

语法

*{ 斜体内容 }*
**{ 粗体内容 }**
~~{ 删除内容 }~~
`{ 高亮内容 }`
<u>{ 高亮内容 }</u>

示例

他望车外看了看,说:*“我买几个橘子去。你就在此地,不要走动。”*
他望车外看了看,说:**“我买几个橘子去。你就在此地,不要走动。”**
他望车外看了看,说:~~“我买几个橘子去。你就在此地,不要走动。”~~
他望车外看了看,说:`“我买几个橘子去。你就在此地,不要走动。”`
他望车外看了看,说:<u>“我买几个橘子去。你就在此地,不要走动。”</u>

他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。” 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。” 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。” 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。” 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”

引用

语法

> { 引用内容 }
>> { 嵌套引用内容 }
>>> { 再次嵌套引用内容 }

示例

> 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”
>> 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”
>>> 他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”

效果

他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”

他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”

他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”

列表

无序列表

语法

+ { 列表 1 内容 }
+ { 列表 2 内容 }
+ { 列表 3 内容 }

*+- 开头,以列表内容结尾,中间填充至少一个Space。标识为实心圆点。

示例

BAT 指:
+ Baidu
+ Alibaba
+ Tencent

效果

BAT 指:

  • Baidu
  • Alibaba
  • Tencent

有序列表

语法

1. { 列表内容 1}
1. { 列表内容 2}
1. { 列表内容 3}

全部使用 1.,会自增。也可使用1.2.3. 这样手动指定序号。

示例

洗手步骤:
1. 用干净自来水(温水或冷水)润湿双手,关掉水龙头,涂抹肥皂。
1. 将您的手和肥皂揉搓在一起,让它起泡沫。趁着肥皂起沫时揉搓手背、手指间和指甲下。
1. 擦洗双手至少 20 秒。
* 需要定时吗? 大概是将“生日快乐”歌从头到尾哼唱两遍的时间。
* 时间不足 20 秒可以吗?建议 20 秒以上。
1. 顺着干净自来水洗净双手。
1. 用干净毛巾擦干双手或直接风干。

效果

洗手步骤:

  1. 用干净自来水(温水或冷水)润湿双手,关掉水龙头,涂抹肥皂。
  2. 将您的手和肥皂揉搓在一起,让它起泡沫。趁着肥皂起沫时揉搓手背、手指间和指甲下。
  3. 擦洗双手至少 20 秒。
  • 需要定时吗? 大概是将“生日快乐”歌从头到尾哼唱两遍的时间。
  • 时间不足 20 秒可以吗?建议 20 秒以上。
  1. 顺着干净自来水洗净双手。

  2. 用干净毛巾擦干双手或直接风干。

任务列表

语法

- [_] {(未完成)任务名称 }
- [x] {(已完成)任务名称 }

任务框需要配合有序或无序列表使用,故列入列表章节。中括号 [] 表复选框。若表示 未完成[] 之间必须有且仅有一个 Space,若表示 完成[] 之间输入一个字母 x。右中括号]任务名称 之间至少有一个Space

示例

- [ ] 跑步
- [ ] 骑车
- [ ] 吃饭
- [ ] 睡觉

效果

  • 跑步

  • 骑车

  • 吃饭

  • 睡觉

    ▲ 任务列表 示例截图

    图片 / 音频 / 视频

    语法

    ![{ 链接文本 }]({ 链接 } {title 内容 })

    静态图、动态图、视频和音频都是一样的引用方式,只是音频没写样式很丑。

    示例

    ![](006_tupianyinpinshipin_001.png)
    ![](006_tupianyinpinshipin_002.gif)

    效果 静态图 示例截图 ▲ 动态图 示例动图

    ▲ 动态图 示例动图

    超链接

    行内式

    语法

    [{ 链接文本 }]({ 链接 } {title 内容 })

    []里为链接文字。()里前者为链接地址,后者为链接的 title 属性(链接的 title 属性:鼠标悬停在链接上时浮现的悬浮框的内容),后者非必须。链接地址和链接的 title 属性之间需至少有一个Space

    示例

    [百度](http://www.baidu.com)[百度](http://www.baidu.com " 百度一下,你就知道 ")

    效果

    百度

    百度

自动连接

语法

<{ 链接或 Email}>

直接在 <> 之间输入链接或 Email。

示例

<http://www.baidu.com/><admin@baidu.com>

效果 http://www.baidu.com/

admin@baidu.com

锚点

网页中,锚点其实就是 页内超链接 ,也就是链接本文档内部的某些元素,实现当前页面中的跳转。比如我在本节的标题写下一个锚点,在目录中写下对应链接,点击链接就能跳过来。 语法

[{ 链接文字 }](#{index}) <div id="{index}">{ 标题 }</div>

跟超链接同理,只是链接地址改为锚点元素的 id 属性值。标题可省。 注意:div只是这里演示,任何 HTML 元素均可。

示例

[第一句](#41)[第二句](#42)[第三句](#43) <div id="41"></div> 轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。<div id="42"></div> 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。<div id="43"></div> 我轻轻的招手, 作别西天的云彩。

效果

▲ 锚点 示例动图

▲ 锚点 示例动图

表格

符号写法

语法

|{ 表头 1}|{ 表头 2}|{ 表头 3}|
|-|-|-|
|{ 内容 1-1}|{ 内容 1-2}|{ 内容 1-3}|
|{ 内容 2-1}|{ 内容 2-2}|{ 内容 2-3}|
|{ 内容 3-1}|{ 内容 3-2}|{ 内容 3-3}|

|控制分列,-控制分行,:控制对齐方式。 第一行为 表头行,使用竖线符将各表头隔开,此外最前和最后表头两侧分别有个竖线符将整体框起来。 注意:表格 首行的前一行 必须 留空 ,否则符号写法的表格无法生效。 第二行为 控制行,要求竖线符的数量和表头行一致,且每个竖线之间至少有一个中划线符。 第三行及以下为 数据行,要求竖线符的数量和表头行一致,每两个相邻的竖线符之间是表格数据。 表格默认左对齐。在第二行可以使用:(冒号)搭配中划线符主动控制对应列内容的对齐方式。两个竖线符之间为:

  • :-:表示左对齐

  • -:-::表示中对齐

  • -::表示右对齐

    注意:无论是否主动控制对齐方式,控制行的每一列都至少要有一个中划线符。

    示例

    | 名字 | 性别 | 年龄 | 部门 |
    |-|-|-:|-|
    | 张三 ||21| 产品 |
    | 李四 ||18| 开发 |
    | 王二 ||20| 销售 |

    效果

    名字性别年龄部门
    张三21产品
    李四18开发
    王二20销售

    ▲ 表格 - 符号写法 示例 注意:此处截图表格风格样式与 Hexo 默认格式不同,这取决于 Hexo 的主题。

    HTML 写法

    语法

    <table>
    <thead>
    <tr>
    <th>{ 表头 1}</th>
    <th>{ 表头 2}</th>
    <th>{ 表头 3}</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>{ 内容 1-1}</td>
    <td>{ 内容 1-2}</td>
    <td>{ 内容 1-3}</td>
    </tr>
    <tr>
    <td>{ 内容 2-1}</td>
    <td>{ 内容 2-2}</td>
    <td>{ 内容 2-3}</td>
    </tr>
    <tr>
    <td>{ 内容 3-1}</td>
    <td>{ 内容 3-2}</td>
    <td>{ 内容 3-3}</td>
    </tr>
    </tbody>
    </table>

    Markdown 中的表格还可以用 HTML 标签的形式来写。跟 符号写法 最大的区别主要是 HTML 写法 虽然无法控制整列的对齐方式,但可以单独控制每个单元格的对齐方式。控制对齐方式的方式是给需要控制元素添加align 标签,例:

  • <th align="middle">

  • <td align="left">

  • <td align="right">

    示例

    <table>
    <thead>
    <tr>
    <th> 名字 </th>
    <th> 性别 </th>
    <th> 年龄 </th>
    <th> 部门 </th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td> 张三 </td>
    <td></td>
    <td align="right">21</td>
    <td> 产品 </td>
    </tr>
    <tr>
    <td> 李四 </td>
    <td></td>
    <td align="right">18</td>
    <td> 开发 </td>
    </tr>
    <tr>
    <td> 王二 </td>
    <td></td>
    <td align="right">20</td>
    <td> 销售 </td>
    </tr>
    </tbody>
    </table>

    效果

    名字 性别 年龄 部门
    张三 21 产品
    李四 18 开发
    王二 20 销售

    ▲ 表格 - HTML 写法 示例 注意:此处截图表格风格样式与 Hexo 默认格式不同,这取决于 Hexo 的主题。

    注释

    语法

    { 注释内容 }

    反斜杠后不加空格紧跟注释内容即可注释。

示例

\## 我不再是标题

效果 ## 我不再是标题

▲ 表格 - HTML 写法 示例

分割线

语法

---___***

在一行起始使用 ***---___ 表示分割线。

示例

下面有条分割线  --- 
上下各有一条分割线___
上下各有一条分割线***

注意:由于 --- 还用于二级标题,因而在使用这种方式表分割线时,其前一行必须留空。

效果 下面有条分割线 ---

上下各有一条分割线___

上下各有一条分割线

▲ 分割线 示例

代码块

行内代码块

语法

`{ 代码部分 }`

使用 ``(重音符)框起来的部分为代码块。 重音符:半角状态下,**按住** Shift` 键,同时按下键盘字母区域的数字 1 的左侧相邻按键,输出符号即为重音符。 由于重音符是个特殊的控制字符,代码块内 原样输出 重音符(两个重音符中间输入重音符)无法直接实现,但可通过其它方式实现,分以下几种情况:

  • 如果两个重音符中间的内容除了包含重音符还 含有其它内容,则在最外层需要用两个连续重音符夹起来。

  • 如果两个重音符中间的内容

    只包含重音符

    ,没有其它内容,则分以下情况:

    • 如果两个重音符中间的重音符 只有一个,则除了用两个连续重音符夹起来以外,作为内容的这一个重音符两侧必须至少各有一个空格。

    • 如果两个重音符中间的重音符

      只有两个

      ,分两种情况:

      • 两个重音符 连续,我还没有找到办法原样输出这两个重音符。
      • 两个重音符 不连续(即两个重音符之间有空格),则将作为内容的两个重音符看做一个整体,这个整体的两侧必须至少各有一个空格。
    • 如果两个重音符中间的重音符有 两个以上,则除了用两个连续重音符夹起来以外,将作为内容的多个重音符看做一个整体,这个整体的两侧必须至少各有一个空格。

    示例

    今天我们来了解一下 `Java` 的语法规则。

    效果 今天我们来了解一下 Java 的语法规则。

    ▲ 行内代码块 示例

    多行代码块

    语法

    ''' java 如何在 Java 中声明变量
    int i = 1;
    '''''' {type} {explain}int i = 1;'''

    注意:由于多行代码块的特殊性,无法在代码块内输入三个连续的重音符,这里用 单引号代表重音符 。 在代码的前后各起一行,只输入连续的三个重音符即可表示代码块。在第一行的三个重音符后空一格可指定 代码语言 (可选),不区分大小写。再空一格可指定 代码块标题(可选),可用单引号 / 双引号括起来,不括也行。

    示例

    ''' java 如何在 Java 中声明变量
    int i = 1;
    '''

    效果

    java 如何在 Java 中声明变量
    int i = 1;

▲ 多行代码块 示例截图

特殊转义字符

在编写 Markdown 时,想要原样输出一些控制字符就需要先对其 转义,通常的做法是在待转义字符前添加反斜杠符``,但有时这种方法会失效(具体哪些清空未有总结),稳定原样输出的方式是直接使用特殊字符的编码,对应如下:

常用 HTML 特殊字符编码对照表

特殊符号命名实体十进制编码中文名称英文名称
--减号Minus sign
!!惊叹号Exclamation mark
"""双引号Quotation mark
##数字标志Number sign
$$美元标志Dollar sign
%%百分号Percent sign
&&&地址符Ampersand
''单引号Apostrophe
((左小括号Left parenthesis
))右小括号Right parenthesis
**星号Asterisk
++加号Plus sign
//斜杠Slash
<<<小于号Less than
==等号Equals sign
>>>大于号Greater than
??问号Question mark
@@at 符Commercial at
[[左中括号Left square bracket
\ 反斜杠Reverse solidus (backslash)
]]右中括号Right square bracket
{{左大括号Left curly brace
||竖线Vertical bar
}}右大括号Right curly brace
标签:

· 阅读需 5 分钟
Niko

不想自己动手的话,文末也有搭建好的,可以直接去白嫖!


基于开源项目gh-proxy地址:-->点击访问<--

cloudflare地址:-->点击访问<--

首先访问cloudflare注册一个你自己的账户

然后点击workers

img

之后弹出来这个界面,你需要在输入框中输入你自己的workers的名字

请注意!一定要方便记忆,不要乱输,这个会出现在你的网址中!!!

请注意!一定要方便记忆,不要乱输,这个会出现在你的网址中!!!

请注意!一定要方便记忆,不要乱输,这个会出现在你的网址中!!!

img

输入好后点set up

然后选择订阅模式,白嫖怪直接free!

免费版本每天的访问次数是10w次,应该是远远够用的!

img

然后要验证邮箱!

img

去你邮箱完成验证

img

验证完成后刷新,点击创建

img

然后按下图填写,之后点创建

img

然后点击快速编辑

img

将下面的代码复制 --->点击查看源码<--

'use strict'
/**
* static files (404.html, sw.js, conf.js)
*/
const ASSET_URL = 'https://hunshcn.github.io/gh-proxy/'
// 前缀,如果自定义路由为example.com/gh/*,将PREFIX改为 '/gh/',注意,少一个杠都会错!
const PREFIX = '/'
// git使用cnpmjs镜像、分支文件使用jsDelivr镜像的开关,0为关闭,默认开启
const Config = {
jsdelivr: 1,
cnpmjs: 1
}
/** @type {RequestInit} */
const PREFLIGHT_INIT = {
status: 204,
headers: new Headers({
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
'access-control-max-age': '1728000',
}),
}
const exp1 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive)\/.*$/i
const exp2 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob|raw)\/.*$/i
const exp3 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:info|git-).*$/i
const exp4 = /^(?:https?:\/\/)?raw\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+?\/.+$/i
const exp5 = /^(?:https?:\/\/)?gist\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+$/i
const exp6 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/tags.*$/i
/**
* @param {any} body
* @param {number} status
* @param {Object<string, string>} headers
*/
function makeRes(body, status = 200, headers = {}) {
headers['access-control-allow-origin'] = '*'
return new Response(body, {status, headers})
}
/**
* @param {string} urlStr
*/
function newUrl(urlStr) {
try {
return new URL(urlStr)
} catch (err) {
return null
}
}
addEventListener('fetch', e => {
const ret = fetchHandler(e)
.catch(err => makeRes('cfworker error:\n' + err.stack, 502))
e.respondWith(ret)
})
function checkUrl(u) {
for (let i of [exp1, exp2, exp3, exp4, exp5, exp6 ]) {
if (u.search(i) === 0) {
return true
}
}
return false
}
/**
* @param {FetchEvent} e
*/
async function fetchHandler(e) {
const req = e.request
const urlStr = req.url
const urlObj = new URL(urlStr)
let path = urlObj.searchParams.get('q')
if (path) {
return Response.redirect('https://' + urlObj.host + PREFIX + path, 301)
}
// cfworker 会把路径中的 `//` 合并成 `/`
path = urlObj.href.substr(urlObj.origin.length + PREFIX.length).replace(/^https?:\/+/, 'https://')
if (path.search(exp1) === 0 || path.search(exp5) === 0 || path.search(exp6) === 0 || !Config.cnpmjs && (path.search(exp3) === 0 || path.search(exp4) === 0)) {
return httpHandler(req, path)
} else if (path.search(exp2) === 0) {
if (Config.jsdelivr) {
const newUrl = path.replace('/blob/', '@').replace(/^(?:https?:\/\/)?github\.com/, 'https://cdn.jsdelivr.net/gh')
return Response.redirect(newUrl, 302)
} else {
path = path.replace('/blob/', '/raw/')
return httpHandler(req, path)
}
} else if (path.search(exp3) === 0) {
const newUrl = path.replace(/^(?:https?:\/\/)?github\.com/, 'https://github.com.cnpmjs.org')
return Response.redirect(newUrl, 302)
} else if (path.search(exp4) === 0) {
const newUrl = path.replace(/(?<=com\/.+?\/.+?)\/(.+?\/)/, '@$1').replace(/^(?:https?:\/\/)?raw\.(?:githubusercontent|github)\.com/, 'https://cdn.jsdelivr.net/gh')
return Response.redirect(newUrl, 302)
} else {
return fetch(ASSET_URL + path)
}
}
/**
* @param {Request} req
* @param {string} pathname
*/
function httpHandler(req, pathname) {
const reqHdrRaw = req.headers
// preflight
if (req.method === 'OPTIONS' &&
reqHdrRaw.has('access-control-request-headers')
) {
return new Response(null, PREFLIGHT_INIT)
}
const reqHdrNew = new Headers(reqHdrRaw)
let urlStr = pathname
if (urlStr.startsWith('github')) {
urlStr = 'https://' + urlStr
}
const urlObj = newUrl(urlStr)
/** @type {RequestInit} */
const reqInit = {
method: req.method,
headers: reqHdrNew,
redirect: 'manual',
body: req.body
}
return proxy(urlObj, reqInit)
}
/**
*
* @param {URL} urlObj
* @param {RequestInit} reqInit
*/
async function proxy(urlObj, reqInit) {
const res = await fetch(urlObj.href, reqInit)
const resHdrOld = res.headers
const resHdrNew = new Headers(resHdrOld)
const status = res.status
if (resHdrNew.has('location')) {
let _location = resHdrNew.get('location')
if (checkUrl(_location))
resHdrNew.set('location', PREFIX + _location)
else {
reqInit.redirect = 'follow'
return proxy(newUrl(_location), reqInit)
}
}
resHdrNew.set('access-control-expose-headers', '*')
resHdrNew.set('access-control-allow-origin', '*')
resHdrNew.delete('content-security-policy')
resHdrNew.delete('content-security-policy-report-only')
resHdrNew.delete('clear-site-data')
return new Response(res.body, {
status,
headers: resHdrNew,
})
}

替换掉原来所有代码,先点下面的保存,等待保存成功后,再点发送

img

显示如下就成功了

img

到此教程结束,喜欢的点个赞再走吧!

标签: