Twitter API ने त्रुटि 215, खराब प्रमाणीकरण डेटा लौटाया


110

मैं एक उपयोगकर्ता के लिए अनुयायियों की सूची प्राप्त करने के लिए ट्विटर के एपीआई के बाद कॉल करने की कोशिश कर रहा हूं।

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 पर काम कर रहा हूं। लेकिन जब मैं ऐसा करूंगा तो यहां जरूर पोस्ट करूंगा। और इससे पहले कि आप इसे प्राप्त करते हैं, तो कृपया साझा करें ...
दीप ढींगानी

1
क्या किसी ने ट्विटर oauth टूल पर ध्यान दिया है कि एक URL इसमें "/ 1.1" के साथ जेनरेट होता है, लेकिन cURL कमांड "oauth_version = 1.0" कहता है? dev.twitter.com/apps/XXXXXX/oauth?nid=10364
systemblogger

1
@systemblogger खैर, OAuth संस्करण और ट्विटर एपीआई संस्करण एक ही बात नहीं है। OAuth के लिए, वहाँ 1.0 और 2.0 एटीएम है, और मुझे खुशी है कि ट्विटर अभी भी 1.0 का उपयोग करता है।
वाल्सेक

यहाँ पहले हर एक को oauth2 / token api का उपयोग करने की आवश्यकता है और उसके बाद अनुयायियों / सूची api का उपयोग करने की आवश्यकता है। अन्य बुद्धिमान आपको यह त्रुटि मिलेगी। क्योंकि अनुयायियों / सूची एपीआई को प्रमाणीकरण की आवश्यकता होती है। स्विफ्ट इस लिंक का अनुसरण करें, 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" के कारण काम करता है। हमने नीचे पता लगाया है कि यह CURL SSL प्रमाणपत्र सत्यापन त्रुटि है, जिससे Twitter लाइब्रेरी हमेशा खाली प्रतिक्रिया देती है।
लुबोसद

11

एकमात्र समाधान जो मैंने अब तक पाया है:

  • ट्विटर डेवलपर पैनल में एप्लिकेशन बनाएं
  • अपने एप्लिकेशन (या उपयोगकर्ता खाते में आपका एप्लिकेशन) के साथ उपयोगकर्ता को अधिकृत करें और "oauth_token" और "oauth_token_secret" को सहेजें जो ट्विटर आपको देता है। इसके लिए TwitterOuth लाइब्रेरी का उपयोग करें, यह बहुत आसान है, लाइब्रेरी के साथ आने वाले उदाहरण देखें।
  • इस टोकन का उपयोग करके आप उपयोगकर्ता की ओर से प्रमाणित अनुरोध कर सकते हैं। आप इसे उसी लाइब्रेरी के साथ कर सकते हैं।

    // 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 पुस्तकालय का उपयोग कर । यदि आप पुराने कार्यान्वयन का उपयोग कर रहे हैं, तो नई TwitterOuth ऑब्जेक्ट के तुरंत बाद निम्न पंक्तियों को जोड़ा जाना चाहिए:

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

पहले 2 पंक्तियों को अब अब्राहम पुस्तकालय रीडमे फ़ाइल में प्रलेखित किया गया है, लेकिन 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 का उपयोग करके अपने एप्लिकेशन (और उपयोगकर्ता) को अधिकृत करें।

इसके बारे में ट्विटर डेवलपर्स प्रलेखन साइट पर अधिक पढ़ें :)


141
प्रलेखन साइट को संदर्भित करने से वास्तव में सवाल का जवाब नहीं मिलता है।
moluv00

4
@ moluv00 ओपी ने कहा: "मैं इस त्रुटि कोड से संबंधित प्रलेखन को खोजने के लिए प्रतीत नहीं कर सकता।"
स्ट्रॉसस्टूडियोज

4
आपने एक सामान्य लिंक क्यों पोस्ट किया? यह कोई उत्तर नहीं है।
ब्राइस फेवरे

5

ग्रुइक के जवाब ने नीचे के धागे में मेरे लिए काम किया।

{अंश | Zend_Service_Twitter - API v1.1 तैयार करें }

ZF 1.12.3 के साथ वर्कअराउंड कंज्यूमरके पास और कंज्यूमरसेक्रेट को ऑउथऑप्शन ऑप्शन में पास करना है, न कि ऑप्शंस में सीधे।

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

5

अपडेट करें: ट्विटर एपीआई 1 अब पदावनत है। उपरोक्त उत्तर का संदर्भ लें।

ट्विटर 1.1 उस वाक्य रचना (जब मैंने यह उत्तर लिखा है) के साथ काम नहीं करता है। 1 होना चाहिए, 1.1 नहीं। यह काम करेगा:

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


3
हाँ यह सही है। लेकिन ऐसा इसलिए क्योंकि ट्विटर के डॉक्यूमेंटेशन ने मुझे ऐसा करने का सुझाव दिया। ( dev.twitter.com/docs/api/1/get/followers/ids )। उन्होंने कहा कि संस्करण 1 पदावनत है और मुझे 1.1 पर जाना होगा। संस्करण 1 इस वेब सेवा के लिए निश्चित रूप से काम करता है। लेकिन मैं उलझन में था कि 1.1 मेरे लिए काम क्यों नहीं कर रहा है?
ढिंगानी

7
संस्करण 1 मार्च 2013 से 6 महीने की गिनती में पदावनत किया जाएगा, इसलिए मैं संस्करण 1.1 के लिए जाऊंगा
। वेबर

विभिन्न OAuth पुस्तकालयों का परीक्षण मैं ट्विटर Async से करता हूं , बस इस लाइन protected $apiVersion = '1.1';को फाइल में बदल रहा हूं EpiTwitter.php ट्विटर एपीआई संस्करण 1.1 के लिए ठीक काम करता है
। वेबर

2
Twitter API 1 को हटा दिया गया है
qasimzee

4
Twitter REST API v1 अब सक्रिय नहीं है। कृपया API v1.1 पर माइग्रेट करें। dev.twitter.com/docs/api/1.1/overview
इसकी जाजना

3

दो दिनों के शोध के बाद आखिरकार मैंने पाया कि इतने सार्वजनिक ट्वीट को एक्सेस करने के लिए आपको बस किसी की जरूरत है एप्लिकेशन क्रेडेंशियल की , न कि किसी विशेष उपयोगकर्ता की। इसलिए यदि आप एक ग्राहक के लिए विकसित हो रहे हैं, तो आपको उन्हें कुछ भी करने के लिए कहने की आवश्यकता नहीं है।

नए ट्विटर एपीआई 1.1 का उपयोग करने के लिए आपको दो चीजों की आवश्यकता है:

सबसे पहले, आपको (वास्तव में) अपने स्वयं के क्रेडेंशियल्स के साथ एक एप्लिकेशन बनाना होगा और फिर " आपकी पहुंच टोकन " अनुभाग से एक्सेस टोकन (OAUTH_TOKEN) और एक्सेस टोकन गुप्त (OAUTH_TOKEN_SECRET) प्राप्त करना होगा । फिर आप उन्हें नई TwitterOuth ऑब्जेक्ट के लिए निर्माता में आपूर्ति करते हैं। अब आप किसी के भी सार्वजनिक ट्वीट पर पहुँच सकते हैं ।

$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

आपको Zend_Service_Twitter को customerKey और customerSecret भेजना होगा

$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 का उपयोग करता है। यह काम कर रहा विन्यास:

$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
));

ऐसा लगता है कि ट्विटर एआई 1.0 1.0 ऑउथ संस्करण को 1.1 और 1.0 होने की अनुमति देता है, जहां ट्विटर एफी 1.1 को केवल ऑउथ संस्करण 1.0 होने की आवश्यकता है।

PS हम Zend_Service_Twitter का उपयोग नहीं करते हैं क्योंकि यह स्थिति अद्यतन पर कस्टम परमर्स भेजने की अनुमति नहीं देता है।


0

सुनिश्चित करें कि आपने ट्विटर में आवेदन के लिए पहुँच पढ़ी और लिखी है


0

मैं HybridAuth का उपयोग कर रहा हूं और ट्विटर से कनेक्ट होने में इस त्रुटि में चल रहा था। मैंने ट्विटर पर गलत तरीके से कैसड रिक्वेस्ट टाइप (गेट / पोस्ट की बजाय 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 );

साइड नोट: हाइब्रिड के मामले में निम्नलिखित भी नहीं होगा (क्योंकि हा आंतरिक रूप से अनुरोध के लिए सही ढंग से आवरण मूल्य प्रदान करता है):

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

0

मैं एक ही समस्या का सामना कर रहा था हर समय एकमात्र समाधान जो मैं समझ रहा हूं वह टाइप कर रहा है CONSUMER_KEYऔर CONSUMER_SECRETसीधे नए TwitterOuth क्लास डिफिनेशन में है।

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

इस पर वैरिएबल या स्टैटिक्स का उपयोग न करें और देखें कि क्या समस्या है।


0

यहाँ पहले हर एक को oauth2 / token api का उपयोग करने की आवश्यकता है और उसके बाद अनुयायियों / सूची api का उपयोग करने की आवश्यकता है ।
अन्य बुद्धिमान आपको यह त्रुटि मिलेगी। क्योंकि अनुयायियों / सूची एपीआई को प्रमाणीकरण की आवश्यकता होती है।

स्विफ्ट (मोबाइल ऐप के लिए) में भी मुझे यही समस्या थी।

यदि आप एपीआई जानना चाहते हैं और यह मानदंड इस लिंक का अनुसरण कर रहे हैं, तो ट्विटर मित्रों की सूची को तेज़ी से प्राप्त करें?


-1

मुझे पता है कि यह पुराना है, लेकिन कल मुझे इस मुद्दे का सामना करना पड़ा जब इस URL का उपयोग करके C # और HttpClient क्लास को बियरर प्रमाणीकरण टोकन के साथ कॉल किया गया:

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

यह पता चला है कि मेरे लिए समाधान HTTP के बजाय HTTPS का उपयोग करना था। तो मेरा URL इस तरह दिखाई देगा:

https : //api.twitter.com/1.1/followers/ids.json? कर्सर = -1 और स्क्रीन_नाम - उपयोगकर्ता नाम

तो यहाँ मेरे कोड का एक टुकड़ा है:

            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
im मिल रहा है{"errors":[{"message":"Bad Authentication data","code":215}]}
tq

@tq: इस उत्तर को देखें: stackoverflow.com/questions/12684765/…
alejosoft

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.