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“无法验证您的身份。”。

我认为这是某种编码问题,否则它不会发布这个词。我尝试将urlencoderawurlencode 添加到$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+JSON+Twitter API

使用 PHP Laravel 使用 Twitter API 获取授权用户详细信息

Twitter api - 可以发帖吗?

无法使用 Twitter API、PHP 和 curl 发布图像和文本?媒体/上传和状态/更新

使用PHP将twitter搜索API中的tweets保存到MySQL数据库中