我希望能够通过直接URL从收件箱中打开附件。因此,我尝试生成尊重文档https://developer.twitter.com/en/docs/direct-messages/message-attachments/guides/retrieving-media.html的Twitter OAuth标头,但响应始终是401 Unathorized,并且我不知道为什么。
我已从文档中完全准确地进行了所有步骤,并进行了仔细检查。所有人都应该工作,但是不能,我也不知道为什么。我从Twitter收到的每个回复都带有HTTP代码401。令牌绝对正确。
这不是重复的:我已经检查过类似的问题,即使我复制粘贴,它的代码也无法正常工作。我也不能使用亚伯拉罕的Twitteroauth库,因为它仅支持API和OAuth端点,不支持直接媒体链接。
此处创建授权标头的函数。您可以在此处查看完整的代码:https://pastebin.com/yBEVW9KN
<?php
function getAuthorizationHeader(string $url)
{
$params = array(
"oauth_consumer_key" => $this->consumer_key,
"oauth_nonce" => $this->getNonce(),
"oauth_signature_method" => "HMAC-SHA1",
"oauth_timestamp" => time(),
"oauth_token" => $this->access_token,
"oauth_version" => "1.0",
);
// Step 1. Percent encode.
$_temp = [];
foreach ($params as $key => $value) {
$_temp[rawurlencode($key)] = rawurlencode($value);
}
$params = $_temp;
// Step 2. Sort.
ksort($params);
// Step 3. Build DST
$dst = '';
foreach ($params as $key => $value) {
$dst .= $key . '=' . $value . '&';
}
$dst = rtrim($dst, '&');
// Step 4. Creating signature base string
$baseString = 'GET' . '&' . rawurlencode($url) . '&' . rawurlencode($dst);
// Step 5. Generating signature key
$signingKey = rawurlencode($this->consumer_secret) . '&' . rawurlencode($this->access_token_secret);
// Step 6. Finally, signature.
$signature = base64_encode(hash_hmac('sha1', $baseString, $signingKey, true));
// Step 7. Build header string.
$header[] = 'authorization: ';
$header[] = 'OAuth ';
// Maybe ordering important as well?
$header[] = 'oauth_consumer_key="' . $params['oauth_consumer_key'] . '",';
$header[] = 'oauth_nonce="' . $params['oauth_nonce'] . '",';
$header[] = 'oauth_signature="' . $signature . '",';
$header[] = 'oauth_signature_method="' . $params['oauth_signature_method'] . '",';
$header[] = 'oauth_timestamp="' . $params['oauth_timestamp'] . '",';
$header[] = 'oauth_token="' . $params['oauth_token'] . '",';
$header[] = 'oauth_version="' . $params['oauth_version'] . '"';
return implode('', $header);
}