| 错误 | 日志关键词 | 原因 | 解决方案 |
|---|---|---|---|
| Cookie 过期 | Redirected to login page |
登录态失效 | 重新导出 Cookie 到 cookies/twitter.json,然后 docker compose restart |
| 账号限制 | auth error code 32 |
Twitter 临时/永久限制 | 等待解限或更换浏览账号 |
| 账号锁定 | auth error code 326 |
需要验证 | 手动登录完成验证后重新导出 Cookie |
| 网络错误 | Network error reaching Twitter |
当前机器无法访问 x.com | 运行 curl -sI https://x.com,如超时则所在地区被封锁,需更换网络环境 |
| 无 XHR 响应 | No UserTweets XHR captured |
页面未正常加载 | 检查网络连通性、Twitter 是否可达 |
| Cookie 文件缺失 | Cookie file not found |
cookies/twitter.json 不存在 | 导出 Cookie 到 cookies/twitter.json |
| 目标页 404 | page.goto 异常 |
用户名错误或账号被封 | 检查 config.yaml 中的用户名 |
| 错误码 | 日志关键词 | 原因 | 解决方案 |
|---|---|---|---|
| 220009 | daily limit reached |
日发帖上限 | 无需处理,午夜自动重置 |
| 220003 | API key error |
Key 无效 | 重新申请 API Key |
| 220004 | API key error |
权限不足 | 联系币安客服 |
| 20002 | sensitive content |
内容含敏感词 | 推文自动跳过,无需处理 |
| 20022 | sensitive content |
审核未通过 | 同上 |
| 20013 | content too long |
超长 | 自动截断重试,通常成功 |
| 错误 | 日志关键词 | 原因 | 解决方案 |
|---|---|---|---|
| 401 | Discord API error 401 |
Bot Token 无效 | 检查 .env 中的 DISCORD_BOT_TOKEN |
| 403 | Discord API error 403 |
Bot 无权发消息 | 检查 Bot 在目标频道的权限 |
| 404 | Discord API error 404 |
Channel ID 错误 | 检查 .env 中的 DISCORD_CHANNEL_ID |
-
使用 health_check 快速诊断
# 从 skill 包目录运行 python3 scripts/health_check.py --project-dir ~/twitter-sync
-
或手动检查游标位置
docker exec twitter-sync python -c " from modules.db import get_sync_state print('last_tweet_id:', get_sync_state('last_tweet_id')) print('halt_today:', get_sync_state('halt_publishing_today')) "
- 如果
halt_today = 1:日限额已触发,等午夜重置 - 如果游标 ID 很大:所有推文已在游标之前,等新推文
- 如果
-
检查过滤结果
docker exec twitter-sync python main.py --test看每条推文的 PASS/DROP 状态
- 确认 Bot 已加入服务器且有目标频道的发消息权限
- 运行测试模式检查:
docker exec twitter-sync python main.py --test - 查看日志中是否有 Discord 相关错误:
docker logs twitter-sync 2>&1 | grep -i discord
- 检查
config.yaml中max_content_length设置 - 查看数据库中的
content_clean字段:docker exec twitter-sync python -c " import sqlite3 conn = sqlite3.connect('./db/state.sqlite') conn.row_factory = sqlite3.Row rows = conn.execute('SELECT tweet_id, content_clean FROM tweets ORDER BY rowid DESC LIMIT 5').fetchall() for r in rows: print(f'{r[\"tweet_id\"]}: {r[\"content_clean\"][:100]}') "
正常不应发生(有 F-00 去重)。如果发生:
- 检查数据库文件是否被意外删除(
db/state.sqlite) - 确认
docker-compose.yml中dbvolume 已正确挂载
# 查看退出原因
docker inspect twitter-sync --format='{{.State.ExitCode}}'
docker logs --tail 30 twitter-sync常见原因:
- OOM Kill:在
docker-compose.yml中调大deploy.resources.limits.memory或升级 VPS - Python 异常:查看日志修复代码
- 配置错误:运行
python3 validate_config.py
如果 db/state.sqlite 被意外删除或损坏:
# 1. 停止服务
docker compose down
# 2. 如果有备份则恢复
cp db/state.sqlite.bak db/state.sqlite
# 3. 如果没有备份,删除损坏文件让服务重建
rm -f db/state.sqlite
# 4. 重新启动(会自动创建新数据库)
docker compose up -d
# 注意:新数据库意味着:
# - 游标重置:首次运行只处理当天推文,不会重复发布历史推文
# - 去重记录丢失:如果当天有已发布的推文,可能重复发布# 检查磁盘空间
df -h
# 清理 Docker 缓存释放空间
docker system prune -f
# 重新构建
docker compose up -d --build如果是网络问题导致基础镜像拉取失败,参见 vps-deployment-guide.md 中的「构建失败排查」部分。
cp db/state.sqlite db/state.sqlite.bakdocker exec twitter-sync python -c "
from modules.db import set_sync_state
set_sync_state('last_tweet_id', '')
print('Cursor reset')
"
docker compose restartdocker exec twitter-sync python -c "
from modules.db import set_sync_state
set_sync_state('halt_publishing_today', '0')
print('Daily halt reset')
"docker exec twitter-sync python -c "
from modules.db import get_daily_stats
stats = get_daily_stats()
for k, v in stats.items():
print(f'{k}: {v}')
"