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

292

Из-за выхода из строя 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}]}"

Есть много классов, но после нескольких попыток ни один из них, похоже, не работает из-за этих обновлений в Твиттере, плюс некоторые из них - довольно продвинутые классы с большим количеством функциональных возможностей, которые мне действительно не нужны.

Какой самый простой / короткий способ получить последние статусы пользователей с помощью PHP?

fellowworldcitizen
источник
98
Я бы убил за ответ на это. Их документация ужасно плоха.
RCNeil
Я новичок в Twitter API и немного борюсь с этим. Я обнаружил, что использую устаревший код.
Энтони
Посмотрите на aamirafridi.com/twitter/...
Аамир АФРИДИ
@ Марк Спасибо Марк! Это было легко!! Это не сработало для меня изначально. Я бегу WAMP. Мне пришлось внести изменения в мой php.ini в моем каталоге Apache в соответствии с этой
веткой
1
Я только что записал решение без CURL или каких-либо дополнительных библиотек: stackoverflow.com/questions/17049821/…
Раули Раджанде

Ответы:

820

Важное примечание: С середины 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 и нажать кнопку «Создать приложение».

Введите описание изображения здесь

На этой странице заполните любые детали, которые вы хотите. Для меня это не имело значения, потому что я просто хотел сделать множество блочных запросов, чтобы избавиться от спам-подписчиков. Дело в том, что вы получите себе набор уникальных ключей для использования в вашем приложении.

Итак, цель создания приложения - дать себе (и Twitter) набор ключей. Эти:

  • Ключ потребителя
  • Секрет потребителя
  • Токен доступа
  • Секрет токена доступа

Там есть немного информации здесь , на какой эти жетоны.

3. Создайте токены доступа : они понадобятся вам для успешного выполнения запросов.

OAuth запрашивает несколько токенов. Так что вам нужно, чтобы они были созданы для вас.

Введите описание изображения здесь

Нажмите «Создать мой токен доступа» внизу. Затем, как только вы снова прокрутите страницу вниз, у вас появятся новые сгенерированные ключи. Вам нужно взять четыре ранее помеченных ключа с этой страницы для вызовов API, поэтому запишите их где-нибудь.

4. Измените уровень доступа : вы не хотите только для чтения, не так ли?

Если вы хотите достойно использовать этот API, вам нужно изменить настройки на Чтение и запись, если вы делаете что-то, кроме стандартного извлечения данных с помощью запросов GET .

Введите описание изображения здесь

Выберите вкладку «Настройки» в верхней части страницы.

Введите описание изображения здесь

Дайте приложению доступ для чтения / записи и нажмите «Обновить» внизу.

Вы можете прочитать больше о модели разрешений приложений, которую использует 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 тоже твой друг.

Джимбо
источник
4
@kaffolder Ссылка на этой странице: profilepicture.co.uk/caching-api-responses-php предлагает простой способ сделать это. Вы записываете свои данные из твиттера в файл или базу данных (MySQL или MongoDB) по первому запросу, затем при каждом последующем запросе вы проверяете текущее время по времени, которое вы хотите для файла (вы можете назвать файл в качестве ограничения по времени), и если файл существует, а имя файла находится в пределах требуемого вами времени, тогда извлекайте данные вместо выполнения запроса API. Если файл существует, но время истекло, удалите файл и выполните запрос API.
Джимбо
7
Я не могу понять, как обрабатывать данные JSON после возвращения. Я не хочу просто выводить его на экран, как в echo $ twitter -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> executeRequest (); Извинения, я не могу понять, как сделать переводы строк! Я хочу сделать что-то вроде $ jsonData = json_decode ($ twitter); но это не работает - я чувствую, что упускаю что-то фундаментальное, но пенни не падает ...
Эшли
67
Спасибо, документация Твиттера - это неорганизованный беспорядок, это очень помогло.
Джорен
7
Есть немало предпосылок, чтобы этот класс работал на Windows. Вам необходимо загрузить рабочую версию cURL в ваш php.iniфайл, а также загрузить сертификаты CA в ваш php.iniфайл, используя curl.cainfo = path\to\cacert.pem. Вы можете получить сертификаты CA здесь .
Джейк З,
4
@Jimbo Я только что заметил, что некоторые расширения cURL по умолчанию содержат ошибки в Windows и требуют замены (отсюда ссылка на «фиксированные» версии), и что без загрузки сертификатов CA ваш класс возвращает false, как curl_error () сообщает, что `проблема с сертификатом SSL, проверьте, что сертификат CA в порядке`. Этого можно избежать, отключив CURLOPT_SSL_VERIFYPEER, но я подумал, что включу основные инструкции для фактического использования сертификатов CA. Просто включите это, чтобы потенциально сэкономить некоторым людям несколько минут поиска.
Джейк З,
137

Перейдите на 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
Реки
источник
2
Спасибо за фрагмент кода, работайте без нареканий. Единственная проблема в том, что я не могу понять, как установить счетчик сообщений. Он возвращает только 20, и я хочу получить полную сумму, равную 200 в соответствии с лимитом Twitter.
Flatlyn
23
Как бы вы установили screen_nameи countс таким подходом? Я попытался добавить его в $urlпеременную, но получил ошибку «Не удалось подтвердить подлинность».
Хавьер Вильянуэва
1
Этот код прекрасно работает! Я пытаюсь изменить его, чтобы использовать API search / tweets.json, но я всегда получаю ответ «не могу вас аутентифицировать» - есть идеи?
Крис
1
Этот пост был очень полезным. Мой код, кажется, не возвращается, curl_init()хотя. Я посмотрел на некоторые примеры, и они выглядят очень просто и понятно, и точно так же, как этот код здесь ... Нужно ли устанавливать что-то особенное?
Джессикарайгун
1
Это сработало для меня 26 октября 2016 года. Результат оказался немного сложнее, чем я ожидал.
JohnC
61

Код, вставленный Риверсом, великолепен. Большое спасибо! Я новичок здесь и не могу комментировать, я просто хотел бы ответить на вопрос от 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
           );
lackovic10
источник
2
Я не могу проголосовать достаточно. В документации по API в Твиттере это смотрит вам в лицо, но это никогда не бывает супер "очевидным". Этот подход портит buildAuthorizationHeaderфункцию? Я реализовал это отдельно.
Мо
Я не работал с этим в течение длительного времени, поэтому я не помню, если вы еще не решили свою проблему, я могу разобраться с этим в следующие дни.
LOVOVIC10
Я безуспешно пытаюсь адаптировать ваше решение для выполнения POST для statuses / update.json. Есть ли у вас какие-либо идеи, как этого достичь?
perrohunter
1
@perrohunter Я понятия не имею, должен был бы смотреть больше на это. Если через пару дней вы не найдете способ отправить мне сообщение, я постараюсь вам помочь.
LOVOVIC10
18

Как указано в других ответах, создайте приложение 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()

budidino
источник
1
Потрясающая работа @budidino! Создал приложение на dev.twitter.com/apps и заполнил ваши x с помощью oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * обратите внимание *, что вам нужно нажать «создать мой токен доступа», и на его создание уйдет несколько секунд, поэтому, пожалуйста, подождите.
Тео
@Budidino Разве мы не должны включать любую библиотеку?
анам
Я заполнил ключи, добавил это в мой functions.phpфайл в WordPress, вставил <?php echo returnTweet(); ?>файл HTML, и он выводит слово «Массив» и ничего больше.
J82
@Desi, результат - массив твитов, вы должны управлять тем, как вы отображаете каждый из них. попробуйте print_r (returnTweet ()), чтобы посмотреть, что внутри. Посмотрите этот пример показа всех твитов: gist.github.com/budidino/9681764#file-stackoverflow-returntweet
budidino
1
Если вы хотите получить только последний твит, вы должны изменить массив $ request и установить значение count в 1. Допустим, вы используете $ tweet = returnTweet (); затем, если вы хотите отобразить последний твит (в данном случае единственный), вы можете написать что-то вроде этого: echo "latest tweet:". $ tweet [0] ["text"]; Обязательно ознакомьтесь со структурой возвращаемого твиттера, если вы хотите извлечь больше, чем просто текст твита (пример $ userProfileImageURL = $ tweet [0] ["user"] ["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino
16

Спасибо, Крис!

Он работал для меня без использования параметров для запроса, всякий раз, когда я использовал более одного параметра, он показывал мне ошибку: 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);

Надеюсь, это поможет кому-то с той же проблемой, что у меня была.

Frewuill
источник
Большое спасибо, ваше улучшение кода работает хорошо! Один вопрос: «// рекомендуется более сильный одноразовый номер». Что бы это могло быть? время()?
Себастьян
Спасибо что подметил это. Себастьян: одноразовый номер - это токен одноразового использования, который должен быть криптографически безопасным. mt_rand () слишком короткая (32 бита) и не является криптографическим PRNG. Теоретически, это делает токен слабым, но для простоты в моем исходном примере кода я хотел использовать что-то, что было в PHP и легко доступно для понимания.
Крис Ривз
ошибка при получении 32. Не удалось аутентифицировать вас .. любая помощь, пожалуйста ??? Я использовал ваш код выше
saadk
@frewuill, ты замечательный братан, это работает как шарм, спасибо.
Виджей
9

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

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

  • Как указано выше, вы ДОЛЖНЫ подписывать свои запросы API 1.1. Если вы делаете что-то вроде получения открытых статусов, вам нужен ключ приложения, а не пользовательский ключ. Полная ссылка на нужную страницу: 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'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);
Крис Ривз
источник
6

Если у вас установлена ​​библиотека OAuth PHP, вам не нужно беспокоиться о формировании запроса самостоятельно.

$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чтобы получить библиотеку.

jeffaudio
источник
5

Прежде всего я хотел бы поблагодарить Джимбо и ( его пост / 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это все :)

Ханука Асанка
источник
Мне еще не повезло: /
Рикардо
2

Вам понадобится создать «приложение» в Твиттере (для этого вам понадобится учетная запись в Твиттере).

Затем вам нужно использовать OAuth для авторизованного запроса в Twitter .

Вы можете использовать ресурс GET statuses / user_timeline, чтобы получить список последних твитов.

Мэтью Рапати
источник
4
Пожалуйста, объясните нам, глупые люди. Вы даете столько же понимания, если не меньше, чем документация. Используете ли вы HttpRequest()функцию PHP для шага 2? Существует библиотека Авраама TwitterOAuth PHP - github.com/abraham/twitteroauth - библиотека, которая должна делать это также, но пример того, как ее реализовать, на самом деле не представлен.
RCNeil
2
github.com/abraham/twitteroauth/blob/master/test.php, кажется, имеет много примеров!
Мэтью Рапати
2
@MatthewRapati Page отсутствует.
Р.Н. Кушваха,
0

Вот краткий для получения указанного количества твитов с вашей временной шкалы. Он в основном делает то же самое, что и другие примеры, только с меньшим количеством кода.

Просто заполните ключи и настройте $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))))))));

Этот использует анонимные функции и file_get_contentsвместо библиотеки cURL. Обратите внимание на использование одноразового номера MD5. Кажется, что все согласны с time()одноразовым номером, однако в большинстве примеров в Интернете, касающихся OAuth, используется какая-то зашифрованная строка (например, http://www.sitepoint.com/understanding-oauth-1/ ). Это имеет больше смысла для меня тоже.

Также обратите внимание: вам нужен PHP 5.3+ для анонимных функций (если ваш сервер / компьютер находится в какой-то пещере времен холодной войны и вы не можете обновить ее)

Казимир
источник
-1

Из их генератора сигнатур вы можете генерировать 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
Geremia
источник
-2
$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));
Мохд Абдул Баки
источник
3
Пожалуйста, включите объяснение того, что делает этот код, чтобы ОП мог учиться у него.
Цербр
-2

Благодаря этой теме, и особенно 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;

?>
Терри Бу
источник
-2

Если это кому-нибудь пригодится ... В моем блоге я реализовал следующий код PHP, чтобы извлечь последние твиты, извлечь их наиболее важные данные и затем сохранить их в базе данных MySQL. Это работает, потому что я получил это в своем блоге.

Таблица «твиты», где хранятся их:

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;
}
работает
источник
«Это работает, потому что я получил это в своем блоге» - один из моих любимых. Ваш пост не отвечает на актуальный вопрос. Также php код, который вы используете, имеет плохое качество. Прочитайте немного здесь phptherightway.com . Особенно о DB
Maciej Paprocki
Также вы сделали все свои ключи и токены общедоступными, так что не удивляйтесь, если кто-нибудь возьмёт его и взломает ваш аккаунт в твиттере!
garrettlynch