Php 推特API返回“;“无法验证您的身份”;如果URL中存在参数,则出错

Php 推特API返回“;“无法验证您的身份”;如果URL中存在参数,则出错,php,json,api,url,twitter,Php,Json,Api,Url,Twitter,我正在尝试通过OAuth 1.0a加载列表。 如果URL没有任何参数,例如: 作品:https://api.twitter.com/1.1/friends/list.json 不起作用:https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip\u status=true&include\u user\u entities=false 如果向其添加参数,则返回以下错误: 无法验证您的身份 原因可能是什么? 我的代码: 看起来您正在=符

我正在尝试通过OAuth 1.0a加载列表。 如果URL没有任何参数,例如:

作品:
https://api.twitter.com/1.1/friends/list.json

不起作用:
https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip\u status=true&include\u user\u entities=false

如果向其添加参数,则返回以下错误:

无法验证您的身份

原因可能是什么? 我的代码:


看起来您正在
=
符号上使用
rawurlencode
。将其转换为
%3D

因此,当您需要
cursor=-1
时,您将获得
cursor%3D-1


也许可以尝试简化函数,这样就不会对
=

进行编码。这是获取用户信息的示例代码

       require_once('oauth/twitteroauth.php'); 

$oauth_token='YOUR OAUTH TOKEN';
$oauth_token_secret='YOUR SECRET KEY';
function getConnectionWithAccessToken($oauth_token, $oauth_token_secret) {
  $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $oauth_token, $oauth_token_secret);
  return $connection;
}

$connection = getConnectionWithAccessToken($oauth_token, $oauth_token_secret);

$content = $connection->get('account/verify_credentials');

url也有参数,因此您应该尝试遵循以下步骤(在函数buildBaseString中):

  • 将HTTP方法转换为大写,并将输出字符串设置为该值
  • 将“&”字符追加到输出字符串
  • 百分比编码URL并将其附加到输出字符串
  • 将“&”字符追加到输出字符串
  • 百分比编码参数字符串并将其附加到输出 绳子
  • (摘自:)

    现在您有了这样一个编码的基本url:

    GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json%3Fcursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse&oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0
    
    也许你必须试着做到这一点:

    GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json&cursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse%26oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0
    

    您需要在OAuth头中包含参数。最好的方法是将它们从URL中分离出来

    $params = array(
        "cursor" => -1,
        "skip_status" => "true",
        "include_user_entities" => "false"
    );
    
    现在使用基本url构建基本字符串

    $url = 'https://api.twitter.com/1.1/friends/list.json'
    $oAuthHeaders = $oauth + $params;
    $base_info = buildBaseString($url, 'GET', $oAuthHeaders);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauthTokenSecret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oAuthHeaders['oauth_signature'] = $oauth_signature;
    
    最后,使用其他参数创建URL字符串:

    if ($params) {
       $finalURL = "$url?";
       foreach ($params as $key=>$param) {
           $finalURL .= rawurlencode($key) . "=" . rawurlencode($param) . "&";
       }
       $finalURL = substr($finalURL, 0, strlen($finalURL) - 1);
    }
    
    现在您已准备好发送整个包裹:

    $header = array(buildAuthorizationHeader($oAuthHeaders), 'Expect:');
    

    这对你有帮助吗?也许:
    $header = array(buildAuthorizationHeader($oAuthHeaders), 'Expect:');