【问题标题】:PHP - Twitter API - Request Corrupts When Using SpacesPHP - Twitter API - 使用空间时请求损坏
【发布时间】: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 来构建用于签名计算的查询字符串的整个部分?

标签: php api twitter encoding tweets


【解决方案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));
}

【讨论】:

  • 欣赏你!
猜你喜欢
  • 2022-01-06
  • 2014-05-04
  • 2011-07-14
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2013-06-08
  • 2013-08-19
相关资源
最近更新 更多