Я пытаюсь получить количество подписчиков от пользователя X в Twitter с помощью API версии 1.1
Код, который я использую, работает нормально. Что мне нужно, так это функция для получения конкретных данных, которые мне нужны из данных, которые предоставляет мне Twitter. В этом случае мне нужно ['followers_count']
,
Это PHP код:
<?php
$token = '*';
$token_secret = '*';
$consumer_key = '*';
$consumer_secret = '*';
$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/users/lookup.json'; // api call path$query = array( // query parameters
'screen_name' => 'ArianaGrande',
'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("&","&",$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, true);
echo "<pre>" . print_r($twitter_data, true) . "</pre>";
?>
Вот что я получаю из твиттера:
Array
(
[0] => stdClass Object
(
[id] => 34507480
[id_str] => 34507480
[name] => Ariana Grande
[screen_name] => ArianaGrande
[location] => Honeymoon ave.
[profile_location] =>
[description] =>
[url] => http://t.co/eUeupXB0LS
[entities] => stdClass Object
(
[url] => stdClass Object
(
[urls] => Array
(
[0] => stdClass Object
(
[url] => http://t.co/eUeupXB0LS
[expanded_url] => http://smarturl.it/ArianaMyEvrythnDlxDA
[display_url] => smarturl.it/ArianaMyEvryth…
[indices] => Array
(
[0] => 0
[1] => 22
)
)
)
)
[description] => stdClass Object
(
[urls] => Array
(
)
)
)
[protected] =>
[followers_count] => 23781983
[friends_count] => 68420
[listed_count] => 45204
[created_at] => Thu Apr 23 02:56:31 +0000 2009
[favourites_count] => 13627
[utc_offset] => -28800
[time_zone] => Pacific Time (US & Canada)
[geo_enabled] =>
[verified] => 1
[statuses_count] => 35968
[lang] => en
[status] => stdClass Object
(
[created_at] => Thu Jan 15 02:15:45 +0000 2015
[id] => 555548863310753794
[id_str] => 555548863310753794
[text] => god I love her @theellenshow http://t.co/kSCFRd6sBZ
[source] => Twitter for iPad
[truncated] =>
[in_reply_to_status_id] =>
[in_reply_to_status_id_str] =>
[in_reply_to_user_id] =>
[in_reply_to_user_id_str] =>
[in_reply_to_screen_name] =>
[geo] =>
[coordinates] =>
[place] =>
[contributors] =>
[retweet_count] => 11194
[favorite_count] => 20529
[entities] => stdClass Object
(
[hashtags] => Array
(
)
[symbols] => Array
(
)
[user_mentions] => Array
(
[0] => stdClass Object
(
[screen_name] => TheEllenShow
[name] => Ellen DeGeneres
[id] => 15846407
[id_str] => 15846407
[indices] => Array
(
[0] => 15
[1] => 28
)
)
)
[urls] => Array
(
[0] => stdClass Object
(
[url] => http://t.co/kSCFRd6sBZ
[expanded_url] => http://ellentube.com/videos/0-ma4x1e5a/
[display_url] => ellentube.com/videos/0-ma4x1…
[indices] => Array
(
[0] => 29
[1] => 51
)
)
)
)
[favorited] =>
[retweeted] =>
[possibly_sensitive] =>
[lang] => en
)
[contributors_enabled] =>
[is_translator] =>
[is_translation_enabled] => 1
[profile_background_color] => 000000
[profile_background_image_url] => http://pbs.twimg.com/profile_background_images/455946880426328064/EZaaKmcF.png
[profile_background_image_url_https] => https://pbs.twimg.com/profile_background_images/455946880426328064/EZaaKmcF.png
[profile_background_tile] => 1
[profile_image_url] => http://pbs.twimg.com/profile_images/554080800665112577/1AyXEQSF_normal.jpeg
[profile_image_url_https] => https://pbs.twimg.com/profile_images/554080800665112577/1AyXEQSF_normal.jpeg
[profile_banner_url] => https://pbs.twimg.com/profile_banners/34507480/1399852554
[profile_link_color] => AD92D1
[profile_sidebar_border_color] => 000000
[profile_sidebar_fill_color] => F6F6F6
[profile_text_color] => D8A0C1
[profile_use_background_image] => 1
[default_profile] =>
[default_profile_image] =>
[following] =>
[follow_request_sent] =>
[notifications] =>
)
)
Я должен был показать вам, как отформатировать print_r()
, таким образом, вывод (намного!) более читабелен. Вот как это сделать.
echo "<pre>" . print_r($twitter_data, true) . "</pre>";
В любом случае, по вашему выводу, похоже, что вы можете просто сделать это:
$followers_count = $twitter_data[0]->followers_count;
Важно понимать как это можно решить из этой отладки. Во-первых, вывод print_r
указывает, что возвращаемый объект является массивом, а первая запись является нулевым индексом, который выглядит так, как будто он перечисляет результаты поиска (в основном это так).
0-й элемент — это объект (это stdClass
) и не является массивом, поэтому искомая вещь должна быть найдена с помощью ссылки ->
оператор, а не индекс массива. Я предполагаю, что все элементы данных на результат поиска могут быть найдены как значение свойства этого объекта.
Кроме того, вы заметите, что некоторые элементы в этом объекте также являются объектами. Вы можете посмотреть их, используя другую ссылку, например:
$twitter_data[0]->entities->url;
Других решений пока нет …