81 lines
3.6 KiB
Markdown
81 lines
3.6 KiB
Markdown
# 每天抓取指定 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`,服务器关机错过的执行会在下次开机后补跑。
|