普通视图

发现新文章,点击刷新页面。
昨天以前首页
  • ✇新锐博客
  • 飞牛OS利用FRP进行远程访问莫忘
    前言 NAS外网访问是一个很让人头疼的问题,解决方法有两个,一个是运营商那里申请公网IP,另一个则是内网穿透 但是一般的内网穿透要么就需要设置路由器,对于小白来说很困难,另一个则是需要绑定域名很麻烦。 所以今天教大家如何使用FRP来访问自己的飞牛OS 教程 1.首先拥有一台能够外网访问的服务器,这里可以使用之前教大家领取的华为云服务器 2.安装FRP服务端,找到GITHUB中的地址下载对应的程序包,CD到文件夹然后输入如下命令 chmod +x ./frps 3.再输入如下代码 nohup ./frps -c ./frps.toml > frps.log 2>&1 & 这样程序就可以常驻在后台,哪怕关闭终端也可以运行了 4.到飞牛OS中的应用中心下载FRP客户端 5.打开配置文件,并且修改serverAddr 的ip为你服务器的ip 6.下方的如下代码块 [[proxies]] name = "text-tcp" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000
     

飞牛OS利用FRP进行远程访问

作者 莫忘
2025年1月1日 14:35

前言

NAS外网访问是一个很让人头疼的问题,解决方法有两个,一个是运营商那里申请公网IP,另一个则是内网穿透

但是一般的内网穿透要么就需要设置路由器,对于小白来说很困难,另一个则是需要绑定域名很麻烦。

所以今天教大家如何使用FRP来访问自己的飞牛OS

教程

1.首先拥有一台能够外网访问的服务器,这里可以使用之前教大家领取的华为云服务器

2.安装FRP服务端,找到GITHUB中的地址下载对应的程序包,CD到文件夹然后输入如下命令

chmod +x ./frps

3.再输入如下代码

nohup ./frps -c ./frps.toml > frps.log 2>&1 &

这样程序就可以常驻在后台,哪怕关闭终端也可以运行了

4.到飞牛OS中的应用中心下载FRP客户端

5.打开配置文件,并且修改serverAddr 的ip为你服务器的ip

6.下方的如下代码块

[[proxies]]
name = "text-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000     

如需增加其他端口的映射,就按照这样来添加,实测proxies不可更改否则会启动失败

name:服务名(随意填写),type:传输类型(一般为tcp),localip:无需修改,localport:需要映射的端口,remoteport:需要访问的远程端口

7.启动客户端,然后服务器IP+端口即可。

  • ✇新锐博客
  • 解决CMD控制台CD无响应莫忘
    前言 因为要构建一个项目,所以要用到cmd但是一直CD没反应 教程 首先要CD到需要CD的目录所在盘符,例如 cd d: 如果不跳转到D盘,就再次输入以下代码 d: 最后再CD到你需要CD的目录就行了
     
  • ✇新锐博客
  • 给自己网站添加多语言功能莫忘
    前言 群里有朋友需要网站适配多语言,但其实一个引用就可以搞定这个问题 开源地址 gitee:https://gitee.com/mail_osc/translate 教程 在需要的地方添加如下代码 <!-- 增加语言选择的下拉框 --> <select id="language-select" onchange="changeLanguage()"> <option value="english">English</option> <option value="chinese_simplified">简体中文</option> <option value="chinese_traditional">繁體中文</option> </select> <!-- 引入多语言切换的js --> <script src="https://cdn.staticfile.net/translate.js/3.2.1/translate.js">&
     

给自己网站添加多语言功能

作者 莫忘
2024年11月28日 23:47

前言

群里有朋友需要网站适配多语言,但其实一个引用就可以搞定这个问题

开源地址

gitee:https://gitee.com/mail_osc/translate

教程

在需要的地方添加如下代码

<!-- 增加语言选择的下拉框 -->
<select id="language-select" onchange="changeLanguage()">
    <option value="english">English</option>
    <option value="chinese_simplified">简体中文</option>
    <option value="chinese_traditional">繁體中文</option>
</select>

<!-- 引入多语言切换的js -->
<script src="https://cdn.staticfile.net/translate.js/3.2.1/translate.js"></script>
<script>
    translate.selectLanguageTag.show = false; // 不出现的select的选择语言
    translate.service.use('client.edge'); // 设置机器翻译服务通道

    function changeLanguage() {
        const selectedLanguage = document.getElementById('language-select').value;
        translate.changeLanguage(selectedLanguage);
        translate.execute();
        localStorage.setItem('selectedLanguage', selectedLanguage); // 保存选择的语言
    }

    // 页面加载时设置选择框的值和语言
    document.addEventListener('DOMContentLoaded', function() {
        const savedLanguage = localStorage.getItem('selectedLanguage') || 'english'; // 默认选择英文
        document.getElementById('language-select').value = savedLanguage; // 设置选择框的值
        translate.changeLanguage(savedLanguage); // 设置翻译语言
        translate.execute(); // 执行翻译
    });
</script>

结语

两行代码就解决了网站需要多语言的问题

  • ✇新锐博客
  • 部分linux服务器硬盘未挂载解决方法莫忘
    前言 类似雨云等服务器可扩容云盘,但是重装系统的时候云盘会挂载失败,导致根目录就默认大小。 教程 1.首先用finalshell等SSH连接工具,连接云服务器 2.终端输入df -h / 查看根目录的大小,如果大小不是你扩容云盘后的大小按以下步骤做 3.终端输入fdisk -l 可以查看所有硬盘的容量大小 4.终端输入fdisk /dev/sda ,其中/dev/sda改成没有挂载硬盘的名字 5.输入d再输入1删除当前分区,再输入n创建新分区,再输入p创建主分区 6.默认起始扇区为2048,结束扇区为默认即可 7.再输入p查看新分区大小,正常情况下就没问题了 8.输入w保存分区信息,再输入reboot 重启云服务器 9.重启完成后,再输入resize2fs /dev/sda1 即可完成挂载 10.最后输入df -h / 检查根目录的大小
     

部分linux服务器硬盘未挂载解决方法

作者 莫忘
2024年11月27日 13:01

前言

类似雨云等服务器可扩容云盘,但是重装系统的时候云盘会挂载失败,导致根目录就默认大小。

教程

1.首先用finalshell等SSH连接工具,连接云服务器

2.终端输入df -h / 查看根目录的大小,如果大小不是你扩容云盘后的大小按以下步骤做

3.终端输入fdisk -l 可以查看所有硬盘的容量大小

4.终端输入fdisk /dev/sda ,其中/dev/sda改成没有挂载硬盘的名字

5.输入d再输入1删除当前分区,再输入n创建新分区,再输入p创建主分区

6.默认起始扇区为2048,结束扇区为默认即可

7.再输入p查看新分区大小,正常情况下就没问题了

8.输入w保存分区信息,再输入reboot 重启云服务器

9.重启完成后,再输入resize2fs /dev/sda1 即可完成挂载

10.最后输入df -h / 检查根目录的大小

  • ✇新锐博客
  • linux服务器打包编译node.js项目莫忘
    前言 有个项目是node.js的,但是作者写的时候没有直接写适合PHP环境的版本,只适合部署在vercel中 教程 因为centos7.9版本太旧,所以本次教程基于ubuntu 1.首先大部分服务器是没有npm的需要安装 sudo apt install npm 2.安装pnpm npm install -g pnpm 3.cd到项目目录中 cd /www/wwwroot/xxxx/ 4.开始编译项目 pnpm install pnpm build
     

linux服务器打包编译node.js项目

作者 莫忘
2024年11月6日 03:13

前言

有个项目是node.js的,但是作者写的时候没有直接写适合PHP环境的版本,只适合部署在vercel中

教程

因为centos7.9版本太旧,所以本次教程基于ubuntu

1.首先大部分服务器是没有npm的需要安装

sudo apt install npm

2.安装pnpm

npm install -g pnpm

3.cd到项目目录中

cd  /www/wwwroot/xxxx/

4.开始编译项目

pnpm install
pnpm build
  • ✇新锐博客
  • 国内linux服务器安装npm莫忘
    前言 npm服务使用github上的脚本安装很慢 教程 方法一:使用包管理器 对于 Debian/Ubuntu 系统,可以使用以下命令: sudo apt update sudo apt install -y nodejs npm 对于 CentOS/RHEL 系统,可以使用: sudo yum install -y epel-release sudo yum install -y nodejs npm 方法 2:使用 NodeSource 仓库 NodeSource 提供了最新版本的 Node.js,可以使用以下步骤安装: curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs  对于 CentOS/RHEL: curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - sudo yum install -y node 最后确认安装 node -v npm -v
     

国内linux服务器安装npm

作者 莫忘
2024年11月6日 01:39

前言

npm服务使用github上的脚本安装很慢

教程

方法一:使用包管理器

对于 Debian/Ubuntu 系统,可以使用以下命令:

sudo apt update 
sudo apt install -y nodejs npm

对于 CentOS/RHEL 系统,可以使用:

sudo yum install -y epel-release 
sudo yum install -y nodejs npm

方法 2:使用 NodeSource 仓库

NodeSource 提供了最新版本的 Node.js,可以使用以下步骤安装:

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs

 对于 CentOS/RHEL:

curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - 
sudo yum install -y node

最后确认安装

node -v 
npm -v
  • ✇新锐博客
  • python项目关闭终端照样运行的方法莫忘
    前言 因为想使用一个python项目,所以经历了以下事件并且成功部署好了项目 过程 首先项目就两件事一个是安装环境,另一个就是启动python脚本。 但是呢当我用pip install -r requirements.txt 安装环境的时候,提示pip不存在,突然想到之前遇到过这种情况是版本不对,于是将pip改为pip3就行了。 安装好后就是需要启动python脚本了,于是我就用finalshell连接了服务器,用CD到目录,然后同样的将python改为python3执行了python脚本。 虽然脚本运行起来了,但是我发现只要我关闭了终端,任务好像就停止了。 于是我就百度如何关闭终端不停止任务,最后发现了一个方法。 使用nohup python3 your_script.py & 这个命令就好了。 这样哪怕关闭终端也可以运行了。
     

python项目关闭终端照样运行的方法

作者 莫忘
2024年10月17日 02:29

前言

因为想使用一个python项目,所以经历了以下事件并且成功部署好了项目

过程

首先项目就两件事一个是安装环境,另一个就是启动python脚本。

但是呢当我用pip install -r requirements.txt 安装环境的时候,提示pip不存在,突然想到之前遇到过这种情况是版本不对,于是将pip改为pip3就行了。

安装好后就是需要启动python脚本了,于是我就用finalshell连接了服务器,用CD到目录,然后同样的将python改为python3执行了python脚本。

虽然脚本运行起来了,但是我发现只要我关闭了终端,任务好像就停止了。

于是我就百度如何关闭终端不停止任务,最后发现了一个方法。

使用nohup python3 your_script.py & 这个命令就好了。

这样哪怕关闭终端也可以运行了。

  • ✇新锐博客
  • ThinkPHP项目提示未定义变量的解决方法莫忘
    前言 在我们部署ThinkPHP项目的时候会遇到提示未定义变量:xxxxx。 教程 1.使用宝塔的搜索功能搜索这个变量,这次提示的事cdnpublic,搜索这个变量名称就行 2.找到以后根据它的内容更改一下地址就行。(一定要根据它的内容更改,而不是瞎改) 3.重新运行安装程序即可。 结语 此方法对于新手来说不是很友好,但是也未尝不是一种方法。
     

ThinkPHP项目提示未定义变量的解决方法

作者 莫忘
2024年9月7日 13:46

前言

在我们部署ThinkPHP项目的时候会遇到提示未定义变量:xxxxx。

教程

1.使用宝塔的搜索功能搜索这个变量,这次提示的事cdnpublic,搜索这个变量名称就行

图片[1]-新锐博客

2.找到以后根据它的内容更改一下地址就行。(一定要根据它的内容更改,而不是瞎改)

图片[2]-新锐博客

3.重新运行安装程序即可。

结语

此方法对于新手来说不是很友好,但是也未尝不是一种方法。

  • ✇新锐博客
  • 解决linux因DNS导致无法访问其他网站莫忘
    前言 在一个服务器内安装了maxkb项目,但是当我添加语言大模型的时候各种报错。 比如在安装星火大模型的时候提示校验失败,请检查参数是否正确: [Errno -3] Temporary failure in name resolutio 接下来就告诉大家怎么解决这个问题 教程 这个问题是因为DNS而出现的。 1.首先找到/etc/resolv.conf 2.将nameserver ***** 替换成如下代码 nameserver 10.8.255.1 nameserver 10.8.255.2 nameserver 114.114.114.114 3.重启网络服务:service network restart 4.重启服务器 结语 很多时候访问不了外部链接就是因为DNS的原因,所以可以尝试更换DNS来解决这类问题
     

解决linux因DNS导致无法访问其他网站

作者 莫忘
2024年9月1日 11:42

前言

在一个服务器内安装了maxkb项目,但是当我添加语言大模型的时候各种报错。

比如在安装星火大模型的时候提示校验失败,请检查参数是否正确: [Errno -3] Temporary failure in name resolutio

接下来就告诉大家怎么解决这个问题

教程

这个问题是因为DNS而出现的。

1.首先找到/etc/resolv.conf

2.将nameserver ***** 替换成如下代码

nameserver 10.8.255.1
nameserver 10.8.255.2
nameserver 114.114.114.114

3.重启网络服务:service network restart

4.重启服务器

结语

很多时候访问不了外部链接就是因为DNS的原因,所以可以尝试更换DNS来解决这类问题

  • ✇新锐博客
  • Nginx和CDN设置请求头防止被扫源莫忘
    前言 虽然套用了CDN,并且设置了禁止Censys扫描源站IP,但是还会有不少扫描器一直扫描网站的源站IP,为了防止这一现象,我们可以使用Nginx和Cdn设置请求头。 教程 因为本人使用的是火毅盾CDN,所以用火毅盾来演示。 1.首先找到站点配置中的回源Header 2.设置Name值为lol,Value值为ez,操作为增加 3.宝塔面板中找到Nginx配置的location /  中,添加如下内容 if ($http_lol != "ez") { return 404; } 结语 这样设置就能有效防止被扫描,赶快设置起来吧。
     

Nginx和CDN设置请求头防止被扫源

作者 莫忘
2024年8月14日 12:48

前言

虽然套用了CDN,并且设置了禁止Censys扫描源站IP,但是还会有不少扫描器一直扫描网站的源站IP,为了防止这一现象,我们可以使用Nginx和Cdn设置请求头。

教程

因为本人使用的是火毅盾CDN,所以用火毅盾来演示。

1.首先找到站点配置中的回源Header

图片[1]-新锐博客

2.设置Name值为lol,Value值为ez,操作为增加

3.宝塔面板中找到Nginx配置的location /  中,添加如下内容

        if ($http_lol != "ez") {
           return 404;       
}

结语

这样设置就能有效防止被扫描,赶快设置起来吧。

  • ✇新锐博客
  • 彩虹DNS - 实现一个平台管理多平台域名解析莫忘
    前言 因为域名价格的问题,有些人和我一样在华为云和阿里云都有域名,那如何管理它们呢。 简介 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有: 阿里云 腾讯云 华为云 西部数码 DNSLA CloudFlare 功能特性 多用户管理,可为每个用户可分配不同的域名解析权限 提供API接口,可获取域名单独的登录链接,方便各种IDC系统对接 容灾切换功能,支持ping、tcp、http(s)检测协议并自动暂停/修改域名解析,并支持邮件、微信公众号通知 CF优选IP功能,支持获取最新的Cloudflare优选IP,并自动更新到解析记录 部署方法 从Release页面下载安装包 运行环境要求PHP7.4+,MySQL5.6+ 设置网站运行目录为public 设置伪静态为ThinkPHP 如果是下载的Source code包,还需Composer安装依赖(Release页面下载的安装包不需要) composer install --no-dev 访问网站,会自动跳转到安装页面,根据提示安装完成 访问首页登录控制面板 伪静态规则 Ngi
     

彩虹DNS - 实现一个平台管理多平台域名解析

作者 莫忘
2024年8月13日 13:15

前言

因为域名价格的问题,有些人和我一样在华为云和阿里云都有域名,那如何管理它们呢。

简介

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:

  • 阿里云
  • 腾讯云
  • 华为云
  • 西部数码
  • DNSLA
  • CloudFlare

功能特性

  • 多用户管理,可为每个用户可分配不同的域名解析权限
  • 提供API接口,可获取域名单独的登录链接,方便各种IDC系统对接
  • 容灾切换功能,支持ping、tcp、http(s)检测协议并自动暂停/修改域名解析,并支持邮件、微信公众号通知
  • CF优选IP功能,支持获取最新的Cloudflare优选IP,并自动更新到解析记录

部署方法

Release页面下载安装包

运行环境要求PHP7.4+,MySQL5.6+

设置网站运行目录为public

设置伪静态为ThinkPHP

如果是下载的Source code包,还需Composer安装依赖(Release页面下载的安装包不需要)

composer install --no-dev

访问网站,会自动跳转到安装页面,根据提示安装完成

访问首页登录控制面板

伪静态规则

Nginx

location / {
	if (!-e $request_filename){
		rewrite  ^(.*)$  /index.php?s=$1  last;   break;
	}
}

Apache

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule

docker部署

首先需要安装Docker,然后执行以下命令拉取镜像并启动(启动后监听8081端口):

docker run --name dnsmgr -dit -p 8081:80 -v /var/dnsmgr:/app/www netcccyun/dnsmgr

访问并安装好后如果容灾切换未自动启动,重启容器即可:

docker restart dnsmgr
  • ✇新锐博客
  • Ubuntu系统启用root用户并配置允许root用户ssh登录莫忘
    前言 我目前有两台服务器,一台是优刻得的服务器,一台是阿里云的。两台同样安装了ubuntu系统,但是阿里云给的是root用户,优刻得给的却是ubuntu 所以为了方便命令的使用,我想把优刻得的用户从ubuntu改成root 教程 1.首先通过ssh的默认用户ubuntu连接到服务器。 2.命令输入:sudo passwd root ,通过此命令修改root的密码 3.使用sudo su 命令切换到root用户 4.找到/etc/ssh/sshd_config  文件,打开并查看第35行左右,有#PermitRootLogin prohibit-password 这样的一行 5.在这一行下方添加一行为PermitRootLogin yes 6.最后重启ssh服务:systemctl restart sshd 7.将如finalshell工具的用户名改为root,密码为第二步修改的密码即可 结语 目前centos7正式停止官方维护了,ubuntu成为了主力系统之一,为防止每次运行命令都需要输入sudo,修改默认用户就可以解决这一问题。
     

Ubuntu系统启用root用户并配置允许root用户ssh登录

作者 莫忘
2024年7月23日 09:23

前言

我目前有两台服务器,一台是优刻得的服务器,一台是阿里云的。两台同样安装了ubuntu系统,但是阿里云给的是root用户,优刻得给的却是ubuntu

所以为了方便命令的使用,我想把优刻得的用户从ubuntu改成root

教程

1.首先通过ssh的默认用户ubuntu连接到服务器。

2.命令输入:sudo passwd root ,通过此命令修改root的密码

3.使用sudo su 命令切换到root用户

4.找到/etc/ssh/sshd_config  文件,打开并查看第35行左右,有#PermitRootLogin prohibit-password 这样的一行

5.在这一行下方添加一行为PermitRootLogin yes

图片[1]-新锐博客

6.最后重启ssh服务:systemctl restart sshd

7.将如finalshell工具的用户名改为root,密码为第二步修改的密码即可

结语

目前centos7正式停止官方维护了,ubuntu成为了主力系统之一,为防止每次运行命令都需要输入sudo,修改默认用户就可以解决这一问题。

  • ✇新锐博客
  • 哪吒探针的一些注意事项莫忘
    前言 闲来无事,自从备案后还没搭建过哪吒探针呢,所以这次想好好弄一下,但是遇到各种麻烦。 注意事项 1.国内服务器可以按照解决哪吒监控Windows客户端一键安装不了这篇文章进行操作。 2.填写未接入CDN的面板服务器域名/IP的时候不要加http/s和端口号 3.如果Windows服务端提示以下代码,可以将C盘下的nezha文件夹删除 Init system is: windows-service Failed to install Nezha Agent: service nezha-agent already exists 4.如果还是不行,说明已经将nezha添加到系统服务中了,就需要打开cmd窗口输入sc delete nezha-agent
     

哪吒探针的一些注意事项

作者 莫忘
2024年7月18日 13:17

前言

闲来无事,自从备案后还没搭建过哪吒探针呢,所以这次想好好弄一下,但是遇到各种麻烦。

注意事项

1.国内服务器可以按照解决哪吒监控Windows客户端一键安装不了这篇文章进行操作。

2.填写未接入CDN的面板服务器域名/IP的时候不要加http/s和端口号

3.如果Windows服务端提示以下代码,可以将C盘下的nezha文件夹删除

Init system is: windows-service
Failed to install Nezha Agent: service nezha-agent already exists

4.如果还是不行,说明已经将nezha添加到系统服务中了,就需要打开cmd窗口输入sc delete nezha-agent

  • ✇新锐博客
  • 使用Cloudflare搭建docker镜像站莫忘
    前言 之前介绍的docker镜像站都是别人的不是自己的,于是就可以用cloudflare搭建属于自己的docker镜像站。 教程 1.首先要注册一个Cloudflare账号。 2.Cloudflare账号下域名的一级域名,不会的自行百度如何修改DNS记录以便托管到cloudflare。 3.注意 Worker 每天每免费账号有次数限制,为10万次。每分钟为1000次。 4.本教程来源于Github开源项目cf-workers-docker 方法一 1.登录cloudflare官网,选择workers和pages,创建workers 2.编辑worker.js,将如下代码放到其中并且在右上角选择部署。 // _worker.js // Docker镜像仓库主机地址 let hub_host = 'registry-1.docker.io' // Docker认证服务器地址 const auth_url = 'https://auth.docker.io' // 自定义的工作服务器地址 let workers_url = 'https://你的域名' // 根据主机名选择对应的上游地址
     

使用Cloudflare搭建docker镜像站

作者 莫忘
2024年6月21日 01:33

前言

之前介绍的docker镜像站都是别人的不是自己的,于是就可以用cloudflare搭建属于自己的docker镜像站。

教程

1.首先要注册一个Cloudflare账号。

2.Cloudflare账号下域名的一级域名,不会的自行百度如何修改DNS记录以便托管到cloudflare。

3.注意 Worker 每天每免费账号有次数限制,为10万次。每分钟为1000次。

4.本教程来源于Github开源项目cf-workers-docker

方法一

1.登录cloudflare官网,选择workers和pages,创建workers

2.编辑worker.js,将如下代码放到其中并且在右上角选择部署。

// _worker.js

// Docker镜像仓库主机地址
let hub_host = 'registry-1.docker.io'
// Docker认证服务器地址
const auth_url = 'https://auth.docker.io'
// 自定义的工作服务器地址
let workers_url = 'https://你的域名'

// 根据主机名选择对应的上游地址
function routeByHosts(host) {
		// 定义路由表
	const routes = {
		// 生产环境
		"quay": "quay.io",
		"gcr": "gcr.io",
		"k8s-gcr": "k8s.gcr.io",
		"k8s": "registry.k8s.io",
		"ghcr": "ghcr.io",
		"cloudsmith": "docker.cloudsmith.io",
		
		// 测试环境
		"test": "registry-1.docker.io",
	};

	if (host in routes) return [ routes[host], false ];
	else return [ hub_host, true ];
}

/** @type {RequestInit} */
const PREFLIGHT_INIT = {
	// 预检请求配置
	headers: new Headers({
		'access-control-allow-origin': '*', // 允许所有来源
		'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS', // 允许的HTTP方法
		'access-control-max-age': '1728000', // 预检请求的缓存时间
	}),
}

/**
 * 构造响应
 * @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 }) // 返回新构造的响应
}

/**
 * 构造新的URL对象
 * @param {string} urlStr URL字符串
 */
function newUrl(urlStr) {
	try {
		return new URL(urlStr) // 尝试构造新的URL对象
	} catch (err) {
		return null // 构造失败返回null
	}
}

function isUUID(uuid) {
	// 定义一个正则表达式来匹配 UUID 格式
	const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
	
	// 使用正则表达式测试 UUID 字符串
	return uuidRegex.test(uuid);
}

async function nginx() {
	const text = `
	<!DOCTYPE html>
	<html>
	<head>
	<title>Welcome to nginx!</title>
	<style>
		body {
			width: 35em;
			margin: 0 auto;
			font-family: Tahoma, Verdana, Arial, sans-serif;
		}
	</style>
	</head>
	<body>
	<h1>Welcome to nginx!</h1>
	<p>If you see this page, the nginx web server is successfully installed and
	working. Further configuration is required.</p>
	
	<p>For online documentation and support please refer to
	<a href="https://nginx.org/">nginx.org</a>.<br/>
	Commercial support is available at
	<a href="https://nginx.com/">nginx.com</a>.</p>
	
	<p><em>Thank you for using nginx.</em></p>
	</body>
	</html>
	`
	return text ;
}

export default {
	async fetch(request, env, ctx) {
		const getReqHeader = (key) => request.headers.get(key); // 获取请求头

		let url = new URL(request.url); // 解析请求URL
		workers_url = `https://${url.hostname}`;
		const pathname = url.pathname;
		const hostname = url.searchParams.get('hubhost') || url.hostname; 
		const hostTop = hostname.split('.')[0];// 获取主机名的第一部分
		const checkHost = routeByHosts(hostTop);
		hub_host = checkHost[0]; // 获取上游地址
		const fakePage = checkHost[1];
		console.log(`域名头部: ${hostTop}n反代地址: ${hub_host}n伪装首页: ${fakePage}`);
		const isUuid = isUUID(pathname.split('/')[1].split('/')[0]);
		
		const conditions = [
			isUuid,
			pathname.includes('/_'),
			pathname.includes('/r'),
			pathname.includes('/v2/user'),
			pathname.includes('/v2/orgs'),
			pathname.includes('/v2/_catalog'),
			pathname.includes('/v2/categories'),
			pathname.includes('/v2/feature-flags'),
			pathname.includes('search'),
			pathname.includes('source'),
			pathname === '/',
			pathname === '/favicon.ico',
			pathname === '/auth/profile',
		];

		if (conditions.some(condition => condition) && (fakePage === true || hostTop == 'docker')) {
			if (env.URL302){
				return Response.redirect(env.URL302, 302);
			} else if (env.URL){
				if (env.URL.toLowerCase() == 'nginx'){
					//首页改成一个nginx伪装页
					return new Response(await nginx(), {
						headers: {
							'Content-Type': 'text/html; charset=UTF-8',
						},
					});
				} else return fetch(new Request(env.URL, request));
			}
			
			const newUrl = new URL("https://registry.hub.docker.com" + pathname + url.search);

			// 复制原始请求的标头
			const headers = new Headers(request.headers);

			// 确保 Host 头部被替换为 hub.docker.com
			headers.set('Host', 'registry.hub.docker.com');

			const newRequest = new Request(newUrl, {
					method: request.method,
					headers: headers,
					body: request.method !== 'GET' && request.method !== 'HEAD' ? await request.blob() : null,
					redirect: 'follow'
			});

			return fetch(newRequest);
		}

		// 修改包含 %2F 和 %3A 的请求
		if (!/%2F/.test(url.search) && /%3A/.test(url.toString())) {
			let modifiedUrl = url.toString().replace(/%3A(?=.*?&)/, '%3Alibrary%2F');
			url = new URL(modifiedUrl);
			console.log(`handle_url: ${url}`)
		}

		// 处理token请求
		if (url.pathname.includes('/token')) {
			let token_parameter = {
				headers: {
					'Host': 'auth.docker.io',
					'User-Agent': getReqHeader("User-Agent"),
					'Accept': getReqHeader("Accept"),
					'Accept-Language': getReqHeader("Accept-Language"),
					'Accept-Encoding': getReqHeader("Accept-Encoding"),
					'Connection': 'keep-alive',
					'Cache-Control': 'max-age=0'
				}
			};
			let token_url = auth_url + url.pathname + url.search
			return fetch(new Request(token_url, request), token_parameter)
		}

		// 修改 /v2/ 请求路径
		if (/^/v2/[^/]+/[^/]+/[^/]+$/.test(url.pathname) && !/^/v2/library/.test(url.pathname)) {
			url.pathname = url.pathname.replace(//v2//, '/v2/library/');
			console.log(`modified_url: ${url.pathname}`)
		}

		// 更改请求的主机名
		url.hostname = hub_host;

		// 构造请求参数
		let parameter = {
			headers: {
				'Host': hub_host,
				'User-Agent': getReqHeader("User-Agent"),
				'Accept': getReqHeader("Accept"),
				'Accept-Language': getReqHeader("Accept-Language"),
				'Accept-Encoding': getReqHeader("Accept-Encoding"),
				'Connection': 'keep-alive',
				'Cache-Control': 'max-age=0'
			},
			cacheTtl: 3600 // 缓存时间
		};

		// 添加Authorization头
		if (request.headers.has("Authorization")) {
			parameter.headers.Authorization = getReqHeader("Authorization");
		}

		// 发起请求并处理响应
		let original_response = await fetch(new Request(url, request), parameter)
		let original_response_clone = original_response.clone();
		let original_text = original_response_clone.body;
		let response_headers = original_response.headers;
		let new_response_headers = new Headers(response_headers);
		let status = original_response.status;

		// 修改 Www-Authenticate 头
		if (new_response_headers.get("Www-Authenticate")) {
			let auth = new_response_headers.get("Www-Authenticate");
			let re = new RegExp(auth_url, 'g');
			new_response_headers.set("Www-Authenticate", response_headers.get("Www-Authenticate").replace(re, workers_url));
		}

		// 处理重定向
		if (new_response_headers.get("Location")) {
			return httpHandler(request, new_response_headers.get("Location"))
		}

		// 返回修改后的响应
		let response = new Response(original_text, {
			status,
			headers: new_response_headers
		})
		return response;
	}
};

/**
 * 处理HTTP请求
 * @param {Request} req 请求对象
 * @param {string} pathname 请求路径
 */
function httpHandler(req, pathname) {
	const reqHdrRaw = req.headers

	// 处理预检请求
	if (req.method === 'OPTIONS' &&
		reqHdrRaw.has('access-control-request-headers')
	) {
		return new Response(null, PREFLIGHT_INIT)
	}

	let rawLen = ''

	const reqHdrNew = new Headers(reqHdrRaw)

	const refer = reqHdrNew.get('referer')

	let urlStr = pathname

	const urlObj = newUrl(urlStr)

	/** @type {RequestInit} */
	const reqInit = {
		method: req.method,
		headers: reqHdrNew,
		redirect: 'follow',
		body: req.body
	}
	return proxy(urlObj, reqInit, rawLen)
}

/**
 * 代理请求
 * @param {URL} urlObj URL对象
 * @param {RequestInit} reqInit 请求初始化对象
 * @param {string} rawLen 原始长度
 */
async function proxy(urlObj, reqInit, rawLen) {
	const res = await fetch(urlObj.href, reqInit)
	const resHdrOld = res.headers
	const resHdrNew = new Headers(resHdrOld)

	// 验证长度
	if (rawLen) {
		const newLen = resHdrOld.get('content-length') || ''
		const badLen = (rawLen !== newLen)

		if (badLen) {
			return makeRes(res.body, 400, {
				'--error': `bad len: ${newLen}, except: ${rawLen}`,
				'access-control-expose-headers': '--error',
			})
		}
	}
	const status = res.status
	resHdrNew.set('access-control-expose-headers', '*')
	resHdrNew.set('access-control-allow-origin', '*')
	resHdrNew.set('Cache-Control', 'max-age=1500')

	// 删除不必要的头
	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
	})
}

3.进入网站选择workers路由

4.填写需要的子域名比如hub.xxxx.com和部署完成的workers项目

5.进入网站的DNS解析,添加hub.xxxx.com的A解析,可以指向8.8.8.8

方法二

1.访问cf-workers-docker,fork项目到自己仓库。

2.登录cloudflare找到workers和pages,选择pages关联github。

3.选择fork的cf-workers-docke项目,一键创建pages。

4.进入项目设置找到自定义域,填写比如hub.xxxx.com域名,最后会自动cname解析到生成项目地址。

设置

方式一

修改文件 /etc/docker/daemon.json(如果不存在则创建)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hub.xxxx.com"]  # 请替换为您自己的Worker自定义域名
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

方式二

命令拉取镜像,比如

docker pull hub.xxxx.com/yidadaa/chatgpt-next-web

结语

自此搭建完成,因为有访问量的限制,所以最好是自己用不要外放出来。

  • ✇新锐博客
  • 利用redis降低数据库查询次数莫忘
    前言 因为之前安装了WPOPT,里面有个功能就是能够在控制台查看MYSQL查询次数以及页面创建的时间,之前一直都是高达四十几次的查询次数。 所以就决定安装redis将数据库查询次数降低下来。 重要提醒 如果服务器内有两个WordPress程序,请先将其中一个WordPress程序的数据库表开头从wp_改为其他的,否则会出现相互干扰的情况。 教程 本教材基于宝塔面板教学,特别方便。 1.首先到宝塔面板的软件商店找到redis 并且安装。 2.找到PHP版本,并且安装redis 扩展。 3.WordPress后台搜索并安装Redis Object Cache 。 4.设置插件启用对象存储,如出现下图则表示启用成功。 5.最后看一下MYSQL的查询次数。 只有2次查询次数,刷新了几次最多也就是15左右,大部分都是个位数,效果相当给力。
     

利用redis降低数据库查询次数

作者 莫忘
2024年6月19日 14:58

前言

因为之前安装了WPOPT,里面有个功能就是能够在控制台查看MYSQL查询次数以及页面创建的时间,之前一直都是高达四十几次的查询次数。

所以就决定安装redis将数据库查询次数降低下来。

重要提醒

如果服务器内有两个WordPress程序,请先将其中一个WordPress程序的数据库表开头从wp_改为其他的,否则会出现相互干扰的情况。

教程

本教材基于宝塔面板教学,特别方便。

1.首先到宝塔面板的软件商店找到redis 并且安装。

图片[1]-新锐博客

2.找到PHP版本,并且安装redis 扩展。

图片[2]-新锐博客

3.WordPress后台搜索并安装Redis Object Cache 。

图片[3]-新锐博客

4.设置插件启用对象存储,如出现下图则表示启用成功。

图片[4]-新锐博客

5.最后看一下MYSQL的查询次数。

图片[5]-新锐博客

只有2次查询次数,刷新了几次最多也就是15左右,大部分都是个位数,效果相当给力。

  • ✇新锐博客
  • WordPress首页文章底部添加线条莫忘
    前言 在某个网站看到鼠标放到首页文章,它的底部会出现线条,于是就突发奇想想给自己网站弄一个 效果 别人的: 自己的: 教程 请将如下两个代码中的任何一个添加到子主题的CSS文件夹中的main.css 中或在主题设置中添加自定义css代码 1.固定颜色 .post-item { position: relative; } .post-item::before { content: ""; position: absolute; bottom: 0; left: 0; width: 0; height: 3px; background: var(--color, #000); transition: width 1s, background-color 0.5s; /* 添加了背景颜色的过渡效果 */ } .post-item:hover::before { width: 100%; } /* 使用计算来设置颜色 */ .post-item:nth-of-type(1)::before { --color: hsl(0, 100%, 5
     

WordPress首页文章底部添加线条

作者 莫忘
2024年6月6日 11:24

前言

在某个网站看到鼠标放到首页文章,它的底部会出现线条,于是就突发奇想想给自己网站弄一个

效果

别人的:

图片[1]-新锐博客

自己的:

图片[2]-新锐博客

教程

请将如下两个代码中的任何一个添加到子主题的CSS文件夹中的main.css 中或在主题设置中添加自定义css代码

1.固定颜色

.post-item {
  position: relative;
}

.post-item::before {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 3px;
  background: var(--color, #000);
  transition: width 1s, background-color 0.5s; /* 添加了背景颜色的过渡效果 */
}

.post-item:hover::before {
  width: 100%;
}

/* 使用计算来设置颜色 */
.post-item:nth-of-type(1)::before {
  --color: hsl(0, 100%, 50%); /* 设置第一个.post-item的线条颜色 */
}

.post-item:nth-of-type(2)::before {
  --color: hsl(72, 100%, 50%); /* 设置第二个.post-item的线条颜色 */
}

.post-item:nth-of-type(3)::before {
  --color: hsl(144, 100%, 50%); /* 设置第三个.post-item的线条颜色 */
}

.post-item:nth-of-type(4)::before {
  --color: hsl(216, 100%, 50%); /* 设置第四个.post-item的线条颜色 */
}

.post-item:nth-of-type(5)::before {
  --color: hsl(288, 100%, 50%); /* 设置第五个.post-item的线条颜色 */
}

.post-item:nth-of-type(6)::before {
  --color: hsl(324, 100%, 50%); /* 设置第六个.post-item的线条颜色 */
}

.post-item:nth-of-type(7)::before {
  --color: hsl(36, 100%, 50%); /* 设置第七个.post-item的线条颜色 */
}

.post-item:nth-of-type(8)::before {
  --color: hsl(108, 100%, 50%); /* 设置第八个.post-item的线条颜色 */
}

.post-item:nth-of-type(9)::before {
  --color: hsl(180, 100%, 50%); /* 设置第九个.post-item的线条颜色 */
}

.post-item:nth-of-type(10)::before {
  --color: hsl(252, 100%, 50%); /* 设置第十个.post-item的线条颜色 */
}

2.动态颜色

.post-item {
  position: relative;
}

.post-item::before {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 3px;
  background: var(--color, #000);
  transition: width 1s;
}

.post-item:hover::before {
  width: 100%;
}

.post-item:hover::before {
  animation: randomColor 2s infinite;
}

@keyframes randomColor {
  0% {
    background: red;
  }
  25% {
    background: blue;
  }
  50% {
    background: green;
  }
  75% {
    background: yellow;
  }
  100% {
    background: purple;
  }
}
  • ✇新锐博客
  • 利用CN-Font-Split项目给中文字体分包莫忘
    前言 之前的文章介绍了如何给WordPress添加自定义字体,今天教大家如何使用CN-Font-Split给中文字体进行分片 介绍 cn-font-split 是 中文网字计划 所使用的字体分包工具,通过高性能的各种技术将庞大的字体包拆分为适合网络分发的版本。经过四个版本的字体研究与代码迭代,这项技术在我们的网站中得到了充分的应用,实现了中文字体在 Web 领域的加载速度与效率的双飞跃。 项目地址 gitcode:https://gitcode.com/KonghaYao/cn-font-split github:https://github.com/KonghaYao/cn-font-split 教程 1.首先去nodejs官网下载大于18版本的安装包,这里我下载的是19.9.0 2.其次就是打开安装包进行安装。 3.打开CMD输入以下代码安装项目 npm install @konghayao/cn-font-split npm install @konghayao/cn-font-split -g # 如果使用命令行,推荐全局安装 4.继续输入以下命令进行分包 cn-font-sp
     

利用CN-Font-Split项目给中文字体分包

作者 莫忘
2024年5月15日 17:24

前言

之前的文章介绍了如何给WordPress添加自定义字体,今天教大家如何使用CN-Font-Split给中文字体进行分片

介绍

cn-font-split 是 中文网字计划 所使用的字体分包工具,通过高性能的各种技术将庞大的字体包拆分为适合网络分发的版本。经过四个版本的字体研究与代码迭代,这项技术在我们的网站中得到了充分的应用,实现了中文字体在 Web 领域的加载速度与效率的双飞跃。

项目地址

gitcode:https://gitcode.com/KonghaYao/cn-font-split

github:https://github.com/KonghaYao/cn-font-split

教程

1.首先去nodejs官网下载大于18版本的安装包,这里我下载的是19.9.0

2.其次就是打开安装包进行安装。

3.打开CMD输入以下代码安装项目

npm install @konghayao/cn-font-split
npm install @konghayao/cn-font-split -g # 如果使用命令行,推荐全局安装

4.继续输入以下命令进行分包

cn-font-split -i=../demo/public/SmileySans-Oblique.ttf -o=./temp

其中../demo/public/SmileySans-Oblique.ttf 可以替换成你字体的具体路径,./temp 替换成你想要分包出的文件的路径。

5.上传到网站的某个文件夹里。

6.调用方式:主题后台的页头代码或Head的html代码中添加如下代码

<link rel="stylesheet" href="https://你的域名/字体文件夹/result.css" />

7.查看result.css 文件中font-family 后面的文字就是你字体的名字。

8.在主题自定义css或子主题的css文件中添加如下代码

body {
    font-family: "字体名字", sans-serif;
}

这样就完成了字体的分包和调用。

 

  • ✇新锐博客
  • WordPress添加自定义字体莫忘
    前言 不少主题都有字体的设置,比如CoreNext,但是字体不太满意或者主题没有相关设置该怎么办? 教程 落霞孤鹜 BootCDN的字体库 BootCDN是Bootstrap 中文网支持并维护的前端开源项目免费 CDN 服务,致力于为 Bootstrap、jQuery、Angular、Vuejs 一样优秀的前端开源项目提供稳定、快速的免费 CDN 加速服务。 落霞孤鹜字体库网站链接:BootCDN - lxgw-wenkai-webfont 引入CSS 找到主题后台的自定义代码中的页面代码,也可以在head头部添加html代码 <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/lxgw-wenkai-screen-webfont/1.7.0/style.min.css" /> 添加CSS 如CoreNext主题可以在子主题设置如下代码,或者在主题设置里添加自定义CSS body { font-family: "LXGW WenKai Screen", sans-serif; } 如果是Cor
     

WordPress添加自定义字体

作者 莫忘
2024年5月15日 13:01

前言

不少主题都有字体的设置,比如CoreNext,但是字体不太满意或者主题没有相关设置该怎么办?

教程

落霞孤鹜

BootCDN的字体库

BootCDN是Bootstrap 中文网支持并维护的前端开源项目免费 CDN 服务,致力于为 Bootstrap、jQuery、Angular、Vuejs 一样优秀的前端开源项目提供稳定、快速的免费 CDN 加速服务。

落霞孤鹜字体库网站链接:BootCDN - lxgw-wenkai-webfont

引入CSS

找到主题后台的自定义代码中的页面代码,也可以在head头部添加html代码

<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/lxgw-wenkai-screen-webfont/1.7.0/style.min.css" />

添加CSS

如CoreNext主题可以在子主题设置如下代码,或者在主题设置里添加自定义CSS

body {
    font-family: "LXGW WenKai Screen", sans-serif;
}

如果是CoreNext主题,在sans-serif 和; 之间加上!important

自定义字体

添加自定义css

@font-face {
  font-family: '字体文件名';
  src: url('/zt/字体文件名.woff2') format('woff2');
  /* 添加其他字体格式,如woff、ttf等,以提供更好的兼容性 */
  /* src: url('字体文件路径') format('字体格式'); */
}

body {
    font-family: "字体名", sans-serif !important;
}

 

 

  • ✇新锐博客
  • centos解决提示无法用root权限运行pip莫忘
    前言 在部署项目的时候发现提示无法用root权限运行pip 过程 我在部署项目的时候提示如下代码 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv 根据翻译得到了无法使用root权限运行pip。 这时候我就慌了神,毕竟对于这些东西还是不太懂的,只能请教万能的百度和AI 于是就有如下教程 教程 切记,这一切的前提是linux系统安装了python,我安装的是python3.8.1 1.如果尚未安装 venv 模块,请使用以下命令安装: python3 -m pip install --user virtualenv 2.创建一个新的虚拟环境: python3 -m venv myenv 这将创建一
     

centos解决提示无法用root权限运行pip

作者 莫忘
2024年5月14日 09:38

前言

在部署项目的时候发现提示无法用root权限运行pip

过程

我在部署项目的时候提示如下代码

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

根据翻译得到了无法使用root权限运行pip。

这时候我就慌了神,毕竟对于这些东西还是不太懂的,只能请教万能的百度和AI

于是就有如下教程

教程

切记,这一切的前提是linux系统安装了python,我安装的是python3.8.1

1.如果尚未安装 venv 模块,请使用以下命令安装:

python3 -m pip install --user virtualenv

2.创建一个新的虚拟环境:

python3 -m venv myenv

这将创建一个名为 myenv 的新目录,其中包含虚拟环境所需的文件。

3.激活虚拟环境:

在 Linux 或 macOS 中:

source myenv/bin/activate

在 Windows 中:

myenvScriptsactivate

激活后,命令提示符应显示虚拟环境的名称,表示您现在正在其中工作。

4。使用 pip 安装软件包:

pip install package_name

这将在虚拟环境中安装软件包,使其与系统范围的 Python 安装分离。

  • ✇新锐博客
  • chatgpt-on-wechat:微信公众号AI自动回复莫忘
    前言 这段时间闲得无聊于是就到处找github项目,终于让我找到一个能够使用在微信公众号上面的项目,名为chatgpt-on-wechat,它是基于GPT3.5/GPT4.0/Claude/文心一言/讯飞星火/LinkAI等AI平台的一款能够支持个人微信、公众号、企业微信、飞书部署,能处理文本、语音和图片,访问操作系统和互联网和支持基于知识库定制的专属机器人。 功能  多端部署: 可接入 微信公众号、企业微信应用、钉钉、飞书  基础对话: 私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持 GPT-3, GPT-3.5, GPT-4, 文心一言模型  语音识别: 可识别语音消息,通过文字或语音回复,支持 azure, baidu, google, openai 等多种语音模型  图片生成: 支持图片生成 和 图生图(如照片修复),可选择 Dell-E, stable diffusion, replicate, Midjourney 模型  丰富插件: 支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件  Tool工具: 与操作系统和互联网交互,支持最新信
     

chatgpt-on-wechat:微信公众号AI自动回复

作者 莫忘
2024年5月6日 14:16

前言

这段时间闲得无聊于是就到处找github项目,终于让我找到一个能够使用在微信公众号上面的项目,名为chatgpt-on-wechat,它是基于GPT3.5/GPT4.0/Claude/文心一言/讯飞星火/LinkAI等AI平台的一款能够支持个人微信、公众号、企业微信、飞书部署,能处理文本、语音和图片,访问操作系统和互联网和支持基于知识库定制的专属机器人。

功能

 多端部署: 可接入 微信公众号、企业微信应用、钉钉、飞书

 基础对话: 私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持 GPT-3, GPT-3.5, GPT-4, 文心一言模型

 语音识别: 可识别语音消息,通过文字或语音回复,支持 azure, baidu, google, openai 等多种语音模型

 图片生成: 支持图片生成 和 图生图(如照片修复),可选择 Dell-E, stable diffusion, replicate, Midjourney 模型

 丰富插件: 支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件

 Tool工具: 与操作系统和互联网交互,支持最新信息搜索、数学计算、天气和资讯查询、网页总结,基于 chatgpt-tool-hub 实现

 知识库: 通过上传知识库文件自定义专属机器人,可作为数字分身、领域知识库、智能客服使用,基于 LinkAI 实现

部署方式

运行方式 需要的资源 优势 劣势
Docker部署 服务器 + docker环境 不用关心python环境和依赖 插件配置稍麻烦
本地运行 个人机器 + 本地代理 + python环境 方便本地代码调试 不适合长时间稳定运行
服务器部署 服务器 + python环境 方便配置和源码修改、稳定运行 需要简单的linux基础
Railway部署 一个超过半年的github账号 一键部署 免费额度有限,插件等高级功能使用不便

[start-plane type="2"]因为我想搭建的是公众号,所以目前支持公众号的只有docker 和服务器 ,暂不支持本地 和Railway [/start-plane]

部署教程

本教程只适用于服务器部署,其他部署请看项目文档-程序部署

可以公众号搜索:新锐博客 进行体验,欢迎大家关注哟!~

1.准备一个微信公众号(订阅号),一台linux服务器

2.前往讯飞星火认知大模型 进行注册以及实名认证,可以免费购买一年两百万的Token数。

图片[1]-新锐博客讯飞星火认知大模型,是由科大讯飞推出的新一代认知智能大模型,拥有跨领域的知识和语言理解能力,能够基于自然对话方式理解与执行任务,提供语言理解、知识问答、逻辑推理、数学题解答、代码理解与编写等多种能力。"]讯飞星火认知大模型

3.记下APPID、APISecret、APIKey 的值,后面需要用到。(请妥善保存这些值,不可变更,请勿泄露。)

图片[2]-新锐博客

4.检查你的服务器是否安装了python 3.7.1~3.9.X ,推荐3.8。如果安装了请跳过5-6步骤。

5.安装python环境,打开finalshell 等连接工具,按照以下命令逐步进行

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
#安装依赖包

yum install wget
#安装wget

wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
#下载源码包

tar -zxvf Python-3.8.1.tgz
#解压压缩包

cd Python-3.8.1
#进入文件夹

./configure prefix=/usr/local/python3
#配置安装位置

make && make install
#安装make

6.配置软链接

sudo rm /usr/bin/python3

ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
#添加python3的软链接

7.进入宝塔创建站点,然后在站点设置的 反向代理 进行添加你所需要映射的端口,写法为:127.0.0.1:端口号(记住这个端口号)

图片[3]-新锐博客图片[4]-新锐博客

8.在FinalShell 上,进入该站点的根目录处,也就是刚刚创建的网站目录,比如:/www/wwwroot/ai 。接着逐步执行下方内容。

cd /www/wwwroot/ai
#进入站点根目录

git clone https://github.com/zhayujie/chatgpt-on-wechat
#拉取项目源码

pip3 install --upgrade pip
#更新下pip版本

9.进入后拉取项目代码,再到宝塔的站点文件处将拉取到的 chatgpt-on-wechat 文件夹内所有的文件移动到站点的根目录。

10.按照如下命令进行

pip3 install -r requirements.txt
pip3 install -r requirements-optional.txt
#安装依赖

11.登录微信公众号,找到设置与开发里的基本配置 选项,进行开通后,会得到开发者的 AppID  和 AppSecret ,请牢记AppSecret (只出现一次之后需要重置才会再次看到)以便后续使用。

12.在宝塔内,站点根目录处新建 config.json 文件,配置好下边的东西,放进去。

{
  "open_ai_api_key": "没用,但是别删",
  "model": "xunfei",
  "xunfei_app_id": "星火APPID",
  "xunfei_api_secret": "星火APISecret",
  "xunfei_api_key": "星火APIKey",
  "channel_type": "wechatmp",
  "wechatmp_app_id": "公众号开发者AppID" ,
  "wechatmp_app_secret": "公众号开发者AppSecret" ,
  "wechatmp_aes_key": "",
  "wechatmp_token": "meuicat",
  "wechatmp_port": 2170,
  "proxy": "",
  "hot_reload": false,
  "single_chat_prefix": [""],
  "single_chat_reply_prefix": "🤖 MeuiCat Ai:nn",
  "image_create_prefix": [
    "画",
    "看",
    "找"
  ],
  "speech_recognition": false,
  "group_speech_recognition": false,
  "voice_reply_voice": false,
  "conversation_max_tokens": 2500,
  "expires_in_seconds": 3600,
  "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
  "temperature": 0.8,
  "top_p": 1,
  "subscribe_msg": "哈喽~你终于来啦~n这里是新锐博客~n本公众号已接入Ai对话功能,注意文明发言哦~nn谢谢你长得好看,又关注我呀~n祝你天天开心~",
  "use_linkai": false,
  "linkai_api_key": "",
  "linkai_app_code": ""
}
类型 释义
model 我这使用的是讯飞的星火大模型 xunfei,可配置为:gpt-3.5-turbogpt-3.5-turbo-16kgpt-4wenxinxunfei
channel_type 订阅号填:wechatmp;而服务号则填:wechatmp_service,但是要确保开通了客服接口
wechatmp_token 设置一个你自己的秘钥,必须为英文或数字,长度为3-32字符。后面需要用到。
wechatmp_port 此处填写第七步所填写的端口号,在不冲突的前提下,任意数值皆可,但注意需要在安全策略放行改端口。

13.当然,你也可以在 config.json 配置多个模型以便切换。

"open_ai_api_key": "",
#chatgtp

"baidu_wenxin_api_key": "",
"baidu_wenxin_secret_key": "",
#文心一言

14.在站点目录下执行以下命令启动运行。

touch nohup.out
nohup python3 app.py & tail -f nohup.out
#运行成功后,可以 Ctrl+C 退出日志

15.正常运行后,来到微信公众号后台的基本配置 选项,将你的服务器公网地址填进IP白名单 内。

16.接着在服务器配置 处修改配置,依次填写URL、Token、EncodingAESKey ,消息加解密方式 选择明文,提交即可。

类型 释义
URL 如果绑定了域名,那此处就为:你的域名/wx;如果没有绑定域名,则为:https://你的公网ip/wx
Token 此处填写第十二步 wechatmp_token 的值。
EncodingAESKey 点击随机生成即可。

17.至此部署完成,可以开始尝试使用AI自动回复了。

进阶教程

当修改了config.json 时,也可以在公众号里进行管理身份认证直接进行重载配置、切换模型等操作。

具体命令可用#help 进行查看和操作。

管理认证

1.在公众号内进行发言,在日志处可以看到用户身份id,复制下来。

图片[5]-新锐博客

2.打开宝塔,进入[站点根目录]/plugins/godcmd/config.json 文件,进行配置身份和密钥。

{
    "password": "你的密钥",
    "admin_users": ["用户身份id"]
}

3.关闭进程后,重新运行。

ps -ef | grep app.py | grep -v grep
#查看进程id

kill -9 进程id
#关闭进程

nohup python3 app.py & tail -f nohup.out
#重新运行项目

部分命令

类型 释义 用法
help 帮助文档。 #help#help 插件名
auth 管理身份验证。 #auth 密钥
reconf 重载配置,修改完配置后可以通过命令进行重载。 #reconf
model 查看或切换模型 #model 可查看当前模型和模型列表;#model 模型名称 可切换使用该模型。
plist 查看插件状态 #plist 查看插件开启状态。
enablep 开启插件 #enablep 插件名开启指定插件。

关键词

1.打开宝塔,进入 [站点根目录]/plugins/keyword/config.json 文件,进行配置。

{
  "keywords": {
    "hello": "Hello, Welcome to Xinrui.",
    "新锐博客": "我是一款基于星火大模型3.0的智能回复助手,这是我的开发者:莫忘,以及他的博客:新锐博客(xrbk.cn),你可以直接给我发送你想知道的问题,我相信能给到你满意的答复!"
  }
}

2.关闭进程后,重新运行。

3.对话框先输入#auth 密钥(上面管理认证中提到的密钥),然后等待返回认证成功,再输入#enablep keyword 开启插件

主要来源

原文地址:https://meuicat.com/blog/82/

  • ✇新锐博客
  • WordPress搜索屏蔽所有页面莫忘
    前言 用WordPress搭建网站的站长都知道,WordPress自带的搜索路径为?s= ,这就导致搜索结果出来的时候会包含页面而不是只有文章内容,所以今天教大家如何让搜索结果屏蔽所有页面内容。 教程 我用的是CoreNext主题自带有子主题,如果没有子主题的要慎重修改。 将如下代码加到function.php 中即可 function search_filter_page($query) { if ($query->is_search) { $query->set('post_type', 'post'); } return $query; } add_filter('pre_get_posts','search_filter_page'); 测试 加代码之前的效果: 加代码之后的效果:  
     

WordPress搜索屏蔽所有页面

作者 莫忘
2024年5月5日 13:28

前言

用WordPress搭建网站的站长都知道,WordPress自带的搜索路径为?s= ,这就导致搜索结果出来的时候会包含页面而不是只有文章内容,所以今天教大家如何让搜索结果屏蔽所有页面内容。

教程

我用的是CoreNext主题自带有子主题,如果没有子主题的要慎重修改。

将如下代码加到function.php 中即可

function search_filter_page($query) {
    if ($query->is_search) {
        $query->set('post_type', 'post');
    }
    return $query;
 }
add_filter('pre_get_posts','search_filter_page');

测试

加代码之前的效果:

图片[1]-新锐博客

加代码之后的效果:

图片[2]-新锐博客

 

  • ✇新锐博客
  • 推荐一款开源API开发工具莫忘
    前言 无论是搭建网站还是其他的时候都缺不了API的支持,今天给大家推荐一款在GITHUB上高达19.3K的start的开源API开发工具-Bruno 截图 介绍 Bruno 是一款全新且创新的 API 客户端,旨在颠覆 Postman 和其他类似工具。 Bruno 直接在您的电脑文件夹中存储您的 API 信息。我们使用纯文本标记语言 Bru 来保存有关 API 的信息。 您可以使用 Git 或您选择的任何版本控制系统来对您的API信息进行版本控制和协作。 Bruno 仅限离线使用。我们计划永不向 Bruno 添加云同步功能。我们重视您的数据隐私,并认为它应该留在您的设备上 教程 GitHub:https://github.com/usebruno/bruno 下载地址:https://www.usebruno.com/downloads  
     

推荐一款开源API开发工具

作者 莫忘
2024年5月2日 14:15

前言

无论是搭建网站还是其他的时候都缺不了API的支持,今天给大家推荐一款在GITHUB上高达19.3K的start的开源API开发工具-Bruno

截图

图片[1]-新锐博客

介绍

Bruno 是一款全新且创新的 API 客户端,旨在颠覆 Postman 和其他类似工具。

Bruno 直接在您的电脑文件夹中存储您的 API 信息。我们使用纯文本标记语言 Bru 来保存有关 API 的信息。

您可以使用 Git 或您选择的任何版本控制系统来对您的API信息进行版本控制和协作。

Bruno 仅限离线使用。我们计划永不向 Bruno 添加云同步功能。我们重视您的数据隐私,并认为它应该留在您的设备上

教程

GitHub:https://github.com/usebruno/bruno

下载地址:https://www.usebruno.com/downloads

 

  • ✇新锐博客
  • 网站访问IP归属地查询莫忘
    前言 众所周知,宝塔面板的网站日志的查询ip归属地的功能需要收费,所以写了这么个软件,就大概能够知道访问网站的ip都是什么地区的了 本软件依然采用易语言编写,部分杀毒软件会报毒,如有介意请勿使用! 截图 教程 1.首先进入宝塔面板的文件中,选择如下目录:/www/wwwlogs 然后找到带有你域名的log文件。 2.将log文件以及软件下载下来,然后打开软件去免费获取1000额度的token,获取方法软件内有。 3.拖动log文件到软件内,填写好token然后点击查询就可以查询到ip归属地和运营商了。 下载地址 网站访问IP归属地查询下载
     

网站访问IP归属地查询

作者 莫忘
2024年4月30日 15:17

前言

众所周知,宝塔面板的网站日志的查询ip归属地的功能需要收费,所以写了这么个软件,就大概能够知道访问网站的ip都是什么地区的了

本软件依然采用易语言编写,部分杀毒软件会报毒,如有介意请勿使用!

截图

图片[1]-新锐博客

教程

1.首先进入宝塔面板的文件中,选择如下目录:/www/wwwlogs 然后找到带有你域名的log文件。

2.将log文件以及软件下载下来,然后打开软件去免费获取1000额度的token,获取方法软件内有。

3.拖动log文件到软件内,填写好token然后点击查询就可以查询到ip归属地和运营商了。

下载地址

网站访问IP归属地查询

  • ✇新锐博客
  • Windows安装JAVA环境莫忘
    前言 最近闲得无聊刚好还有台空闲服务器,就准备瞎捣腾一些东西,但是需要我自己本机拥有java环境配合其他一些软件用。 教程 1.首先访问Oracle官网拉到最下面的右侧找到Java SE 8 (8u202 and earlier) ,至于为何下载这个版本是因为上面的版本好像需要收费 2.按照指示安装JAVA程序 3.找到JAVA的安装目录,比如C:Program FilesJavajre1.8.0_202  4.右键点击此电脑(我的电脑)找到属性再找到高级系统设置再找到系统环境 5.在系统环境中添加JAVA_HOME ,值为C:Program FilesJavajre1.8.0_202  6.找到path 在其中添加系统环境值:%JAVA_HOME%bin 7.可以用cmd输入命令java -version 查询JAVA是否安装完成 结语 最终结合了JAVA环境的软件终于把我想弄的东西弄好了
     

Windows安装JAVA环境

作者 莫忘
2024年4月27日 18:33

前言

最近闲得无聊刚好还有台空闲服务器,就准备瞎捣腾一些东西,但是需要我自己本机拥有java环境配合其他一些软件用。

教程

1.首先访问Oracle官网拉到最下面的右侧找到Java SE 8 (8u202 and earlier) ,至于为何下载这个版本是因为上面的版本好像需要收费

2.按照指示安装JAVA程序

3.找到JAVA的安装目录,比如C:Program FilesJavajre1.8.0_202 

4.右键点击此电脑(我的电脑)找到属性再找到高级系统设置再找到系统环境

5.在系统环境中添加JAVA_HOME ,值为C:Program FilesJavajre1.8.0_202 

6.找到path 在其中添加系统环境值:%JAVA_HOME%bin

7.可以用cmd输入命令java -version 查询JAVA是否安装完成

结语

最终结合了JAVA环境的软件终于把我想弄的东西弄好了

  • ✇新锐博客
  • WordPress添加评论邮箱通知莫忘
    前言 一直很想用评论邮件通知功能,但是一直都没有实现,今天突然有了些思路,于是就尝试一下。 截图 教程 首先下载PHPMailer邮件库,然后在function.php里添加如下代码: // 创建一个函数来发送邮件通知管理员 function send_comment_notification($comment_ID) { // 这是评论请求,执行评论邮件通知功能 // 检查是否是评论的 AJAX 请求 if (defined('DOING_AJAX') && isset($_POST['action']) && $_POST['action'] == 'add-comment') { return; // 如果是评论的 AJAX 请求,直接返回,不执行邮件发送 } // 引入PHPMailer库 require '/www/wwwroot/你的域名/PHPMailer/src/Exception.php';
     

WordPress添加评论邮箱通知

作者 莫忘
2024年4月23日 20:02

前言

一直很想用评论邮件通知功能,但是一直都没有实现,今天突然有了些思路,于是就尝试一下。

截图

图片[1]-新锐博客

教程

首先下载PHPMailer邮件库,然后在function.php里添加如下代码:

// 创建一个函数来发送邮件通知管理员
function send_comment_notification($comment_ID) {
        // 这是评论请求,执行评论邮件通知功能

        // 检查是否是评论的 AJAX 请求
        if (defined('DOING_AJAX') && isset($_POST['action']) && $_POST['action'] == 'add-comment') {
             return; // 如果是评论的 AJAX 请求,直接返回,不执行邮件发送
         }

        // 引入PHPMailer库
        require '/www/wwwroot/你的域名/PHPMailer/src/Exception.php';
        require '/www/wwwroot/你的域名/PHPMailer/src/PHPMailer.php';
        require '/www/wwwroot/你的域名/PHPMailer/src/SMTP.php';

        // 获取评论对象
        $comment = get_comment($comment_ID);

        // 获取文章对象
        $post = get_post($comment->comment_post_ID);

        // 设置管理员邮箱
        $admin_email = '收件人邮箱';

        // 创建邮件对象
        $mail = new PHPMailerPHPMailerPHPMailer;
        $mail->isSMTP();
        $mail->Host = '发件人邮箱服务器';
        $mail->SMTPAuth = true;
        $mail->Username = '发件人邮箱';
        $mail->Password = '邮箱密码';
        $mail->SMTPSecure = 'ssl';
        $mail->Port = 465;
        $mail->CharSet = 'UTF-8'; // 设置字符集为UTF-8
        $mail->setFrom('发件人邮箱', '邮箱名字');
        $mail->addAddress($admin_email);
        $mail->Subject = '有新的评论: ' . $post->post_title;
        $mail->Body = "姓名: " . $comment->comment_author . "n邮箱: " . $comment->comment_author_email . "n评论内容: " . $comment->comment_content . "nn文章链接: " . get_permalink($post);

        // 发送邮件
        if (!$mail->send()) {
            // 记录邮件发送失败状态到文件
            $log_message = date('Y-m-d H:i:s') . " - 邮件发送失败。错误信息: " . $mail->ErrorInfo . PHP_EOL;
            file_put_contents('/www/wwwroot/你的域名/PHPMailer/email_logs.txt', $log_message, FILE_APPEND);
        } else {
            // 记录邮件发送成功状态到文件
            $log_message = date('Y-m-d H:i:s') . " - 邮件已发送" . PHP_EOL;
            file_put_contents('/www/wwwroot/你的域名/PHPMailer/email_logs.txt', $log_message, FILE_APPEND);
        }
    }
// 钩子函数,当有新评论时调用send_comment_notification函数
add_action('wp_insert_comment', 'send_comment_notification');

最后在域名根目录创建一个email_logs.txt 用来记录发送记录,这样就不会影响系统对于评论成功与否的判断。

如果提示发送失败,可以尝试把ssl改成tls。

下载地址

PHPMailer
  • ✇新锐博客
  • 给WordPress添加随机文章页面莫忘
    前言 之前介绍过给你的网站添加一个Ctrl+D收藏引导,它的发现更多是回到首页,但是我想让它显示随机文章。 教程 主题有子主题的可以加function代码添加到子主题的function.php 中,没有的话慎重修改主题代码。 首先将如下代码添加到function.php 中: function redirect_to_random_post() { if ( is_page( 'your-page-slug' ) ) { // 将 'your-page-slug' 替换为您想要跳转到随机文章的页面的别名或ID $args = array( 'orderby' => 'rand', 'posts_per_page' => 1 ); $random_post = new WP_Query( $args ); if ( $random_post->have_posts() ) { while ( $random_post->h
     

给WordPress添加随机文章页面

作者 莫忘
2024年3月23日 17:56

前言

之前介绍过给你的网站添加一个Ctrl+D收藏引导,它的发现更多是回到首页,但是我想让它显示随机文章。

教程

主题有子主题的可以加function代码添加到子主题的function.php 中,没有的话慎重修改主题代码。

首先将如下代码添加到function.php 中:

function redirect_to_random_post() {
    if ( is_page( 'your-page-slug' ) ) { // 将 'your-page-slug' 替换为您想要跳转到随机文章的页面的别名或ID
        $args = array(
            'orderby' => 'rand',
            'posts_per_page' => 1
        );
        $random_post = new WP_Query( $args );
        if ( $random_post->have_posts() ) {
            while ( $random_post->have_posts() ) {
                $random_post->the_post();
                $url = get_permalink();
            }
        }
        wp_reset_postdata();
        wp_redirect( $url );
        exit;
    }
}
add_action( 'template_redirect', 'redirect_to_random_post' );

再到WordPress后台中创建新页面,然后在页面的编辑器中选择文本,最后将[template_redirect] 添加到页面中。

接下来访问页面就可以跳转到随机文章啦。

  • ✇新锐博客
  • WordPress后台用户列表显示用户注册时间并排序莫忘
    前言 在 WordPress 后台的用户列表界面,用户是按照用户名排序的,并且没有显示注册时间,如果我们希望能够在后台看到用户的注册时间,并且按照注册时间排序,可以通过下面的步骤实现 教程 在主题的function.php 中添加如下代码,CoreNext主题添加到子主题的function.php 中。 1.在用户列表添加「注册时间」列: add_filter('manage_users_columns', function($column_headers){ $column_headers['registered'] = '注册时间'; return $column_headers; }); 2. 显示用户的「注册时间」: add_filter('manage_users_custom_column', function($value, $column_name, $user_id){ if($column_name=='registered'){ return get_date_from_gmt(get_userdata($user_id)->user_regist
     

WordPress后台用户列表显示用户注册时间并排序

作者 莫忘
2024年3月7日 19:47

前言

WordPress 后台的用户列表界面,用户是按照用户名排序的,并且没有显示注册时间,如果我们希望能够在后台看到用户的注册时间,并且按照注册时间排序,可以通过下面的步骤实现

教程

在主题的function.php 中添加如下代码,CoreNext主题添加到子主题的function.php 中。

1.在用户列表添加「注册时间」列:

add_filter('manage_users_columns', function($column_headers){
	$column_headers['registered'] = '注册时间';
	return $column_headers;
});

2. 显示用户的「注册时间」:

add_filter('manage_users_custom_column', function($value, $column_name, $user_id){
	if($column_name=='registered'){
		return get_date_from_gmt(get_userdata($user_id)->user_registered);
	}else{
		return $value;
	}
},11,3);

3. 设置「注册时间」列可以排序:

add_filter('manage_users_sortable_columns', function($sortable_columns){
	$sortable_columns['registered'] = 'registered';
	return $sortable_columns;
});

4. 默认或者使用「注册时间」排序的处理:

add_action('pre_user_query', function($query){
	if(!isset($_REQUEST['orderby']) || $_REQUEST['orderby']=='registered' ){
		if( !in_array($_REQUEST['order'],array('asc','desc')) ){
			$_REQUEST['order'] = 'desc';
		}
		$query->query_orderby = "ORDER BY user_registered ".$_REQUEST['order']."";
	}
});

上面的代码在默认的情况下,或者用户点击「用户注册」列,都按照「用户注册」进行排序。

  • ✇新锐博客
  • WordPress禁止用户在wp-admin中注册莫忘
    前言 现在很多主题都支持在前台注册用户,但是禁止任何人都可以注册就会导致前台也不能注册,所以既想前台又能注册后台不能注册,可以使用下方代码。 教程 我们可以使用跳转的方式,一旦访问链接包含wp-login.php?action=register 就直接跳转到首页。 将如下代码放到主题的function.php 中,有子主题的可以添加到子主题的function.php 中。 function disable_wp_register() { if (strpos($_SERVER['REQUEST_URI'], 'wp-login.php?action=register') !== false) { wp_redirect(home_url()); exit; } } add_action('init', 'disable_wp_register');
     

WordPress禁止用户在wp-admin中注册

作者 莫忘
2024年2月14日 00:08

前言

现在很多主题都支持在前台注册用户,但是禁止任何人都可以注册就会导致前台也不能注册,所以既想前台又能注册后台不能注册,可以使用下方代码。

教程

我们可以使用跳转的方式,一旦访问链接包含wp-login.php?action=register 就直接跳转到首页。

将如下代码放到主题的function.php 中,有子主题的可以添加到子主题的function.php 中。

function disable_wp_register() {
    if (strpos($_SERVER['REQUEST_URI'], 'wp-login.php?action=register') !== false) {
        wp_redirect(home_url()); 
        exit;
    }
}
add_action('init', 'disable_wp_register');
  • ✇新锐博客
  • 利用cloudflare给github加速莫忘
    前言 众所周知,github的访问总是会不尽如人意,有时候就会很快有时候就会访问不了,有大佬就想到了用cloudflare结合自定义域给github加速 教程 首先注册一个cloudflare的账号,然后创建一个workers。 填写完名称以后部署完成之后,点击快速编辑并将如下代码放到js中 // 你要镜像的网站. const upstream = "www.github.com"; // 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可. const upstream_path = "/"; // 镜像站是否有手机访问专用网址,没有则填一样的. const upstream_mobile = "www.github.com"; // 屏蔽国家和地区. const blocked_region = ["KP", "SY", "PK", "CU"]; // 屏蔽 IP 地址. const blocked_ip_address = ["0.0.0.0", "127.0.0.1"]; // 镜像站是否开启 HTTPS. const
     

利用cloudflare给github加速

作者 莫忘
2024年2月13日 19:28

前言

众所周知,github的访问总是会不尽如人意,有时候就会很快有时候就会访问不了,有大佬就想到了用cloudflare结合自定义域给github加速

教程

  1. 首先注册一个cloudflare的账号,然后创建一个workers。
  2. 填写完名称以后部署完成之后,点击快速编辑并将如下代码放到js中
// 你要镜像的网站.
const upstream = "www.github.com";
// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可.
const upstream_path = "/";
// 镜像站是否有手机访问专用网址,没有则填一样的.
const upstream_mobile = "www.github.com";
// 屏蔽国家和地区.
const blocked_region = ["KP", "SY", "PK", "CU"];
// 屏蔽 IP 地址.
const blocked_ip_address = ["0.0.0.0", "127.0.0.1"];
// 镜像站是否开启 HTTPS.
const https = true;
// 文本替换.
const replace_dict = {
  $upstream: "$custom_domain",
  "//github.com": "",
};
// 以下保持默认,不要动
addEventListener("fetch", (event) => {
  event.respondWith(fetchAndApply(event.request));
});
async function fetchAndApply(request) {
  const region = request.headers.get("cf-ipcountry").toUpperCase();
  const ip_address = request.headers.get("cf-connecting-ip");
  const user_agent = request.headers.get("user-agent");
  let response = null;
  let url = new URL(request.url);
  let url_hostname = url.hostname;
  if (https == true) {
    url.protocol = "https:";
  } else {
    url.protocol = "http:";
  }
  if (await device_status(user_agent)) {
    var upstream_domain = upstream;
  } else {
    var upstream_domain = upstream_mobile;
  }
  url.host = upstream_domain;
  if (url.pathname == "/") {
    url.pathname = upstream_path;
  } else {
    url.pathname = upstream_path + url.pathname;
  }
  if (blocked_region.includes(region)) {
    response = new Response(
      "Access denied: WorkersProxy is not available in your region yet.",
      {
        status: 403,
      }
    );
  } else if (blocked_ip_address.includes(ip_address)) {
    response = new Response(
      "Access denied: Your IP address is blocked by WorkersProxy.",
      {
        status: 403,
      }
    );
  } else {
    let method = request.method;
    let request_headers = request.headers;
    let new_request_headers = new Headers(request_headers);
    new_request_headers.set("Host", url.hostname);
    new_request_headers.set("Referer", url.hostname);
    let original_response = await fetch(url.href, {
      method: method,
      headers: new_request_headers,
    });
    let original_response_clone = original_response.clone();
    let original_text = null;
    let response_headers = original_response.headers;
    let new_response_headers = new Headers(response_headers);
    let status = original_response.status;
    new_response_headers.set("access-control-allow-origin", "*");
    new_response_headers.set("access-control-allow-credentials", true);
    new_response_headers.delete("content-security-policy");
    new_response_headers.delete("content-security-policy-report-only");
    new_response_headers.delete("clear-site-data");
    const content_type = new_response_headers.get("content-type");
    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {
      original_text = await replace_response_text(
        original_response_clone,
        upstream_domain,
        url_hostname
      );
    } else {
      original_text = original_response_clone.body;
    }
    response = new Response(original_text, {
      status,
      headers: new_response_headers,
    });
  }
  return response;
}
async function replace_response_text(response, upstream_domain, host_name) {
  let text = await response.text();
  var i, j;
  for (i in replace_dict) {
    j = replace_dict[i];
    if (i == "$upstream") {
      i = upstream_domain;
    } else if (i == "$custom_domain") {
      i = host_name;
    }
    if (j == "$upstream") {
      j = upstream_domain;
    } else if (j == "$custom_domain") {
      j = host_name;
    }
    let re = new RegExp(i, "g");
    text = text.replace(re, j);
  }
  return text;
}
async function device_status(user_agent_info) {
  var agents = [
    "Android",
    "iPhone",
    "SymbianOS",
    "Windows Phone",
    "iPad",
    "iPod",
  ];
  var flag = true;
  for (var v = 0; v < agents.length; v++) {
    if (user_agent_info.indexOf(agents[v]) > 0) {
      flag = false;
      break;
    }
  }
  return flag;
}

 

改动此代码还可以加速其他网站

最后,添加路由就行(需要将域名托管在 cf 上)

结语

如果有空闲域名可以尝试部署一下,这样访问github等网站就比较方便了。

  • ✇新锐博客
  • Linux一键安装Python3.11.2莫忘
    前言 生产过程中难免会用到python,但是linux自带的python好像是2.7.5的,有点落后了,所以今天教大家怎么在linux服务器中安装python3.11.2 教程 首先随便在一个目录下创建一个文件夹,并且上传python3.11.2的安装包然后输入以下命令 tar zxvf python-3.11.2.tgz 在python-3.11.2 目录下创建一个文件,命名为python311_install.sh ,并将以下代码放入其中 #!/bin/bash # You should have Internet connection. # You should have Online yum resource, if you don't have Online yum resource, Please use below function online_yumresource() { curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
     

Linux一键安装Python3.11.2

作者 莫忘
2024年2月11日 23:09

前言

生产过程中难免会用到python,但是linux自带的python好像是2.7.5的,有点落后了,所以今天教大家怎么在linux服务器中安装python3.11.2

教程

首先随便在一个目录下创建一个文件夹,并且上传python3.11.2的安装包然后输入以下命令

tar zxvf python-3.11.2.tgz

python-3.11.2 目录下创建一个文件,命名为python311_install.sh ,并将以下代码放入其中

#!/bin/bash

# You should have Internet connection.
# You should have Online yum resource, if you don't have Online yum resource, Please use below

function online_yumresource() {
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
}

function py311_install() {
    yum -y groupinstall "Development tools"
    yum install -y ncurses-devel gdbm-devel xz-devel sqlite-devel tk-devel uuid-devel readline-devel bzip2-devel libffi-devel
    yum install -y openssl-devel openssl11 openssl11-devel
    yum install centos-release-scl
    yum -y install devtoolset-8
    source /opt/rh/devtoolset-8/enable
    echo "source /opt/rh/devtoolset-8/enable" >> /etc/profile
    gcc --version

    export CFLAGS=$(pkg-config --cflags openssl11)
    export LDFLAGS=$(pkg-config --libs openssl11)
    tar zxvf Python-3.11.2.tgz
    cd Python-3.11.2
    ./configure --enable-optimizations
    make && make altinstall
    ln -sf /usr/local/bin/python3.11 /usr/bin/python3
    ln -sf /usr/local/bin/pip3.11  /usr/bin/pip3

    # Create a virtual environment and activate it
    python3.11 -m venv myenv
    source myenv/bin/activate

    # Upgrade pip and install other packages
    pip install --upgrade pip
    pip install numpy pandas matplotlib
}

online_yumresource
py311_install

然后再在终端中输入如下命令

cd python-3.11.2 && sh python311_install.sh

结语

可以在终端中输入python3 --version ,如果显示python 3.11.2 就说明安装成功了。

教程到此结束

❌
❌