PHP - Twitter API - 使用空间时请求损坏
Posted
技术标签:
【中文标题】PHP - Twitter API - 使用空间时请求损坏【英文标题】:PHP - Twitter API - Request Corrupts When Using Spaces 【发布时间】: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
来构建用于签名计算的查询字符串的整个部分?
【参考方案1】:
问题出在以下几行:
array_map('rawurlencode', $parameters);
array_map('rawurlencode', array_keys($parameters));
它们没有任何效果,因为您没有对返回值做任何事情。我建议删除它们并改为这样做:
$pstring = '';
foreach ($parameters as $key => $value)
$pstring .= sprintf("%s=%s&", rawurlencode($key), rawurlencode($value));
【讨论】:
欣赏你!以上是关于PHP - Twitter API - 使用空间时请求损坏的主要内容,如果未能解决你的问题,请参考以下文章
PHP 使用PHP从Twitter搜索API到MySQL数据库保存推文
使用 PHP Laravel 使用 Twitter API 获取授权用户详细信息