Простейший пример 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?
Ответы
Ответ 1
Важное примечание: С середины 2018 года процесс получения токенов API Twitter стал намного более бюрократическим. Мне потребовалось более одной рабочей недели, чтобы получить набор токенов API, и это для проекта с открытым исходным кодом для вас, парни и девушки, с более чем 1,2 млн. Установок на Packagist и 1,6 тыс. Звезд на Github, что теоретически должно быть более приоритетным,
Если вам поручено работать с Twitter API для вашей работы, вы должны учитывать это потенциально очень долгое время ожидания. Также рассмотрите другие возможности социальных сетей, такие как Facebook или Instagram, и предоставьте эти опции, так как процесс получения их токенов происходит мгновенно.
Итак, вы хотите использовать API Twitter v1.1?
Примечание: файлы для них находятся на GitHub.
Версия 1.0 скоро будет устаревшей, и неавторизованные запросы не будут разрешены. Итак, вот пост, который поможет вам сделать это, вместе с классом PHP, чтобы сделать вашу жизнь проще.
1. Создайте учетную запись разработчика. Настройте учетную запись разработчика в Twitter.
Вам необходимо зайти на официальный сайт разработчика Twitter и зарегистрировать аккаунт разработчика. Это бесплатный и необходимый шаг для отправки запросов на API v1.1.
2. Создайте приложение: создайте приложение на сайте разработчика Twitter
Какие? Вы думали, что можете сделать неаутентифицированные запросы? Не с Twitter v1.1 API. Вам нужно посетить http://dev.twitter.com/apps и нажать кнопку "Создать приложение".
![Enter image description here]()
На этой странице заполните любые детали, которые вы хотите. Для меня это не имело значения, потому что я просто хотел сделать множество блочных запросов, чтобы избавиться от спам-подписчиков. Дело в том, что вы получите себе набор уникальных ключей для своего приложения.
Итак, цель создания приложения - дать себе (и Twitter) набор ключей. Это:
- Ключ потребителя
- Секрет потребителя
- Токен доступа
- Секрет токена доступа
Там немного информации здесь, на какой эти жетоны.
3. Создайте токены доступа: они понадобятся вам для успешного выполнения запросов.
OAuth запрашивает несколько токенов. Так что вам нужно, чтобы они были созданы для вас.
![Enter image description here]()
Нажмите "Создать мой токен доступа" внизу. Затем, как только вы снова прокрутите страницу до конца, у вас появятся новые сгенерированные ключи. Вам нужно взять четыре ранее помеченных ключа с этой страницы для вызовов API, поэтому запишите их где-нибудь.
4. Измените уровень доступа: вы не хотите только для чтения, не так ли?
Если вы хотите достойно использовать этот API, вам нужно изменить настройки на Чтение и запись, если вы делаете что-то, кроме стандартного извлечения данных с помощью запросов GET.
![Enter image description here]()
Выберите вкладку "Настройки" в верхней части страницы.
![Enter image description here]()
Дайте приложению доступ для чтения/записи и нажмите "Обновить" внизу.
Вы можете прочитать больше о модели разрешений приложений, которую использует Twitter, здесь.
5. Напишите код для доступа к API: я сделал большую часть для вас
Я скомбинировал приведенный выше код с некоторыми изменениями и изменениями в класс PHP, чтобы было действительно просто выполнять запросы, которые вам нужны.
При этом используются OAuth и API Twitter v1.1, а также созданный мной класс, который вы можете найти ниже.
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, на который вы хотите сделать запрос. Твиттер имеет свою 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 с благодарностью @Loveovic10 и @rivers! Я надеюсь, что кто-то найдет это полезным; Я знаю, что сделал (я использовал его для массового блокирования в цикле).
Кроме того, для тех в Windows, у кого есть проблемы с сертификатами SSL, посмотрите этот пост. Эта библиотека использует cURL под капотом, поэтому вам нужно убедиться, что вы, вероятно, настроили свои сертификаты cURL. Google тоже твой друг.
Ответ 2
Перейдите на 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 скрипт>.php
Ответ 3
Код, вставленный реками, велик. Большое спасибо! Я новичок здесь и не могу комментировать, я просто хочу ответить на вопрос от 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
);
Ответ 4
Как указано в других ответах, создайте приложение 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()
Ответ 5
Спасибо, Крис!
Он работал у меня, не используя параметры для запроса, всякий раз, когда я использовал несколько параметров, он показал мне ошибку: 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 demo does it
// also not necessary, but twitter 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);
Надежда Это помогает кому-то с той же проблемой, что и я.
Ответ 6
Этот вопрос мне очень помог, но мне не удалось понять, что должно произойти. Этот пост в блоге проделал потрясающую работу по тому, чтобы пропустить меня через него.
Вот важные биты в одном месте:
- Как уже указывалось выше, вы ДОЛЖНЫ подписывать ваши 1.1 API-запросы. Если вы делаете что-то вроде получения общедоступных статусов, вам нужен ключ приложения, а не ключ пользователя. Полная ссылка на нужную страницу: https://dev.twitter.com/apps
- Вы должны отображать ВСЕ параметры, как oauth, так и параметры get (или POST) вместе.
- Вы должны СДЕЛАТЬ параметры, прежде чем сводить их к кодированной по URL-адресу форме, которая получает хеширование.
- Вы должны закодировать несколько вещей несколько раз - например, вы создаете строку запроса из значений 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 demo does it
// also not necessary, but twitter 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);
Ответ 7
Если у вас установлена библиотека 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);
Для получения дополнительной информации ознакомьтесь с docs или их example. Вы можете использовать pecl install oauth
для получения библиотеки.
Ответ 8
Прежде всего, я хотел поблагодарить jimbo и (его сообщение/простая библиотека twitter-api-php).
Если вы собираетесь использовать GET API поиска/твитов с библиотекой 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
, чтобы он:)
Ответ 9
Вам понадобится создать "приложение" в Twitter (и для этого вам нужна учетная запись Twitter).
Затем вам нужно использовать OAuth для авторизации запроса в Twitter.
Вы можете использовать ресурс GET status/user_timeline, чтобы получить список последних твитов.
Ответ 10
Вот краткое описание для получения определенного количества твитов с вашей временной шкалы. Он в основном делает то же самое, что и другие примеры, только с меньшим количеством кода.
Просто заполните клавиши и настройте $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+ для анонимных функций (в случае, если ваш сервер/компьютер находится в какой-то пещере холодной войны, и вы не можете его обновить).
Ответ 11
Из своего генератора сигнатур вы можете сгенерировать команды 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
Ответ 12
$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));
Ответ 13
Благодаря этой теме, и особенно 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;
?>
Ответ 14
Если это полезно для всех...
В моем блоге я реализую следующий код PHP, чтобы получить последние твиты, извлечь их наиболее релевантные данные и затем сохранить их в базе данных MySQL.
Это работает, потому что я получил его в своем блоге.
Таблица "tweets", где хранятся:
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
?>
Функция сохранения твитов:
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;
}