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

268

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

  • 91
    Я бы убил за ответ на это. Их документация ужасно плоха.
  • 0
    Я новичок в Twitter API и немного борюсь с ним. Я обнаружил, что использую устаревший код.
Показать ещё 5 комментариев
Теги:
twitter

14 ответов

755
Лучший ответ

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

Изображение 766

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

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

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

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

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

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

Изображение 767

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

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

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

Изображение 768

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

Изображение 769

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

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

  • 0
    Как вы можете кешировать это локально? Кэширование будет хорошим дополнением, так как Twitter ограничивает количество запросов. Я новичок в PHP, поэтому любая помощь будет высоко ценится! Я наткнулся на эту ссылку , но не могу понять, как ее реализовать.
  • 4
    @kaffolder Ссылка на этой странице: profilepicture.co.uk/caching-api-responses-php предлагает простой способ сделать это. Вы записываете свои данные из твиттера в файл или базу данных (MySQL или MongoDB) по первому запросу, затем при каждом последующем запросе вы проверяете текущее время по ограничению времени, которое вы хотите для файла (вы можете назвать файл как ограничение по времени), и если файл существует, а имя файла находится в пределах требуемого периода времени, то извлекайте данные вместо выполнения запроса API. Если файл существует, но время истекло, удалите файл и выполните запрос API.
Показать ещё 71 комментарий
133

Перейдите на 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
  • 2
    Спасибо за фрагмент кода, работайте без нареканий. Единственная проблема в том, что я не могу понять, как настроить возврат количества сообщений. Возвращается только 20, и я хочу получить полную сумму, равную 200 в соответствии с лимитом Twitter.
  • 0
    Спасибо за это. Разочаровывая, вы больше не можете получать твиттеры людей, не настроив приложение, хотя (исключая виджет, так как он негибкий с CSS).
Показать ещё 23 комментария
57

Код, вставленный реками, велик. Большое спасибо! Я новичок здесь и не могу комментировать, я просто хочу ответить на вопрос от 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
           );
  • 2
    Я не могу проголосовать достаточно. В документации по API в Твиттере это смотрит вам в лицо, но это никогда не бывает супер-«очевидным». Не buildAuthorizationHeader ли этот подход функции buildAuthorizationHeader ? Я реализовал это отдельно.
  • 0
    Я не работал с этим в течение длительного времени, поэтому я не помню, если вы еще не решили свою проблему, я могу разобраться с этим в следующие дни.
Показать ещё 2 комментария
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()

  • 1
    Отличная работа @budidino! Создал приложение на dev.twitter.com/apps и заполнил ваши x с помощью oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * обратите внимание *, что вам нужно нажать «создать мой токен доступа», и на его создание уйдет несколько секунд, поэтому, пожалуйста, подождите.
  • 0
    @Budidino Разве мы не должны включать любую библиотеку?
Показать ещё 4 комментария
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 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);

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

  • 0
    Большое спасибо, ваше улучшение кода работает хорошо! Один вопрос: «// рекомендуется более сильный одноразовый номер». Что бы это могло быть? время()?
  • 0
    Спасибо что подметил это. Себастьян: одноразовый номер - это токен одноразового использования, который должен быть криптографически безопасным. mt_rand () является слишком коротким (32 бита) и не является криптографическим PRNG. Теоретически, это делает токен слабым, но для простоты в моем исходном примере кода я хотел использовать что-то, что было в PHP и легко доступно для понимания.
Показать ещё 2 комментария
9

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

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

  • Как уже указывалось выше, вы ДОЛЖНЫ подписывать ваши 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);
6

Если у вас установлена ​​библиотека 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 для получения библиотеки.

5

Прежде всего, я хотел поблагодарить 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, чтобы он:)

  • 0
    Мне еще не повезло: /
  • 0
    Работает здесь, большое спасибо!
2

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

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

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

  • 4
    Пожалуйста, объясните нам, глупые люди. Вы даете столько же понимания, если не меньше, чем документация. Используете ли вы PHP функцию HttpRequest() для шага 2? Существует библиотека Авраама TwitterOAuth PHP - github.com/abraham/twitteroauth - библиотека, которая должна делать это также, но пример того, как ее реализовать, на самом деле не представлен.
  • 0
    Извините, я добавлю пример кода, когда у меня будет шанс.
Показать ещё 2 комментария
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))))))));

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

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

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

?>
-2

Из своего генератора сигнатур вы можете сгенерировать команды 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
-3

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню