# GoCQHTTP Twitter Bot

修改自：[rikakomoe/cqhttp-twitter-bot](https://github.com/rikakomoe/cqhttp-twitter-bot)

使用 API：[koishijs/koishi](https://github.com/koishijs/koishi)（后台使用：[Mrs4s/go-cqhttp](https://github.com/Mrs4s/go-cqhttp)）

## 主要区别

- <s>去除了 Redis</s>**（v0.5.1 已重新加入去重，并加入简单的缓存机制，未来可能会继续加入基于散列值的媒体缓存）**
- 支持通过列表 ID 订阅列表，和网页端体验一致
- 处理订阅链接时大小写不敏感，新订阅链接时先检查是否存在
- 支持直接查看指定的推文链接，或（在没有其他用户订阅该用户时）从最新推文回溯到该条推文，由新到旧显示
- 图片使用 [sharp](https://github.com/lovell/sharp) 压缩为 JPEG
- 视频直接作为短视频发送
- 机器人的 QQ 号码必须手动填写
- 由于推特改版后引发了 Chromium 的 bug，截图部分从 Puppeteer 改为 Playwright 并使用特殊的 WebSocket 格式 URL（这种方式可以使用本地或远程 WebSocket 代理服务器上的 Playwright 服务端）
- 自动处理<u>来自群友的好友请求</u>和<u>来自好友的加群邀请</u>

## 配置

它会从命令传入的 JSON 配置文件里读取配置，配置说明如下

| 配置项 | 说明 | 默认 |
| --- | --- | --- |
| cq_access_token | OneBot HTTP API access_token（需与插件一致，<br />插件若未配置本项即为空，建议配置为独特值） | ""（空） |
| cq_ws_host | OneBot HTTP API 插件服务端地址 | 127.0.0.1 |
| cq_ws_port | OneBot HTTP API 插件服务端口 | 6700 |
| cq_bot_qq | OneBot HTTP API 登录的目标机器人 QQ 号 | 10000（示例值，必填） |
| twitter_consumer_key | Twitter App consumer_key | （必填） |
| twitter_consumer_secret |  Twitter App consumer_secret | （必填） |
| twitter_access_token_key | Twitter App access_token_key | （必填） |
| twitter_access_token_secret | Twitter App access_token_secret | （必填） |
| mode | 工作模式，0 为图文模式，1 为纯文本模式，2 为文<br />本附图模式 | 0 |
| playwright_ws_spec_endpoint | Playwright 配置拉取 URL，内容格式为：<br />`{<浏览器>:<开发工具 WebSocket 端点 URL>}` | [http://127.0.0.1:8080<br />/playwright-ws.json](http://127.0.0.1:8080/playwright-ws.json)<br />（示例值，模式 0 时必填） |
| resume_on_start | 是否在启动时从退出时的进度继续（拉取本应用非活<br />动时期错过的推文） | false |
| work_interval | 对单个订阅两次拉取更新的最少间隔时间（秒） | 60 |
| webshot_delay | 抓取网页截图时等待网页加载的延迟时长（毫秒） | 10000 |
| lockfile | 本地保存订阅信息以便下次启动时恢复 | subscriber.lock |
| redis | 是否启用 Redis 服务（当前用于去重和推文缓存） | true |
| redis_host | Redis 服务器地址 | 127.0.0.1 |
| redis_port | Redis 服务器端口 | 6379 |
| redis_expire_time | 用于去重的 Redis 发送状态缓存过期时间（秒）<br />（推文缓存当前固定为 24 小时） | 43200 |

示例文件在 [`config.example.json`](./config.example.json)，**此文件兼作默认值和开发时的类型定义模板，非生产环境不建议删除**

## 系统服务

可以使用 [`systemd`](./systemd) 目录里的服务文件设置成自动启动服务
```
$ cd
$ git clone https://mikeslab.dix.asia/gogs/Pirami/gocqhttp-twitter-bot
$ cd gocqhttp-twitter-bot
$ ./bootstrap_linux_amd64.sh
QQ:
Pass:
Done!
$ rsync -a systemd ~/.config/
$ systemctl --user daemon-reload
$ systemctl --user enable twitterbot.service
$ loginctl enable-linger
```
注：如果想在本地文件夹保存日志，请取消注释两个服务定义中相应的行，阅读时可以使用 `tail -f`

## Bug

- 好友消息的图片有可能会失效或直接无法接收（由于更换后台框架，暂时无法进行进一步处理）
- 视频为实验性功能，可能会有各种问题，如当前元信息缺失会导致预览时的尺寸和时长显示出错，放大后则正常

## Todo

- 重新实现基于 hash 的文件缓存和转推媒体去重
- 添加选项对时间线进行过滤（目前可以在搜索时指定一些条件，但无法用于订阅，具体请使用 `/help` 查看文档）
