Из-за выхода на пенсию Twitter API 1.0 с 11 июня 2013 года сценарий ниже не работает.
// Create curl resource $ch = curl_init(); // Set url curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10"); // Return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); // Close curl resource to free up system resources curl_close($ch); if ($output) { $tweets = json_decode($output,true); foreach ($tweets as $tweet) { print_r($tweet); } }
Как я могу получить user_timeline (последние статусы) с наименьшим кодом?
Я нашел это: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline, но я получаю следующую ошибку:
"{"errors":[{"message":"Could not authenticate you","code":32}]}"
Есть много классов, но после попытки нескольких из них, похоже, не работают из-за этих обновлений в Twitter, а некоторые из них – довольно продвинутые классы с множеством функциональных возможностей, которые мне действительно не нужны.
Каков самый простой / самый короткий способ получить последние статусы пользователей с помощью PHP?
Примечание: файлы для них находятся на GitHub .
Версия 1.0 в скором времени будет устаревать, а неавторизованные запросы не будут разрешены. Итак, вот сообщение, которое поможет вам сделать это, наряду с классом PHP, чтобы облегчить вашу жизнь.
1. Создайте учетную запись разработчика: настройте учетную запись разработчика на Twitter
Вам нужно посетить официальный сайт разработчика Twitter и зарегистрироваться для учетной записи разработчика. Это бесплатный и необходимый шаг для запросов на API v1.1.
2. Создайте приложение: создайте приложение на сайте разработчика Twitter.
Какие? Вы думали, что можете сделать неавторизованные запросы? Не с API v1.1 от Twitter. Вам нужно посетить http://dev.twitter.com/apps и нажать кнопку «Создать приложение».
На этой странице заполните все нужные детали. Для меня это не имело значения, потому что я просто хотел сделать загрузку блочных запросов, чтобы избавиться от подписчиков на спам. Дело в том, что вы получите набор уникальных ключей для вашего приложения.
Итак, целью создания приложения является предоставление вам (и Twitter) набора ключей. Эти:
Здесь немного информации о том, для чего нужны эти токены.
3. Создайте токены доступа : вам понадобятся эти успешные запросы
OAuth запрашивает несколько токенов. Поэтому вам нужно, чтобы они были созданы для вас.
Нажмите «Создать токен доступа» внизу. Затем, как только вы перейдете к нижней части, у вас появятся новые ключи. Вам нужно взять четыре ранее отмеченных ключа с этой страницы для вызовов API, поэтому запишите их где-нибудь.
4. Изменить уровень доступа : вы не хотите читать только для чтения, не так ли?
Если вы хотите использовать какой-либо подход к этому API, вам нужно будет изменить свои настройки на «Чтение и запись», если вы делаете что-то другое, кроме стандартного поиска данных, используя запросы GET .
Выберите вкладку «Настройки» в верхней части страницы.
Предоставьте доступ для чтения / записи вашего приложения и нажмите «Обновить» внизу.
Вы можете больше узнать о модели разрешения приложений, которую использует здесь Twitter.
5. Напишите код для доступа к API : я сделал большую часть этого для вас
Я объединил приведенный выше код с некоторыми изменениями и изменениями в PHP-класс, поэтому очень просто выполнить требуемые запросы.
Это использует OAuth и API v1.1 для Twitter и класс, который я создал, который вы можете найти ниже.
require_once('TwitterAPIExchange.php'); /** Set access tokens here - see: https://dev.twitter.com/apps/ **/ $settings = array( 'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN", 'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET", 'consumer_key' => "YOUR_CONSUMER_KEY", 'consumer_secret' => "YOUR_CONSUMER_SECRET" );
Убедитесь, что вы положили ключи из своего приложения выше в соответствующих местах.
Затем вам нужно выбрать URL-адрес, на который вы хотите отправить запрос. У Twitter есть своя документация по API, которая поможет вам выбрать, какой URL-адрес, а также тип запроса (POST или GET).
/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/ $url = 'https://api.twitter.com/1.1/blocks/create.json'; $requestMethod = 'POST';
В документации каждый URL указывает, что вы можете передать ему. Если мы используем URL-адреса «блоков», как указано выше, я могу передать следующие параметры POST:
/** POST fields required by the URL above. See relevant docs as above **/ $postfields = array( 'screen_name' => 'usernameToBlock', 'skip_status' => '1' );
Теперь, когда вы настроили то, что хотите сделать с API, пришло время сделать фактический запрос.
/** Perform the request and echo the response **/ $twitter = new TwitterAPIExchange($settings); echo $twitter->buildOauth($url, $requestMethod) ->setPostfields($postfields) ->performRequest();
И для запроса POST , вот и все!
Для запроса GET это немного отличается. Вот пример:
/** Note: Set the GET field BEFORE calling buildOauth(); **/ $url = 'https://api.twitter.com/1.1/followers/ids.json'; $getfield = '?username=J7mbo'; $requestMethod = 'GET'; $twitter = new TwitterAPIExchange($settings); echo $twitter->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest();
Пример конечного кода : для простого запроса GET для списка моих подписчиков.
$url = 'https://api.twitter.com/1.1/followers/list.json'; $getfield = '?username=J7mbo&skip_status=1'; $requestMethod = 'GET'; $twitter = new TwitterAPIExchange($settings); echo $twitter->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest();
Я поставил эти файлы на GitHub с благодарностью @ lackovic10 и @rivers! Надеюсь, кто-то сочтет это полезным; Я знаю, что сделал (я использовал его для массовой блокировки в цикле).
Кроме того, для тех, кто в Windows, которые испытывают проблемы с сертификатами SSL, посмотрите этот пост . Эта библиотека использует cURL под капотом, поэтому вам нужно убедиться, что у вас установлены ваши сертификаты cURL. Google – тоже ваш друг.
Перейдите на dev.twitter.com и создайте приложение . Это предоставит вам необходимые учетные данные. Вот реализация, которую я недавно написал с PHP и cURL .
<?php function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r)); } function buildAuthorizationHeader($oauth) { $r = 'Authorization: OAuth '; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=\"" . rawurlencode($value) . "\""; $r .= implode(', ', $values); return $r; } $url = "https://api.twitter.com/1.1/statuses/user_timeline.json"; $oauth_access_token = "YOURVALUE"; $oauth_access_token_secret = "YOURVALUE"; $consumer_key = "YOURVALUE"; $consumer_secret = "YOURVALUE"; $oauth = array( 'oauth_consumer_key' => $consumer_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0'); $base_info = buildBaseString($url, 'GET', $oauth); $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); $oauth['oauth_signature'] = $oauth_signature; // Make requests $header = array(buildAuthorizationHeader($oauth), 'Expect:'); $options = array( CURLOPT_HTTPHEADER => $header, //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); $twitter_data = json_decode($json); //print it out print_r ($twitter_data); ?>
Это можно запустить из командной строки:
$ php <name of PHP script>.php
Код, вставленный реками, замечательный. Большое спасибо! Я новичок здесь и не могу комментировать, я просто хочу ответить на вопрос от javiervd (как бы вы установили имя_экран и подсчитали с помощью этого подхода?), Поскольку я потерял много времени, чтобы понять это вне.
Вам нужно добавить параметры как к URL-адресу, так и к процессу создания подписи. Создание подписи – это статья, которая мне помогла. Вот мой код:
$oauth = array( 'screen_name' => 'DwightHoward', 'count' => 2, 'oauth_consumer_key' => $consumer_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); $options = array( CURLOPT_HTTPHEADER => $header, //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url . '?screen_name=DwightHoward&count=2', CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false );
Как указано в других ответах, создайте приложение Twitter, чтобы получить токен, ключ и секрет. Используя приведенный ниже код, вы можете изменять параметры запроса с одного места и избегать опечаток и подобных ошибок (изменить массив $request
в функции returnTweet()
).
function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r)); } function buildAuthorizationHeader($oauth) { $r = 'Authorization: OAuth '; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=\"" . rawurlencode($value) . "\""; $r .= implode(', ', $values); return $r; } function returnTweet(){ $oauth_access_token = "x"; $oauth_access_token_secret = "x"; $consumer_key = "x"; $consumer_secret = "x"; $twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me // create request $request = array( 'screen_name' => 'budidino', 'count' => '3' ); $oauth = array( 'oauth_consumer_key' => $consumer_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); // merge request and oauth to one array $oauth = array_merge($oauth, $request); // do some magic $base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth); $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); $oauth['oauth_signature'] = $oauth_signature; // make request $header = array(buildAuthorizationHeader($oauth), 'Expect:'); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); return json_decode($json, true); }
а затем просто вызовите returnTweet()
Спасибо, Крис!
Он работал для меня без использования параметров для запроса, когда я использовал несколько параметров, он показал мне ошибку: 32 Не удалось аутентифицировать вас.
Проблема для меня была в кодировке амперсандов. Итак, в вашем коде, где это следующая строка
$url .= "?".http_build_query($query);
Я добавил следующую строку ниже:
$url=str_replace("&","&",$url);
И он работал с использованием двух или более параметров, таких как screen_name и count.
Весь код выглядит так:
$token = 'YOUR TOKEN'; $token_secret = 'TOKEN SECRET'; $consumer_key = 'YOUR KEY'; $consumer_secret = 'KEY 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' => '2' ); $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);
Надежда Это помогает кому-то с той же проблемой, что и я.
Этот вопрос очень помог мне, но мне не удалось понять, что должно произойти. Это сообщение в блоге проделало потрясающую работу по прохождению меня через него.
Вот важные бит все в одном месте:
Я сочувствую всем головным болям, так что вот какой-то код, чтобы обернуть все это:
$token = 'YOUR TOKEN'; $token_secret = 'TOKEN SECRET'; $consumer_key = 'YOUR KEY'; $consumer_secret = 'KEY 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' => '2' ); $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); $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);
Если у вас установлена библиотека PHP OAuth, вам не нужно беспокоиться о формировании запроса самостоятельно.
$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI); $oauth->setToken($access_token, $access_secret); $oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json"); $twitter_data = json_decode($oauth->getLastResponse()); print_r($twitter_data);
Для получения дополнительной информации ознакомьтесь с документами или их примером . Вы можете использовать pecl install oauth
для получения библиотеки.
Прежде всего, я хотел поблагодарить jimbo и ( его простую библиотеку post / twitter-api-php).
Если вы собираетесь использовать API поиска / твитов GET с библиотекой PHP «twitter-api-php» (TwitterAPIExchange.php):
Во-первых, вам нужно просто прокомментировать «Выполнять POST-запрос и эхо-ответ».
Просто используйте команду «Выполнять запрос GET и эхо-ответ» и эхо-ответьте и измените эти две строки:
$url = 'https://api.twitter.com/1.1/followers/ids.json'; $getfield = '?screen_name=J7mbo';
в
$url = 'https://api.twitter.com/1.1/search/tweets.json'; $getfield = '?q=J7mbo';
(Измените screen_name
на q
, вот и все 🙂
Вам понадобится создать «приложение» в Твиттере (и для этого вам нужна учетная запись Twitter).
Затем вам нужно использовать OAuth для авторизации запроса в Twitter .
Вы можете использовать ресурс GET / user_timeline для получения списка последних твитов.
Вот краткое изложение для получения определенного количества твитов с вашей временной шкалы. Это в основном делает то же самое, что и другие примеры, только с меньшим количеством кода.
Просто заполните ключи и настройте $count
по своему вкусу:
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; $count = '10'; $oauth = array('count' => $count, 'oauth_consumer_key' => '[CONSUMER KEY]', 'oauth_nonce' => md5(mt_rand()), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_token' => '[ACCESS TOKEN]', 'oauth_version' => '1.0'); $oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', 'GET&' . rawurlencode($url) . '&' . rawurlencode(implode('&', array_map(function ($v, $k) { return $k . '=' . $v; }, $oauth, array_keys($oauth)))), '[CONSUMER SECRET]&[ACCESS TOKEN SECRET]', true)); $twitterData = json_decode(file_get_contents($url . '?count=' . $count, false, stream_context_create(array('http' => array('method' => 'GET', 'header' => 'Authorization: OAuth ' . implode(', ', array_map(function ($v, $k) { return $k . '="' . rawurlencode($v) . '"'; }, $oauth, array_keys($oauth))))))));
В этом случае вместо библиотеки cURL используются анонимные функции и file_get_contents
. Обратите внимание на использование хеширования MD5 nonce. Кажется, что все идут вместе с time()
nonce, однако большинство примеров в Интернете, касающихся OAuth, используют какую-то зашифрованную строку (например, эту: http://www.sitepoint.com/understanding-oauth-1/ ) , Это имеет смысл и для меня.
Обратите внимание: вам нужен PHP 5.3+ для анонимных функций (в случае, если ваш сервер / компьютер находится в какой-то пещере холодной войны, и вы не можете его обновить).
Из генератора сигнатур вы можете создавать команды curl
формы:
curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: OAuth oauth_consumer_key="YOUR_KEY", oauth_nonce="YOUR_NONCE", oauth_signature="YOUR-SIG", oauth_signature_method="HMAC-SHA1", oauth_timestamp="TIMESTAMP", oauth_token="YOUR-TOKEN", oauth_version="1.0"' --verbose
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET); $timelines = $connection->get('statuses/user_timeline', array('screen_name' => 'NSE_NIFTY', 'count' => 100, 'include_rts' => 1));
Благодаря этой теме, и особенно budidino, потому что его код – это то, что привело его домой для меня. Просто хотел сообщить, как получить данные JSON из запроса. Внесите изменения в массив запросов «// create request» части кода для выполнения разных запросов. В конечном итоге это приведет к выходу JSON на экран браузера
<?php function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r)); } function buildAuthorizationHeader($oauth) { $r = 'Authorization: OAuth '; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=\"" . rawurlencode($value) . "\""; $r .= implode(', ', $values); return $r; } function returnTweet(){ $oauth_access_token = "2602299919-lP6mgkqAMVwvHM1L0Cplw8idxJzvuZoQRzyMkOx"; $oauth_access_token_secret = "wGWny2kz67hGdnLe3Uuy63YZs4nIGs8wQtCU7KnOT5brS"; $consumer_key = "zAzJRrPOj5BvOsK5QhscKogVQ"; $consumer_secret = "Uag0ujVJomqPbfdoR2UAWbRYhjzgoU9jeo7qfZHCxR6a6ozcu1"; $twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me // create request $request = array( 'screen_name' => 'burownrice', 'count' => '3' ); $oauth = array( 'oauth_consumer_key' => $consumer_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); // merge request and oauth to one array $oauth = array_merge($oauth, $request); // do some magic $base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth); $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); $oauth['oauth_signature'] = $oauth_signature; // make request $header = array(buildAuthorizationHeader($oauth), 'Expect:'); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); return $json; } $tweet = returnTweet(); echo $tweet; ?>
If it is useful for anyone… In my blog I've implement the following PHP code in order to retrieve the last tweets, extract their most relevant data and then saved them into a MySQL database. It works because I got it in my blog.
The "tweets" table where store them:
CREATE TABLE IF NOT EXISTS `tweets` ( `tweet_id` int(11) NOT NULL auto_increment, `id_tweet` bigint(20) NOT NULL, `text_tweet` char(144) NOT NULL, `datetime_tweet` datetime NOT NULL, `dayofweek_tweet` char(3) NOT NULL, `GMT_tweet` char(5) NOT NULL, `shorturl_tweet` char(23) NOT NULL, PRIMARY KEY (`tweet_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;
get_tweets.php:
<?php function buildBaseString($baseURI, $method, $params) { $r= array(); ksort($params); foreach($params as $key=>$value){ $r[]= "$key=".rawurlencode($value); } return $method."&".rawurlencode($baseURI).'&'.rawurlencode(implode('&', $r)); } function buildAuthorizationHeader($oauth) { $r= 'Authorization: OAuth '; $values= array(); foreach($oauth as $key=>$value) { $values[]= "$key=\"".rawurlencode($value)."\""; } $r.= implode(', ', $values); return $r; } function returnTweets($last_id) { $oauth_access_token = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw"; $oauth_access_token_secret = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W"; $api_key = "ieDSTFH8QHHPafg7H0whQB9GaY"; $api_secret = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j"; $twitter_timeline = "user_timeline"; //[mentions_timeline/user_timeline/home_timeline/retweets_of_me] //create request $request= array( 'screen_name' => 'runs_ES', 'count' => '3', 'exclude_replies' => 'true' ); if (!is_null($last_id)) { //Add to the request if it exits a last_id $request['since_id']= $max_id; } $oauth = array( 'oauth_consumer_key' => $api_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); //merge request and oauth to one array $oauth= array_merge($oauth, $request); //do some magic $base_info= buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth); $composite_key= rawurlencode($api_secret).'&'.rawurlencode($oauth_access_token_secret); $oauth_signature= base64_encode(hash_hmac('sha1', $base_info, $composite_key, true)); $oauth['oauth_signature']= $oauth_signature; //make request $header= array(buildAuthorizationHeader($oauth), 'Expect:'); $options= array(CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed= curl_init(); curl_setopt_array($feed, $options); $json= curl_exec($feed); curl_close($feed); return $json; } function parse_tweettext($tweet_text) { $text= substr($tweet_text, 0, -23); $short_url= substr($tweet_text, -23, 23); return array ('text'=>$text, 'short_url'=> $short_url); } function parse_tweetdatetime($tweetdatetime) { //Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat $months= array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06', 'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12'); $GMT= substr($tweetdatetime, -10, 5); $year= substr($tweetdatetime, -4, 4); $month_str= substr($tweetdatetime, 4, 3); $month= $months[$month_str]; $day= substr($tweetdatetime, 8, 2); $dayofweek= substr($tweetdatetime, 0, 3); $time= substr($tweetdatetime, 11, 8); $date= $year.'-'.$month.'-'.$day; $datetime= $date.' '.$time; return array('datetime'=>$datetime, 'dayofweek'=>$dayofweek, 'GMT'=>$GMT); //datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +#### } //First check in the database the last id tweet: $query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;"; $result= exec_query($query); $row= mysql_fetch_object($result); if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results $last_id= $row->id_last; } else { $last_id= null; } $json= returnTweets($last_id); $tweets= json_decode($json, TRUE); foreach ($tweets as $tweet) { $tweet_id= $tweet['id']; if (!empty($tweet_id)) { //if array is not empty $tweet_parsetext= parse_tweettext($tweet['text']); $tweet_text= utf8_encode($tweet_parsetext['text']); $tweet_shorturl= $tweet_parsetext['short_url']; $tweet_parsedt= parse_tweetdatetime($tweet['created_at']); $tweet_datetime= $tweet_parsedt['datetime']; $tweet_dayofweek= $tweet_parsedt['dayofweek']; $tweet_GMT= $tweet_parsedt['GMT']; //Insert the tweet into the database: $fields = array( 'id_tweet' => $tweet_id, 'text_tweet' => $tweet_text, 'datetime_tweet' => $tweet_datetime, 'dayofweek_tweet' => $tweet_dayofweek, 'GMT_tweet' => $tweet_GMT, 'shorturl_tweet' => $tweet_shorturl ); $new_id= mysql_insert('tweets', $fields); } } //end of foreach ?>
The function to save the tweets:
function mysql_insert($table, $inserts) { $keys = array_keys($inserts); exec_query("START TRANSACTION;"); $query= 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $inserts).'\')'; exec_query($query); $id= mysql_insert_id(); if (mysql_error()) { exec_query("ROLLBACK;"); die("Error: $query"); } else { exec_query("COMMIT;"); } return $id; }