Intereting Posts
Как организовать различные версии REST API-контроллеров в Laravel 4? Как безопасно хранить пароли, используемые для входа на сторонние веб-сайты Ограничение символов до определенной ширины PHP 5.4 на Linux: как подключиться к MS SQL Server 2008? Кто-нибудь может предоставить расширение uploadprogress.dll для php 5.3.0? Проблемы с добавлением cURL в поддержку двигателя запроса OAuth Функция PHP и MySQL удаляет неконтролируемые категории из проблемы с базой данных Всплывающее окно JavaScript из формы Codeigniter; Класс активных записей Как бы вы выполнили вызов `debug_token`, используя facebook php sdk? Проверьте, существует ли многомерный массив «run-time» preg_match_all () – проблема с получением строки для соответствия в цикле foreach Как скрыть элементы (с плавным переходом) по классу с помощью javascript? CakePHP 2.0: соединение с базой данных «Mysql» отсутствует или не может быть создано Почему MySQL-соединение блокируется из-за многих ошибок подключения?

Простейший пример PHP для извлечения user_timeline с API-интерфейсом Twitter версии 1.1

Из-за выхода на пенсию 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?

Итак, вы хотите использовать API-интерфейс Twitter v1.1?

Примечание: файлы для них находятся на 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("&amp;","&",$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("&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); 

Надежда Это помогает кому-то с той же проблемой, что и я.

Этот вопрос очень помог мне, но мне не удалось понять, что должно произойти. Это сообщение в блоге проделало потрясающую работу по прохождению меня через него.

Вот важные бит все в одном месте:

  • Как указано выше, вы ДОЛЖНЫ подписывать свои 1.1 API-запросы. Если вы делаете что-то вроде получения общедоступных статусов, вам нужен ключ приложения, а не ключ пользователя. Полная ссылка на нужную страницу: https://dev.twitter.com/apps
  • Вы должны хэш ВСЕ параметры, как oauth, так и параметры get (или POST) вместе.
  • Вы должны СДЕЛАТЬ параметры, прежде чем сводить их к кодированной по URL форме, которая получает хеширование.
  • Вы должны кодировать несколько вещей несколько раз – например, вы создаете строку запроса из значений url-значений параметров, а затем вы кодируете код THAT и объединяете тип метода и URL-адрес.

Я сочувствую всем головным болям, так что вот какой-то код, чтобы обернуть все это:

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