【发布时间】:2021-06-16 18:55:51
【问题描述】:
我正在编写一个利用 Twitter API 发布推文的脚本。这是一个非常小的服务,所以我选择使用单个函数而不是使用整个库。
这是函数的样子:
function postTweet($content, $method = 'POST') {
$consumer_key = '';
$consumer_secret = '';
$access_token = '';
$access_secret = '';
$nonce = md5(mt_rand(1, 10000000));
$tstamp = time();
$uri = 'https://api.twitter.com/1.1/statuses/update.json';
$data = array('status' => $content);
$ch = curl_init();
$parameters = [
"oauth_consumer_key" => $consumer_key,
"oauth_nonce" => $nonce,
"oauth_signature_method" => "HMAC-SHA1",
"oauth_timestamp" => $tstamp,
"oauth_token" => $access_token,
"oauth_version" => "1.0"
];
$base = $method.'&'.rawurlencode($uri).'&';
$parameters = array_merge($parameters, $data);
array_map('rawurlencode', $parameters);
array_map('rawurlencode', array_keys($parameters));
$pstring = '';
foreach ($parameters as $key => $value) {
$pstring .= sprintf("%s=%s&", $key, $value);
}
$pstring = substr($pstring, 0, strlen($pstring) - 1);
$base .= rawurlencode($pstring);
$signingKey = rawurlencode($consumer_secret).'&'.rawurlencode($access_secret);
$signature = base64_encode(hash_hmac('sha1', $base, $signingKey, true));
$options = [
CURLOPT_URL => $uri,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
sprintf('Authorization: OAuth oauth_consumer_key="%s", oauth_nonce="%s", oauth_signature="%s", oauth_signature_method="HMAC-SHA1", oauth_timestamp="%d", oauth_token="%s", oauth_version="1.0"', $consumer_key, $nonce, rawurlencode($signature), $tstamp, $access_token)
]
];
curl_setopt_array($ch, $options);
if($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
}
if ($data !== null && $method == 'POST') {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}
return json_decode(curl_exec($ch), true);
}
它有效,但仅适用于一个单词。 Testing! 通过并正在 Twitter 上发布,而 Testing testing! 没有通过,Twitter 返回错误 32“无法验证您的身份。”。
我认为这是某种编码问题,否则它不会发布这个词。我尝试将urlencode 和rawurlencode 添加到$content,但没有成功。
可能是什么问题?
【问题讨论】:
-
哦,那里有很多零碎的 URL 编码……你为什么不使用
http_build_query来构建用于签名计算的查询字符串的整个部分?
标签: php api twitter encoding tweets