问题:bird CLI 用 Node.js 原生 fetch(),不走 HTTP_PROXY, 导致需要代理的用户(如 Windows + 本地代理)完全无法使用。 修复: 1. 自动代理注入:检测到 HTTP_PROXY/HTTPS_PROXY 时,通过 undici 的 EnvHttpProxyAgent 让 Node.js fetch 自动走代理,用户无需任何额外配置 2. doctor 检测:实际跑 bird whoami 测连通性,失败时给出具体原因 3. search fallback:bird 搜索失败时自动 fallback 到 Exa 4. install:自动安装 undici(npm install -g undici) 5. 新增 troubleshooting.md:常见问题解决方案 Fixes #9
2.8 KiB
2.8 KiB
Troubleshooting / 常见问题
Twitter/X: bird CLI "fetch failed"
症状: bird whoami 或 bird search 返回 "fetch failed"
原因: bird CLI 使用 Node.js 原生 fetch() 发请求,而 Node.js 的 fetch 不走系统代理(不读取 HTTP_PROXY/HTTPS_PROXY 环境变量)。如果你的网络环境需要代理才能访问 x.com,bird 就连不上。
解决方案(按推荐顺序):
方案 1:使用透明代理 / TUN 模式(推荐)
让代理工具接管所有网络流量,这样 bird 的 fetch 也会走代理:
- Clash Verge / Clash for Windows: 开启 TUN 模式或系统代理
- Proxifier(Windows): 添加规则让 Node.js 进程走代理
- macOS: 在 Surge/ClashX Pro 中开启增强模式
方案 2:验证 Cookie 有效性
确认 Cookie 没过期:
- 在浏览器里正常登录 x.com
- 用 Cookie-Editor 重新导出 Header String
- 重新配置:
agent-reach configure twitter-cookies "新的Cookie"
方案 3:不用 bird,用 Exa 搜索替代
Agent Reach 在 bird 失败时会自动 fallback 到 Exa 搜索。Exa 支持搜索 x.com 上的内容,虽然不如 bird 实时,但不受代理限制:
agent-reach search-twitter "query" # bird 失败时自动用 Exa
agent-reach search "site:x.com query" # 直接用 Exa 搜索
方案 4:配置 Node.js 全局代理(高级)
安装 global-agent 让 Node.js 的 fetch 走代理:
npm install -g global-agent
然后在运行 bird 前设置环境变量:
# Linux / macOS
export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:7890
export NODE_OPTIONS="--require global-agent/bootstrap"
bird search "test"
# Windows (PowerShell)
$env:GLOBAL_AGENT_HTTP_PROXY = "http://127.0.0.1:7890"
$env:NODE_OPTIONS = "--require global-agent/bootstrap"
bird search "test"
⚠️ 注意:这个方案需要每次运行 bird 前都设置环境变量,不太方便。推荐用方案 1。
Boss直聘: "访问行为异常"
症状: mcp-bosszp 登录成功,但 API 请求返回"您的访问行为异常"
原因: Boss直聘的反爬机制会检测请求指纹(不只是 IP),Python requests 库的特征与真实浏览器不同。
解决方案:
- 本地电脑: 正常使用,一般不会被拦
- 服务器: 使用 Jina Reader 读取职位页面 + Exa 搜索职位信息作为替代
Instagram: Checkpoint / 安全验证
症状: instaloader --login 触发 Instagram 安全验证
原因: Instagram 检测到从未见过的设备/位置登录。
解决方案:
- 在自己的浏览器登录 Instagram
- 用 Cookie-Editor 导出 Cookie
- 配置:
agent-reach configure instagram-cookies "sessionid=xxx; csrftoken=yyy; ..."