# 每天抓取指定 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 Labelcom.local.fetch-x ProgramArguments /usr/bin/python3 /Users/YOU/Work/fetch_x/fetch_x_posts.py @OpenAI@XDevelopers WorkingDirectory/Users/YOU/Work/fetch_x EnvironmentVariables X_BEARER_TOKENYOUR_BEARER_TOKEN StartCalendarIntervalHour9Minute0 StandardOutPath/Users/YOU/Work/fetch_x/fetch-x.log StandardErrorPath/Users/YOU/Work/fetch_x/fetch-x-error.log ``` 加载并立即验证一次: ```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`,服务器关机错过的执行会在下次开机后补跑。