如何构建Twitter授权标头以从DM检索附件?

时间:2019-03-24 02:14:14

标签: php twitter twitter-oauth

我希望能够通过直接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);
}

0 个答案:

没有答案