You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Twitter API获取用户时间线遇Timestamp out of bounds错误排查

解答你的Twitter API Timestamp错误问题

Hey there! Let's clear up your confusion first: 错误码135不是Token过期导致的。Twitter的Token过期错误通常是code:89,而code:135明确指向「时间戳超出允许范围」,核心问题出在OAuth签名的时间同步或者参数静态化上。

为什么会出现这个错误?

Twitter的OAuth 1.0认证对请求的时间同步要求非常严格——你的服务器时间和Twitter服务器时间的偏差不能超过15分钟左右。另外看你的代码,Authorization头里的oauth_timestamp、oauth_nonce甚至oauth_signature都是硬编码的固定值:

"authorization: OAuth oauth_consumer_key=\"XXXXXXX\",oauth_token=\"XXXXXXX\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"XXXXXXX\",oauth_nonce=\"XXXXXXXX\",oauth_version=\"1.0\",oauth_signature=\"XXXXXXX\""

这绝对是问题所在:

  • oauth_timestamp必须是当前请求时刻的Unix时间戳(秒级),不能用固定值
  • oauth_nonce是每次请求唯一的随机字符串,用来防止重放攻击,也不能固定
  • oauth_signature是基于timestamp、nonce、请求URL等参数计算出来的签名,只要前面的参数变了,签名必须重新生成,硬编码的签名只会在第一次请求时有效

如何修复?

1. 改用成熟的OAuth库(推荐)

手动处理OAuth 1.0的签名很容易出错,建议使用PHP社区维护的Twitter OAuth库,比如abraham/twitteroauth。它会自动帮你生成正确的timestamp、nonce和签名,不用手动拼接请求头。

示例代码(用该库):

require_once('twitteroauth/autoload.php');
use Abraham\TwitterOAuth\TwitterOAuth;

$consumerKey = '你的Consumer Key';
$consumerSecret = '你的Consumer Secret';
$accessToken = '你的Access Token';
$accessTokenSecret = '你的Access Token Secret';

$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
$connection->setTimeouts(30, 30); // 设置超时

$params = ['screen_name' => 'twitterapi'];
$response = $connection->get('statuses/user_timeline', $params);

if ($connection->getLastHttpCode() !== 200) {
    echo "请求错误: " . json_encode($response);
} else {
    echo json_encode($response);
}

2. 手动修复你的现有代码(不推荐,但适合理解原理)

如果坚持自己写cURL,必须动态生成关键参数:

  • 生成当前Unix时间戳:$timestamp = time();
  • 生成随机nonce:$nonce = uniqid(mt_rand(), true);
  • 重新计算HMAC-SHA1签名(这部分比较复杂,需要按照OAuth 1.0的签名规范拼接参数、排序、编码后再签名)

另外,务必确保你的后台服务器开启NTP时间同步,让服务器时间和全球标准时间保持一致,避免时间偏差触发这个错误。

后台运行的建议

如果要把这个请求作为后台任务运行:

  • 用系统的cron(Linux)或任务计划(Windows)定期触发脚本,避免长时间运行的进程
  • 添加错误重试机制:如果遇到135错误,先尝试同步服务器时间,再重试请求
  • 记录日志:把请求的时间、响应状态、错误信息写入日志文件,方便排查问题
  • 避免频繁请求:遵守Twitter API的速率限制(statuses/user_timeline的速率限制是15分钟内900次请求)

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:14