PHP - Twitter API - 使用空格时请求损坏

PHP - Twitter API - Request Corrupts When Using Spaces

我正在编写一个使用 Twitter API 到 post 推文的脚本。这是一个非常简单的服务,所以我选择使用一个函数而不是使用整个库。

函数如下所示:

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 上进行 post 编辑,而 Testing testing! 未通过并且 Twitter returns 错误 32“无法验证您的身份”。

我认为这是某种编码问题,否则就不会 post 这个词。我尝试将 urlencoderawurlencode 添加到 $content,但没有成功。

可能是什么问题?

问题来自这些行:

array_map('rawurlencode', $parameters);
array_map('rawurlencode', array_keys($parameters));

它们没有效果,因为您没有对 return 值进行任何操作。我建议删除它们并改为这样做:

$pstring = '';
foreach ($parameters as $key => $value) {
    $pstring .= sprintf("%s=%s&", rawurlencode($key), rawurlencode($value));
}