Найпростіший приклад PHP для отримання user_timeline за допомогою API API версії 1.1


292

Через вибуття з API 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?


97
Я би вбив за відповідь на це. Їх документація жахливо погана.
RCNeil

Я новачок у API Twitter і трохи борюся з ним. Я опинився за допомогою застарілого коду.
Антоній

Подивіться на aamirafridi.com/twitter/…
Aamir

@Mark Спасибі Марк !! Це було легко !! Спочатку це не працювало для мене. Я запускаю WAMP. Мені довелося внести зміни в php.ini в моєму каталозі Apache відповідно до цієї теми: stackoverflow.com/questions/5444249/…
Адлін Лінг

1
Я просто записував рішення, що не CURL або будь - яких інших бібліотек додаткових: stackoverflow.com/questions/17049821 / ...
Rauli Rajande

Відповіді:


820

Важливе зауваження: станом на середину 2018 року процес отримання щебенів API twitter став набагато більш бюрократичним. Мені знадобилося більше одного робочого тижня, щоб надати токени API, і це проект з відкритим кодом для вас, хлопці та дівчата з понад 1,2 мільйонами установок на Packagist та 1,6-зірковими зірками в Github, що теоретично повинно бути вищим пріоритетом .

Якщо вам покладається завдання працювати з API twitter для своєї роботи, ви повинні врахувати цей потенційно надзвичайно довгий час очікування. Також врахуйте інші проспекти соціальних медіа, як-от Facebook чи Instagram, і надайте ці варіанти, оскільки процес отримання їх жетонів миттєвий.


Отже, ви хочете використовувати API v1.1 Twitter?

Примітка: файли для них знаходяться на GitHub .

Незабаром буде застаріла версія Версії 1.0 , і заборонені запити заборонено. Отже, ось пост, який допоможе вам зробити саме це разом із класом PHP, щоб полегшити ваше життя.

1. Створіть обліковий запис розробника: налаштуйте обліковий запис розробника у Twitter

Вам потрібно зайти на офіційний сайт розробника Twitter і зареєструватися для облікового запису розробника. Це безкоштовний та необхідний крок для запитів на API v1.1.

2. Створіть додаток: створіть програму на сайті розробника Twitter

Що? Ви думали, що можете зробити несанкціоновані запити? Не з API v1.1 Twitter. Вам потрібно відвідати http://dev.twitter.com/apps і натиснути кнопку "Створити додаток".

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

На цій сторінці заповніть усі деталі, які ви хочете. Для мене це не мало значення, тому що я просто хотів зробити багато запитів на блокування, щоб позбутися від послідовників спаму. Справа в тому, що ти збираєшся отримати себе набір унікальних ключів, які потрібно використовувати для вашої програми.

Отже, сенс створення програми - дати собі (і Twitter) набір ключів. Це:

  • Споживчий ключ
  • Споживча таємниця
  • Маркер доступу
  • Секрет маркера доступу

Там є трохи інформації тут , на який ці жетони.

3. Створіть маркери доступу : вони знадобляться для успішних запитів

OAuth просить кілька жетонів. Тому вам потрібно створити їх для вас.

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

Натисніть "Створити мій маркер доступу" внизу. Після того, як ви знову прокрутите донизу, у вас з’являться кілька створених ключів. Вам потрібно схопити чотири раніше позначені ключі з цієї сторінки для дзвінків API, тому занотуйте їх десь.

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

Якщо ви хочете гідно використовувати цей API, вам потрібно змінити налаштування на Read & Write, якщо ви робите щось, крім стандартного пошуку даних за допомогою GET- запитів.

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

Виберіть вкладку "Налаштування" вгорі сторінки.

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

Надайте програмі доступ для читання / запису та натисніть "Оновити" внизу.

Ви можете прочитати більше про модель дозволу на додатки, яку Twitter використовує тут.


5. Напишіть код, щоб отримати доступ до API : більшість з них я зробив за вас

Я поєднав наведений вище код, з деякими модифікаціями та змінами, в клас PHP, тому зробити запити, які вам потрібні, дуже просто.

Для цього використовується OAuth та API v1.1 Twitter , і клас, який я створив, ви можете знайти нижче.

require_once('TwitterAPIExchange.php');

/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
    'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);

Переконайтесь, що ключі, отримані від вашої програми, покладіть вище у відповідні місця.

Далі вам потрібно вибрати URL-адресу, до якого потрібно надіслати запит. Twitter має свою документацію API, яка допоможе вам вибрати URL-адресу, а також тип запиту (POST або GET).

/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/
$url = 'https://api.twitter.com/1.1/blocks/create.json';
$requestMethod = 'POST';

У документації кожна URL-адреса зазначає, що ви можете їй передати. Якщо ми використовуємо URL-адресу "блоків", як описана вище, я можу передавати наступні параметри POST:

/** POST fields required by the URL above. See relevant docs as above **/
$postfields = array(
    'screen_name' => 'usernameToBlock', 
    'skip_status' => '1'
);

Тепер, коли ви налаштували, що ви хочете зробити з API, настав час зробити фактичний запит.

/** Perform the request and echo the response **/
$twitter = new TwitterAPIExchange($settings);
echo $twitter->buildOauth($url, $requestMethod)
             ->setPostfields($postfields)
             ->performRequest();

А для запиту POST - це все!

Для GET запиту - це дещо інакше. Ось приклад:

/** Note: Set the GET field BEFORE calling buildOauth(); **/
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=J7mbo';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();     

Приклад підсумкового коду : Простий GET-запит на список моїх підписників.

$url = 'https://api.twitter.com/1.1/followers/list.json';
$getfield = '?username=J7mbo&skip_status=1';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();  

Я розмістив ці файли на GitHub з кредитом @ lackovic10 та @rivers! Я сподіваюся, що хтось вважає це корисним; Я знаю, що зробив (я використовував це для об'ємного блокування в циклі).

Також для тих, хто в Windows, які мають проблеми з сертифікатами SSL, дивіться цей пост . Ця бібліотека використовує cURL під кришкою, тому вам потрібно переконатися, що у вас, ймовірно, встановлені сертифікати CURL. Google також є вашим другом.


4
@kaffolder Посилання на цій сторінці: profilepicture.co.uk/caching-api-responses-php пропонує простий спосіб зробити це. Ви записуєте свої дані twitter у файл або базу даних (MySQL або MongoDB) за першим запитом, потім кожен наступний запит ви перевіряєте поточний час у відповідності з тим часовим обмеженням, який ви бажаєте для файлу (ви можете назвати файл як обмеження часу), і якщо файл існує, а ім'я файлу знаходиться в потрібний термін, тоді витягніть дані замість виконання запиту API. Якщо файл існує, але обмежений час, видаліть файл та виконайте запит API.
Джимбо

7
Я не можу зрозуміти, як обробити дані json після повернення. Я не хочу просто перегукувати його на екрані, як у echo $ twitter -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest (); АПОЛОГІЇ, я не можу зрозуміти, як робити нові рядки! Я хочу зробити щось на зразок $ jsonData = json_decode ($ twitter); але це не працює - я відчуваю, що мені не вистачає чогось принципового, але копійка не падає ...
Ешлі,

67
Дякую, документація Twitter - це неорганізований хаос, це дуже допомогло.
joren

7
Існує досить багато передумов, щоб цей клас працював у Windows. У вашому файлі має бути завантажена робоча версія CURL,php.ini а також потрібно завантажити сертифікати CA у php.iniфайл, використовуючи curl.cainfo = path\to\cacert.pem. Ви можете отримати сертифікати CA тут .
Джейк Z

4
@Jimbo Я просто зазначив, що деякі розширення cURL за замовчуванням є помилковими в Windows і потребують заміни (звідси посилання на "виправлені" версії), і що, не завантажуючи сертифікати CA, ваш клас повертає false, як curl_error () повідомляє, що `Проблема з сертифікатом SSL, переконайтеся, що сертифікат ЦС добре '. Цього можна уникнути, вимкнувши CURLOPT_SSL_VERIFYPEER, але я подумав, що я включу основні інструкції щодо фактичного використання сертифікатів CA. Просто включено це, щоб потенційно заощадити людей на декількох хвилинах пошуку.
Джейк Z

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 за ліміт щебетання.
Flatlyn

23
Як би ви встановили screen_nameта countз таким підходом? Я спробував додати його до $urlзмінної, але у мене з’явилася помилка «Не можу вас автентифікувати».
Хав'єр Віллануєва

1
Цей код чудово працює! Я намагаюся модифікувати його для використання api search / tweets.json, але я завжди отримую відповідь "не міг вас автентифікувати" - будь-які ідеї?
Кріс

1
Ця публікація була дуже корисною. Схоже, мій код не повертається curl_init(). Я переглянув кілька прикладів, і вони виглядають дуже просто і просто, і саме такий код тут ... Чи потрібно мені встановлювати щось особливе?
jessicaraygun

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

2
Я не можу проголосувати за це достатньо. У документації API Twitter, це дивиться вам в обличчя, але це ніколи не є супер "очевидним". Чи підходить цей підхід з buildAuthorizationHeaderфункцією? Я реалізував це окремо.
Мо

Я давно не працював з цим, тому не пам'ятаю, якщо ви ще не вирішили свою проблему, я можу розглянути це в наступні дні.
lackovic10

Я без спроби адаптував ваше рішення для виконання POST у статусах / update.json, чи маєте ви уявлення, як цього можна досягти?
perrohunter

1
@perrohunter Я поняття не маю, щоб більше розглянути це. Якщо ви не знайдете способу через пару днів, надішліть мені повідомлення, я спробую вам допомогти.
lackovic10

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, споживчий_кей, споживчий_секрет. * зауважте *, що вам потрібно натиснути "створити мій маркер доступу", і на це буде потрібно декілька секунд, щоб згенерувати, тож зачекайте його.
Тео

@budidino dnt нам потрібно включити будь-яку бібліотеку ??
анам

Я заповнив ключі, додав це до свого functions.phpфайлу в WordPress, поклав <?php echo returnTweet(); ?>у HTML-файл, і він виводить слово "масив" і більше нічого.
J82,

@Desi, результат - це масив твітів, ви повинні обробити спосіб відображення кожного з них. спробуйте print_r (returnTweet ()) просто, щоб побачити, що всередині. Ознайомтеся з цим прикладом показу всіх твітів: gist.github.com/budidino/9681764#file-stackoverflow-returntweet
budidino

1
Якщо ви хочете отримати лише останній твіт, ви повинні змінити масив $ request і встановити кількість до 1. Скажімо, ви використовуєте $ tweet = returnTweet (); тоді, якщо ви хочете показати останній твіт (у даному випадку єдиний), ви можете написати щось подібне: echo "останній твіт:". $ tweet [0] ["текст"]; Не забудьте перевірити структуру повернутого твіттера, якщо ви хочете витягнути більше тексту, ніж текст твіт (наприклад, $ userProfileImageURL = $ tweet [0] ["користувач"] ["профіль_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);

І він працював, використовуючи два або більше параметрів, таких як ім'я_файлу та кількість.

Весь код виглядає приблизно так:

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

Сподіваюся, це допомагає комусь із тією ж проблемою, що і я.


велике спасибі, поліпшення вашого коду працює добре! Одне запитання, що стосується: "// не рекомендується сильніша думка". Що це могло бути? час ()?
Себастьян

Дякуємо, що вказали на це. Себастьян: nonce - це маркер одноразового використання, який повинен бути криптографічно захищеним. mt_rand () є занадто коротким (32 біта) і не є криптографічним PRNG. Теоретично це робить марку Oauth слабкою, але заради простоти в моєму початковому прикладі коду я хотів використати те, що було під рукою в PHP і було легко зрозумілим.
Кріс Рівз

помилка отримання 32. Не можу вас засвідчити автентичність .. будь-яка допомога, будь ласка ??? Я використовував ваш вище код
saadk

@frewuill, ти чудовий брате, це працює мені як зачарування, дякую.
vijay

9

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

Ось важливі біти в одному місці:

  • Як було зазначено вище, ви ОБОВ'ЯЗКОВО підписувати свої 1.1 запити API. Якщо ви робите щось на зразок отримання загальнодоступних статусів, вам потрібен ключ програми, а не ключ користувача. Повне посилання на потрібну сторінку: https://dev.twitter.com/apps
  • Ви повинні хешувати ВСІ параметри, як ті, що інші, так і параметри отримання (або параметри POST) разом.
  • Ви повинні СОРТИВАТИ параметри перед тим, як зменшити їх до кодованої URL-адресою форми, яка отримана хешованою.
  • Ви повинні кодувати деякі речі кілька разів - наприклад, ви створюєте рядок запиту із значень, закодованих URL-адресами параметрів, а потім URL-код кодує ТОГО і з'єднується з типом методу та 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

Якщо у вас встановлена ​​бібліотека PHP OAuth, вам не доведеться турбуватися про формування запиту самостійно.

$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_secret);

$oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json");
$twitter_data = json_decode($oauth->getLastResponse());

print_r($twitter_data);

Для отримання додаткової інформації див. Документи або їх приклад . Ви можете використовувати pecl install oauthдля отримання бібліотеки.


5

Перш за все, я хотів подякувати jimbo та ( його пост / 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

Вам потрібно буде створити "додаток" у Twitter (і для цього вам потрібен обліковий запис Twitter).

Потім вам потрібно скористатися OAuth для того, щоб зробити авторизований запит у Twitter .

Ви можете скористатися статусом GET / user_timeline, щоб отримати список останніх твітів.


4
Будь ласка, для нас, дурних людей, поясніть. Ви даєте більше інформації, якщо не менше, ніж документації. Чи використовуєте ви HttpRequest()функцію PHP для кроку 2? Існує бібліотека Авраама на TwitterOAuth PHP - github.com/abraham/twitteroauth - бібліотека, яка повинна зробити це також, але приклад того, як це реалізувати, насправді не наводиться.
RCNeil

2
github.com/abraham/twitteroauth/blob/master/test.php, схоже, має багато прикладів!
Метью Рапаті

2
@MatthewRapati Сторінка відсутня.
RN Kushwaha

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

-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

Завдяки цій темі, а особливо будідіно, тому що його код - це те, що привело її додому для мене. Просто хотів зробити свій внесок у те, як отримати дані 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

Крім того, ви зробили всі ваші ключі та жетони загальнодоступними, тому не дивуйтеся, якщо хтось їх візьме і зламає ваш акаунт у Twitter!
garrettlynch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.