Twitter API แสดงข้อผิดพลาด 215 ข้อมูลการตรวจสอบสิทธิ์ไม่ถูกต้อง


110

ฉันพยายามโทรตาม API ของ Twitter เพื่อรับรายชื่อผู้ติดตามสำหรับผู้ใช้

http://api.twitter.com/1.1/followers/ids.json?cursor=-1&screen_name=username

และฉันได้รับข้อความแสดงข้อผิดพลาดนี้ในการตอบสนอง

{
    code = 215;
    message = "Bad Authentication data";
}

ฉันไม่พบเอกสารที่เกี่ยวข้องกับรหัสข้อผิดพลาดนี้ ใครมีความคิดเกี่ยวกับข้อผิดพลาดนี้


2
พวกเราหลายคนอยู่ในเรือลำเดียวกัน คุณสามารถแก้ไขปัญหานี้ได้หรือไม่? ฉันอยากเห็นโซลูชันสำหรับ 1.1 เนื่องจาก 1.0 กำลังเลิกใช้งาน
RCNeil

1
น่าเสียดายที่ฉันยังไม่สามารถหาวิธีแก้ปัญหาที่เหมาะสมได้ ตอนนี้ฉันกำลังทำงานกับเวอร์ชัน 1 แต่แน่นอนฉันจะโพสต์ไว้ที่นี่เมื่อฉันทำ และถ้าคุณได้รับก่อนหน้านั้นโปรดแบ่งปัน ...
Dip Dhingani

1
มีใครสังเกตเห็นบน Twitter oauth tool ว่ามี URL "/1.1" อยู่ แต่คำสั่ง cURL ระบุว่า "oauth_version = 1.0"? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger ดีเวอร์ชัน OAuth และเวอร์ชัน twitter API ไม่ใช่สิ่งเดียวกัน สำหรับ OAuth มี 1.0 และ 2.0 atm และฉันดีใจที่ Twitter ยังคงใช้ 1.0
Vlasec

ที่นี่ก่อนอื่นทุกคนต้องใช้ oauth2 / token api จากนั้นใช้ผู้ติดตาม / รายการ api ฉลาดอื่น ๆ คุณจะได้รับข้อผิดพลาดนี้ เนื่องจากผู้ติดตาม / รายชื่อ API ต้องการการตรวจสอบสิทธิ์ ใน Swift ตามลิงค์นี้stackoverflow.com/questions/12053159/…
iOS

คำตอบ:


26

รหัสที่กระชับมากโดยไม่มีไฟล์ php อื่น ๆ รวมถึง oauth เป็นต้นโปรดทราบว่าเพื่อรับคีย์ต่อไปนี้คุณต้องสมัครกับhttps://dev.twitter.comและสร้างแอปพลิเคชัน

<?php
$token = 'YOUR_TOKEN';
$token_secret = 'YOUR_TOKEN_SECRET';
$consumer_key = 'CONSUMER_KEY';
$consumer_secret = 'CONSUMER_SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '5'
);

$oauth = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_token' => $token,
    'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
    'oauth_timestamp' => time(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_version' => '1.0'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);

// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);

// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));

// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$url=str_replace("&amp;","&",$url); //Patch by @Frewuill

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));

// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
                  //CURLOPT_POSTFIELDS => $postfields,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);


foreach ($twitter_data as &$value) {
   $tweetout .= preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3" target="_blank">$1$2$4</a>', $value->text);
   $tweetout = preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $tweetout);
   $tweetout = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $tweetout);
}

echo $tweetout;

?>

ความนับถือ


ทำงานได้เนื่องจาก "CURLOPT_SSL_VERIFYPEER = false" เราได้ตรวจสอบว่าเป็นข้อผิดพลาดในการตรวจสอบใบรับรอง SSL ของ cURL ซึ่งทำให้ไลบรารี Twitter ส่งคืนการตอบสนองที่ว่างเปล่าเสมอ
lubosdz

11

ทางออกเดียวที่ฉันพบคือ:

  • สร้างแอปพลิเคชันในแผงผู้พัฒนา Twitter
  • ให้สิทธิ์ผู้ใช้ด้วยแอปพลิเคชันของคุณ (หรือแอปพลิเคชันของคุณในบัญชีผู้ใช้) และบันทึก "oauth_token" และ "oauth_token_secret" ซึ่ง Twitter ให้คุณ ใช้ไลบรารีTwitterOAuthสำหรับสิ่งนี้มันค่อนข้างง่ายดูตัวอย่างที่มาพร้อมกับไลบรารี
  • การใช้โทเค็นนี้คุณสามารถร้องขอการพิสูจน์ตัวตนในนามของผู้ใช้ คุณสามารถทำได้ด้วยไลบรารีเดียวกัน

    // Arguments 1 and 2 - your application static tokens, 2 and 3 - user tokens, received from Twitter during authentification  
    $connection = new TwitterOAuth(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, $tokens['oauth_token'], $tokens['oauth_token_secret']);  
    $connection->host = 'https://api.twitter.com/1.1/'; // By default library uses API version 1.  
    $friendsJson = $connection->get('/friends/ids.json?cursor=-1&user_id=34342323');  

สิ่งนี้จะส่งกลับรายชื่อเพื่อนของผู้ใช้


7

พบวิธี - ใช้ห้องสมุดอับราฮัม TwitterOAuth หากคุณกำลังใช้การใช้งานรุ่นเก่าควรเพิ่มบรรทัดต่อไปนี้หลังจากที่อ็อบเจ็กต์ TwitterOAuth ใหม่ถูกสร้างอินสแตนซ์:

$connection->host = "https://api.twitter.com/1.1/";
$connection->ssl_verifypeer = TRUE;
$connection->content_type = 'application/x-www-form-urlencoded';

2 บรรทัดแรกได้รับการบันทึกไว้ในไฟล์ Readme ของไลบรารี Abraham แล้ว แต่บรรทัดที่ 3 ไม่ใช่ ตรวจสอบให้แน่ใจด้วยว่า oauth_version ของคุณยังคงเป็น 1.0

นี่คือรหัสของฉันสำหรับการรับข้อมูลผู้ใช้ทั้งหมดจาก 'ผู้ใช้ / แสดง' ด้วยผู้ใช้ที่ได้รับการพิสูจน์ตัวตนใหม่และส่งคืนชื่อเต็มของผู้ใช้และไอคอนผู้ใช้ด้วย 1.1 - รหัสต่อไปนี้ถูกนำไปใช้ในไฟล์เรียกกลับการตรวจสอบความถูกต้อง:

session_start();
require ('twitteroauth/twitteroauth.php');
require ('twitteroauth/config.php');

$consumer_key = '****************';
$consumer_secret = '**********************************';

$to = new TwitterOAuth($consumer_key, $consumer_secret);

$tok = $to->getRequestToken('http://exampleredirect.com?twitoa=1');

$token = $tok['oauth_token'];
$secret = $tok['oauth_token_secret'];

//save tokens to session
$_SESSION['ttok'] = $token;
$_SESSION['tsec'] = $secret;

$request_link = $to->getAuthorizeURL($token,TRUE);

header('Location: ' . $request_link);

จากนั้นรหัสต่อไปนี้จะอยู่ในการเปลี่ยนเส้นทางหลังการตรวจสอบสิทธิ์และการร้องขอโทเค็น

if($_REQUEST['twitoa']==1){
    require ('twitteroauth/twitteroauth.php');
    require_once('twitteroauth/config.php');
    //Twitter Creds
    $consumer_key = '*****************';
    $consumer_secret = '************************************';

    $oauth_token = $_GET['oauth_token']; //ex Request vals->http://domain.com/twitter_callback.php?oauth_token=MQZFhVRAP6jjsJdTunRYPXoPFzsXXKK0mQS3SxhNXZI&oauth_verifier=A5tYHnAsbxf3DBinZ1dZEj0hPgVdQ6vvjBJYg5UdJI

    $ttok = $_SESSION['ttok'];
    $tsec = $_SESSION['tsec'];

    $to = new TwitterOAuth($consumer_key, $consumer_secret, $ttok, $tsec);
    $tok = $to->getAccessToken();
    $btok = $tok['oauth_token'];
    $bsec = $tok['oauth_token_secret'];
    $twit_u_id = $tok['user_id'];
    $twit_screen_name = $tok['screen_name'];

    //Twitter 1.1 DEBUG
    //print_r($tok);
    //echo '<br/><br/>';
    //print_r($to);
    //echo '<br/><br/>';
    //echo $btok . '<br/><br/>';
    //echo $bsec . '<br/><br/>';
    //echo $twit_u_id . '<br/><br/>';
    //echo $twit_screen_name . '<br/><br/>';

    $twit_screen_name=urlencode($twit_screen_name);
    $connection = new TwitterOAuth($consumer_key, $consumer_secret, $btok, $bsec);
    $connection->host = "https://api.twitter.com/1.1/";
    $connection->ssl_verifypeer = TRUE;
    $connection->content_type = 'application/x-www-form-urlencoded';
    $ucontent = $connection->get('users/show', array('screen_name' => $twit_screen_name));

    //echo 'connection:<br/><br/>';
    //print_r($connection);
    //echo '<br/><br/>';
    //print_r($ucontent);

    $t_user_name = $ucontent->name;
    $t_user_icon = $ucontent->profile_image_url;

    //echo $t_user_name.'<br/><br/>';
    //echo $t_user_icon.'<br/><br/>';
}

ฉันใช้เวลานานเกินไปกว่าจะคิดออก หวังว่านี่จะช่วยใครสักคน !!


5

URL ที่/1.1/อยู่ในนั้นถูกต้องเป็น Twitter API เวอร์ชัน 1.1 ใหม่

แต่คุณต้องมีแอปพลิเคชันและอนุญาตแอปพลิเคชันของคุณ (และผู้ใช้) โดยใช้ oAuth

อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในไซต์เอกสารของนักพัฒนา Twitter :)


141
การอ้างอิงไซต์เอกสารไม่ได้ตอบคำถามจริงๆ
moluv00

4
@ moluv00 OP กล่าวว่า: "ฉันไม่พบเอกสารที่เกี่ยวข้องกับรหัสข้อผิดพลาดนี้"
strangerstudios

4
ทำไมคุณถึงโพสต์ลิงก์ทั่วไป นี่ไม่ใช่คำตอบ
Brice Favre

5

คำตอบของ Gruik ใช้ได้ผลกับฉันในหัวข้อด้านล่าง

{ข้อความที่ตัดตอนมา | Zend_Service_Twitter - ทำให้ API v1.1 พร้อม }

ด้วย ZF 1.12.3 วิธีแก้ปัญหาคือการส่งผ่าน consumerKey และ consumerSecret ในตัวเลือก oauthOptions ไม่ใช่โดยตรงในตัวเลือก

    $options = array(
        'username' => /*...*/,
        'accessToken' => /*...*/,
        'oauthOptions' => array(
            'consumerKey' => /*...*/,
            'consumerSecret' => /*...*/,
        )
    );

5

อัปเด: Twitter API 1 เลิกใช้งานแล้ว อ้างถึงคำตอบด้านบน

Twitter 1.1 ไม่ทำงานกับไวยากรณ์นั้น (เมื่อฉันเขียนคำตอบนี้) ต้องเป็น 1 ไม่ใช่ 1.1 สิ่งนี้จะได้ผล:

http://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=username


3
ใช่ถูกต้อง แต่นั่นเป็นเพราะเอกสารของ Twitter แนะนำให้ฉันทำเช่นนั้น ( dev.twitter.com/docs/api/1/get/followers/ids ) พวกเขาบอกว่าเวอร์ชัน 1 เลิกใช้งานแล้วและฉันต้องย้ายไปที่ 1.1 เวอร์ชัน 1 ใช้งานได้แน่นอนสำหรับบริการเว็บนี้ แต่ฉันก็งงว่าทำไม 1.1 ถึงไม่เหมาะกับฉัน?
จุ่ม Dhingani

7
เวอร์ชัน 1 จะเลิกใช้งานใน 6 เดือนนับจากเดือนมีนาคม 2013 ดังนั้นฉันจึงเลือกใช้เวอร์ชัน 1.1
K Weber

การทดสอบไลบรารี OAuth ที่แตกต่างกันฉันยึดติดกับTwitter Asyncเพียงแค่เปลี่ยนบรรทัดนี้protected $apiVersion = '1.1';ในไฟล์ EpiTwitter.php ทำงานได้ดีสำหรับ Twitter API เวอร์ชัน 1.1
K. Weber

2
Twitter API 1 เลิกใช้งานแล้ว
qasimzee

4
Twitter REST API v1 ไม่ทำงานอีกต่อไป โปรดย้ายไปที่ API v1.1 dev.twitter.com/docs/api/1.1/overview .
itsazzad

3

หลังจากการวิจัยสองวันในที่สุดฉันก็พบว่าในการเข้าถึงทวีตสาธารณะคุณเพียงแค่ต้องมีข้อมูลรับรองแอปพลิเคชันใด ๆไม่ใช่ผู้ใช้รายนั้น ดังนั้นหากคุณกำลังพัฒนาสำหรับลูกค้าคุณไม่จำเป็นต้องขอให้พวกเขาทำอะไร

ในการใช้ Twitter API 1.1 ใหม่คุณต้องมีสองสิ่ง:

ขั้นแรกคุณสามารถ (ต้อง) สร้างแอปพลิเคชันด้วยข้อมูลรับรองของคุณเองจากนั้นรับโทเค็นการเข้าถึง (OAUTH_TOKEN) และโทเค็นลับการเข้าถึง (OAUTH_TOKEN_SECRET) จากส่วน " โทเค็นการเข้าถึงของคุณ " จากนั้นคุณจัดหาสิ่งเหล่านี้ในตัวสร้างสำหรับวัตถุ TwitterOAuth ใหม่ ตอนนี้คุณสามารถเข้าถึงทวีตสาธารณะได้ทุกคน

$connection = new TwitterOAuth( CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET );

$connection->host = "https://api.twitter.com/1.1/"; // change the default
$connection->ssl_verifypeer = TRUE;
$connection->content_type = 'application/x-www-form-urlencoded';

$tweets = $connection->get('http://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='.$username.'&count='.$count);

อันที่จริงฉันคิดว่านี่คือสิ่งที่พาเวลแนะนำเช่นกัน แต่ก็ไม่ชัดเจนจากคำตอบของเขา

หวังว่าจะช่วยคนอื่นได้ในสองวันนั้น :)


2

คุณต้องส่งcustomerKeyและcustomerSecretไปที่ Zend_Service_Twitter

$twitter = new Zend_Service_Twitter(array(
                'consumerKey' => $this->consumer_key,
                'consumerSecret' => $this->consumer_secret,
                'username' => $user->screenName,
                'accessToken' => unserialize($user->token)
));

2

สิ่งนี้อาจช่วยให้ผู้ที่ใช้ Zend_Oauth_Client ทำงานกับ twitter api ได้ การกำหนดค่าการทำงานนี้:

$accessToken = new Zend_Oauth_Token_Access();
$accessToken->setToken('accessToken');
$accessToken->setTokenSecret('accessTokenSecret');

$client = $accessToken->getHttpClient(array(
    'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
    'version' => '1.0', // it was 1.1 and I got 215 error.
    'signatureMethod' => 'HMAC-SHA1',
    'consumerKey' => 'foo',
    'consumerSecret' => 'bar',
    'requestTokenUrl' => 'https://api.twitter.com/oauth/request_token',
    'authorizeUrl' => 'https://api.twitter.com/oauth/authorize',
    'accessTokenUrl' => 'https://api.twitter.com/oauth/access_token',
    'timeout' => 30
));

ดูเหมือนว่า twitter api 1.0 จะอนุญาตให้เวอร์ชัน oauth เป็น 1.1 และ 1.0 โดยที่ twitter api 1.1 ต้องการเวอร์ชัน oauth เป็น 1.0 เท่านั้น

ป.ล. เราไม่ใช้ Zend_Service_Twitter เนื่องจากไม่อนุญาตให้ส่งพารามิเตอร์ที่กำหนดเองในการอัปเดตสถานะ



0

ฉันใช้HybridAuthและพบข้อผิดพลาดนี้ในการเชื่อมต่อกับ Twitter ฉันติดตามมันเพื่อที่ (ฉัน) ส่ง Twitter ประเภทคำขอที่ใส่ปลอกไม่ถูกต้อง (รับ / โพสต์แทน GET / POST)

สิ่งนี้จะทำให้เกิด 215:

$call = '/search/tweets.json';
$call_type = 'get';
$call_args = array(
    'q'           => 'pancakes',
    'count'       => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );

สิ่งนี้จะไม่:

$call = '/search/tweets.json';
$call_type = 'GET';
$call_args = array(
    'q'           => 'pancakes',
    'count'       => 5,
);
$response = $provider_api->api( $call, $call_type, $call_args );

หมายเหตุด้านข้าง: ในกรณีของ HybridAuth สิ่งต่อไปนี้จะไม่ทำเช่นกัน (เนื่องจาก HA ระบุค่าที่ระบุไว้อย่างถูกต้องสำหรับประเภทคำขอภายใน):

$call = '/search/tweets.json';
$call_args = array(
    'q'           => 'pancakes',
    'count'       => 5,
);
$response = $providers['Twitter']->get( $call, $call_args );

0

ฉันประสบปัญหาเดียวกันตลอดเวลาทางออกเดียวที่ฉันคิดออกคือการพิมพ์CONSUMER_KEYและCONSUMER_SECRETตรงไปยังการกำหนดคลาส TwitterOAuth ใหม่

$connection = new TwitterOAuth(  "MY_CK" , "MY_CS"  );

อย่าใช้ตัวแปรหรือสถิตยศาสตร์ในเรื่องนี้และดูว่าปัญหาคลี่คลายหรือไม่


0

นี่คือครั้งแรกที่ทุกคนจำเป็นต้องใช้OAuth2 / โทเค็น API แล้วใช้ติดตาม / API
ฉลาดอื่น ๆ คุณจะได้รับข้อผิดพลาดนี้ เนื่องจากผู้ติดตาม / รายชื่อ API ต้องการการตรวจสอบสิทธิ์

อย่างรวดเร็ว (สำหรับแอพมือถือ) ฉันก็ประสบปัญหาเดียวกันเช่นกัน

หากคุณต้องการทราบ api และพารามิเตอร์ตามลิงค์นี้Get twitter friends list in swift?


-1

ฉันรู้ว่านี่เก่า แต่เมื่อวานนี้ฉันประสบปัญหาเดียวกันเมื่อเรียก URL นี้โดยใช้ C # และคลาส HttpClient ด้วยโทเค็นการพิสูจน์ตัวตนของผู้ถือ:

http://api.twitter.com/1.1/followers/ids.json?cursor=-1&screen_name=username

ปรากฎว่าวิธีแก้ปัญหาสำหรับฉันคือใช้ HTTPS แทน HTTP ดังนั้น URL ของฉันจะมีลักษณะดังนี้:

https : //api.twitter.com/1.1/followers/ids.json? cursor = -1 & screen_name = ชื่อผู้ใช้

นี่คือตัวอย่างโค้ดของฉัน:

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://api.twitter.com/1.1/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Authorization", "Bearer **** YOUR BEARER TOKEN GOES HERE ****");

                var response = client.GetAsync("statuses/user_timeline.json?count=10&screen_name=username").Result;
                if (!response.IsSuccessStatusCode)
                {
                    return result;
                }
                var items = response.Content.ReadAsAsync<IEnumerable<dynamic>>().Result;
                foreach (dynamic item in items)
                {
                    //Do the needful
                }
            }

1
ฉันได้รับ{"errors":[{"message":"Bad Authentication data","code":215}]}
tq

@tq: ดูที่คำตอบนี้: stackoverflow.com/questions/12684765/…
alejosoft

-1

ลองใช้ twitter API explorerนี้คุณสามารถลงชื่อเข้าใช้ในฐานะนักพัฒนาและค้นหาสิ่งที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.