Add scheduled X post fetcher deployment

This commit is contained in:
shenlei
2026-07-31 18:33:14 +09:00
parent 9fba699ece
commit 4e0a694696
7 changed files with 327 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
# 每天抓取指定 X 账号推文
这个项目提供一个零第三方依赖的 Python 脚本,使用 **X 官方 API v2** 查询指定账号的近期原创推文,并去重存入本地 SQLite 数据库。不会抓取私密账号,也默认排除转推。
## 配置并手动运行
1. 在 [X Developer Console](https://developer.x.com/) 创建有 API 访问权限的项目,并取得 Bearer Token。
2. 复制环境变量示例并填入 token(不要把 `.env` 提交到 Git):
```sh
cp .env.example .env
```
3. 运行:
```sh
set -a; source .env; set +a
python3 fetch_x_posts.py @OpenAI @XDevelopers
```
首次运行默认取过去 24 小时;可用 `--initial-lookback-hours 168` 取最多 7 天。之后的运行会从上次成功时间向前回退 5 分钟查询,SQLite 的主键去重保证不会重复保存。
数据保存在 `x_posts.db``posts` 表包含正文、发布时间、公开互动指标、原始 API JSON 和可直接打开的链接。查看最近记录:
```sh
sqlite3 x_posts.db 'SELECT username, created_at, text, url FROM posts ORDER BY created_at DESC LIMIT 20;'
```
## macOS 每天定时(推荐)
将下面内容存为 `~/Library/LaunchAgents/com.local.fetch-x.plist`,把其中的项目路径和账号改成自己的;token 请直接填入 `EnvironmentVariables`,或改为调用一个仅自己可读的 wrapper 脚本。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.local.fetch-x</string>
<key>ProgramArguments</key><array>
<string>/usr/bin/python3</string>
<string>/Users/YOU/Work/fetch_x/fetch_x_posts.py</string>
<string>@OpenAI</string><string>@XDevelopers</string>
</array>
<key>WorkingDirectory</key><string>/Users/YOU/Work/fetch_x</string>
<key>EnvironmentVariables</key><dict>
<key>X_BEARER_TOKEN</key><string>YOUR_BEARER_TOKEN</string>
</dict>
<key>StartCalendarInterval</key><dict><key>Hour</key><integer>9</integer><key>Minute</key><integer>0</integer></dict>
<key>StandardOutPath</key><string>/Users/YOU/Work/fetch_x/fetch-x.log</string>
<key>StandardErrorPath</key><string>/Users/YOU/Work/fetch_x/fetch-x-error.log</string>
</dict></plist>
```
加载并立即验证一次:
```sh
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.local.fetch-x.plist
launchctl kickstart -k gui/$(id -u)/com.local.fetch-x
```
X 的“recent search”接口只能检索最近 7 天的推文,且实际 API 权限、额度和速率限制取决于你的 X 开发者套餐。官方接口文档见 [Search recent Posts](https://docs.x.com/x-api/posts/search-recent-posts)。
## 部署到 Linux 服务器(systemd
以下步骤适用于 Ubuntu/Debian 等使用 systemd 的服务器。把整个项目上传到服务器后,在项目目录执行:
```sh
sudo bash deploy/install-linux.sh
sudoedit /etc/fetch-x/fetch-x.env
```
在环境文件中写入一行 `X_BEARER_TOKEN=你的token`,然后把 [deploy/fetch-x.service](deploy/fetch-x.service) 的账号参数 `@OpenAI @XDevelopers` 换成目标账号并重载:
```sh
sudo systemctl daemon-reload
sudo systemctl start fetch-x.service
sudo journalctl -u fetch-x.service -n 100 --no-pager
systemctl list-timers fetch-x.timer
```
默认每天服务器本地时间 09:00 运行,修改 [deploy/fetch-x.timer](deploy/fetch-x.timer) 的 `OnCalendar` 后执行 `sudo systemctl daemon-reload && sudo systemctl restart fetch-x.timer`。定时器设有 `Persistent=true`,服务器关机错过的执行会在下次开机后补跑。