Files

81 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 每天抓取指定 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`,服务器关机错过的执行会在下次开机后补跑。