中文|英文
自动从 EH/EX/NH 下载图片集并上传至 Telegraph 的 Bot。
本代码只保证在 MacOS(部分功能)和 Linux 上可以正确运行。
- 安装 Docker 和 docker-compose。
- 创建新文件夹
ehbot
。 - 复制项目中的
config_example.yaml
至ehbot
并重命名为config.yaml
,之后修改配置细节(请参考下一节)。 - 复制
docker-compose.yml
至ehbot
。 - 开启与关闭:
- 开启:在该路径中运行
docker-compose up -d
。 - 关闭:在该路径中运行
docker-compose down
。 - 查看日志:在该路径中运行
docker-compose logs
。 - 更新镜像:在该路径中运行
docker-compose pull
。
- 开启:在该路径中运行
- 基础配置:
- Bot Token:Telegram 内找 @BotFather 申请。
- Admin(可空):你的 Telegram ID,随便找个相关 Bot 就可以拿到(也可以通过本 Bot
/id
拿到)。 - Telegraph:使用浏览器通过这个链接创建 Telegraph Token 并填写。你也可以修改作者名字和 URL。
- 代理配置:
- 部署本仓库中的
worker/web_proxy.js
至 CloudFlare Workers,并配置KEY
环境变量为一段随机字符串(该 KEY 目的是防止对代理的未授权请求)。 - 填写 URL 和 Key 到配置中。
- 该代理用于请求一些有频率限制的服务,请勿滥用。
- 部署本仓库中的
- IPv6 配置:
- 可以填写一个 IPv6 段,如果你并没有拥有一个较大的(指比
/64
大)IPv6 段,请留空。 - 填写的话需要开启
net.ipv6.ip_nonlocal_bind
内核参数(参考后续章节说明)。 - 配置 IPv6 可以一定程度上缓解针对单 IP 的限流。
- 可以填写一个 IPv6 段,如果你并没有拥有一个较大的(指比
- 配置部分 Collector 的 Cookie:
- 目前只有 exhentai 需要。
- KV 配置:
- 本项目内置使用了一个缓存服务,可以避免对一个图片集的重复同步。
- 请参考 cloudflare-kv-proxy 进行部署,并填写至配置文件。
- 如果不想使用远程缓存,也可以使用纯内存缓存(重启后会失效),需要自行改代码并重新编译。
需要 Rust 最新的 Nightly 版本。推荐使用 VSCode 或 Clion 开发。
中国大陆推荐使用 RsProxy 作为 crates.io 镜像与工具链安装源。
打 v
开头的 Tag 即可触发 Docker 构建。你可以直接在 git 中打 tag 之后 push 上去;但更方便的是在 github 中发布 release,并填写 v
开头的命名。
虽然本项目就是一个简单的爬虫,但是还是有一些注意事项需要说明一下。
Github Action 可以用于自动构建 Docker 镜像,本项目支持自动构建 x86_64
平台的版本。
但事实上也可以构建 arm64
的版本,由于其机制上使用了 qemu 在 x86_64 上模拟了 arm 环境,所以速度极其缓慢(单次构建需要 1h 以上),于是没有开启。
某些网站有针对 IP 的访问频率限制,使用多个 IP 即可缓解该限制。实践上最常用的办法是代理池,但代理池往往极不稳定,并需要维护,可能还有一定成本。
观察本项目的目标网站,很多使用了 Cloudflare,而 Cloudflare 支持 IPv6 且限流粒度是 /64
。如果我们为本机绑定一个更大的 IPv6 段并从中随机选择 IP 作为客户端出口地址,则可以稳定地进行更高频率的请求。
由于网卡只会绑定单个 IPv6 地址,所以我们需要开启 net.ipv6.ip_nonlocal_bind
。
配置 IPv6 后,对于可以走 IPv6 的目标站点,本项目会使用 IPv6 段中的随机 IP 请求。
配置(对网卡的配置可以写在 if-up
中便于持久化):
sudo ip add add local 2001:x:x::/48 dev lo
sudo ip route add local 2001:x:x::/48 dev your-interface
- 在 Sysctl 中配置
net.ipv6.ip_nonlocal_bind=1
。该步骤因发行版而异(比如常见的/etc/sysctl.conf
在 Arch Linux 中不存在)。
去哪搞 IPv6?he.net 提供了相关免费服务,当然自己购买一个 IPv6 IP 段也并不昂贵。
你可以通过 curl --interface 2001:***** ifconfig.co
测试配置是否正确。
前一小节提到的网站虽然用了 Cloudflare,但是事实上并没有真正启用 IPv6。当你直接使用 curl 指定 ipv6 请求时会发现,它根本就没有 AAAA 记录。但是由于 CF 的基础设施是 Anycast 的,所以如果目标网站不在代码中明确地拒绝 IPv6 访客,它们还是可以通过 IPv6 访问的。
-
telegra.ph: 无 AAAA 记录,但是强制解析到 Telegram 的入口 IP 可以访问,但证书是
*.telegram.org
的。本项目写了一个校验指定域名证书有效性的 TLS 验证器,用于在保证安全性的情况下允许其证书配置错误。但是 Telegraph 以极快的速度修掉了该问题,所以该 TLS 校验器目前处于禁用状态。
-
EH/NH: 强制 IPv6 可用。
-
EX: 未使用 CF 且无 IPv6 服务。
本项目使用 Cloudflare Workers 作为部分 API 代理,在 IPv6 不可用时缓解限流问题。参考 src/http_proxy.rs
和 worker/web_proxy.js
。
为了尽可能少地重复拉取,本项目使用了内存缓存与远程持久化缓存。远程持久化缓存使用 Cloudflare Worker 配合 Cloudflare KV 搭建。项目主代码参考 cloudflare-kv-proxy。
由于同步图片集需要一定时间,为了避免重复同步,本项目使用了 singleflight-async 减少这类浪费。
欢迎你对本项目贡献代码!无论大小我们都欢迎!