Статьи

Погружение в Twitter API

Удивительный рост Twitter конкурирует только с его интуитивно понятным, удобным для разработчиков API. Во второй части этой серии мы узнаем больше об API Twitter и о том, как с ним работать.

Слишком много абстракций никогда не бывает хорошим.

В эту эпоху Web 2.0 веб-приложения, которые имеют простой в использовании, интуитивно понятный API, имеют явное преимущество, поскольку они позволяют разработчикам использовать и создавать платформы и таким образом привлекать больше пользователей. По мере продвижения к социальной сети и гибридным приложениям хороший API больше не является хорошим дополнением: он совершенно необходим. И помните, слишком много абстракций никогда не бывает хорошим. Хотя существует ряд наборов API для упрощения работы с данным API, не было бы здорово узнать, что на самом деле происходит под капотом? Разве не было бы интересно деконструировать фактическое вуду, происходящее между набором и API? Да, я так и думал!


Для каждой функциональности я собираюсь показать вам, как добиться этого двумя способами: первый использует язык серверной части, в данном случае PHP, а второй — только язык клиентской стороны, JavaScript. Каждая реализация будет работать отдельно и достигать требуемой функциональности. Не стесняйтесь смешивать и сочетать эти решения для создания гибрида. Примеры JavaScript будут использовать JSON в качестве формата для полезной нагрузки, в то время как для примера PHP я выбрал XML.


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

На самом деле есть три отдельных API Twitter.

  • Нормальный API на основе REST
  • API поиска
  • Stream API

Каждый из этих API имеет свой собственный набор функциональных возможностей, особенностей, преимуществ и недостатков.

Методы REST составляют ядро ​​API Twitter и написаны разработчиками в самом Twitter. Это позволяет другим разработчикам получать доступ и манипулировать всеми основными данными Twitter. Вы использовали бы этот API, чтобы делать все обычные вещи, которые вы хотели бы делать с Twitter, включая получение статусов, обновление статусов, отображение временной шкалы пользователя, отправку прямых сообщений и так далее.

API поиска на самом деле является детищем ребят из Summize Inc, компании, которую Twitter приобрел для своего API. API поиска позволяет вам смотреть дальше себя и своих подписчиков. Вам нужен этот API, если вы хотите просматривать актуальные темы и так далее.

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


Публичные данные могут быть свободно доступны без ключа API. При запросе личных данных и / или пользовательских данных, Twitter требует аутентификации. Вы можете пройти аутентификацию в Twitter, используя любой из двух методов.

Это метод аутентификации по умолчанию, который Twitter изначально запускал и продолжает использовать. В этом методе вы передаете имя пользователя и пароль в виде строк в кодировке Bse64 в заголовке HTTP-запроса. Пример запроса GET будет выглядеть так.

1
2
3
GET /somefolder/index.html HTTP/1.1
Host: net.tutsplus.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Выглядит немного сложнее, не так ли? Позволь мне объяснить. Первые две строки являются частью стандартного запроса GET. Третья строка, где происходит вся магия. Мы удостоверяемся, что сервер знает, что мы используем базовую аутентификацию для аутентификации, а затем передаем в качестве значения значение строки username: password в кодировке base 64. Затем сервер может декодировать учетные данные, проверять их и предоставлять доступ, если все совпадает.

Twitter, поддерживающий базовую аутентификацию, является, вероятно, одной из причин, по которой он стал настолько большим, поскольку позволил множеству разработчиков разрабатывать для платформы, поскольку входной барьер относительно низок. Базовая аутентификация достаточна для извлечения всех частей API.

Twitter начал поддерживать OAuth во втором квартале 2009 года. Пользователям, использующим приложение с поддержкой OAuth, не нужно сообщать свои пароли программе, а также можно делегировать управление программе с несколькими уровнями доступа. Однако сегодня мы не будем рассматривать реализацию OAuth в Twitter. OAuth и реализация его рабочего процесса — довольно сложная тема и требует отдельной статьи. Я предпочел бы пропустить OAuth для этой статьи, а не выбрасывать полусгоревшие объяснения и писать код на основе этих объяснений.


«Твиттер только позволяет вам делать заранее определенное количество вызовов его API».

Прежде чем мы углубимся в кодирование, я должен сделать одну вещь абсолютно ясно: Twitter позволяет вам только делать заранее определенное количество вызовов его API. Ограничение REST API составляет 150 на час, в то время как ограничение API поиска на данный момент не разглашается. Для аутентифицированных звонков вызов вычитается из лимита аутентифицирующего пользователя, а для неаутентифицированных звонков — из квоты вызывающего IP.

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


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

  • Получение вашего статуса
  • Обновление вашего статуса
  • Поиск в Твиттере

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


Первая функциональность, которую мы рассмотрим, это отображение статуса пользователя. Это наиболее популярное использование API, если веб-разработчик хочет отображать статус данного пользователя, не прибегая к значку Twitter.

1
2
3
4
<?php
$response = new SimpleXMLElement(‘http://twitter.com/users/show/userid.xml’,NULL,TRUE);
echo $response->status->text.’
?>

Первый метод использует PHP. Это относительно простой метод, когда мы просто берем пользовательский XML-файл, а затем анализируем его для отображения текущего состояния.

Сначала мы преобразуем XML-файл в объект, чтобы его можно было легко просмотреть с помощью расширения SimpleXML, которое входит в стандартную комплектацию PHP. Теперь, когда объект создан, мы просто находим узел статуса и распечатываем текст статуса и время создания.

Помните, это только отображает текущий статус пользователя. Если вы хотите список последних обновлений, см. Ниже.

cURL — это инструмент командной строки, который включается на большинстве размещенных серверов. Цитировать Википедию:

В вычислениях cURL функционирует как инструмент командной строки для передачи файлов с синтаксисом URL.

Это библиотека, предназначенная для того, чтобы пользователи могли подключаться к различным типам серверов по разным протоколам. Использование cURL является предпочтительным методом для всех библиотек Twitter, и мы будем использовать то же самое.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
 
     $username = ‘xxx’;
     $password = ‘yyy’;
     $curlhandle = curl_init();
     curl_setopt($curlhandle, CURLOPT_URL, «http://twitter.com/statuses/user_timeline.xml»);
     curl_setopt($curlhandle, CURLOPT_USERPWD, $username.’:’.$password);
     curl_setopt($curlhandle, CURLOPT_RETURNTRANSFER, 1);
     $response = curl_exec($curlhandle);
     curl_close($curlhandle);
     $xmlobj = new SimpleXMLElement($response);
 
     foreach ($xmlobj->status as $status)
     {
    echo $status->text.'<br /> by’.$status->user->screen_name.’
    .date(«g:i: AD, F jS Y»,strtotime($status->created_at)).'<br /> <br /> ‘ ;
    }
?>

Позволь мне объяснить. Сначала мы назначаем наше имя пользователя и пароль отдельным переменным, которые будут использоваться позже. Затем я устанавливаю URL на значение, указанное выше. Поскольку метод требует аутентификации, мы отправляем наше имя пользователя и пароль.

Затем мы выполняем наш вызов и сохраняем ответ в отдельной переменной. Затем мы преобразуем его в действительный объект XML, а затем анализируем данные, распечатывая статус и дату публикации.

Я отформатировал данные и время, чтобы посмотреть, как я хочу. Если вам нужны необычные даты и время, например 3 часа назад или 12 дней назад, вам нужно либо искать фрагмент, либо кодировать его самостоятельно. Twitter возвращает только нормально отформатированные данные и время.

Вы получите вывод, похожий на этот:

1
2
3
4
5
6
I am stupid.
Remind me not to try debugging when I am sleepy or tired.
at 6:01: PM Fri, February 14th 2010
 
Flood of traffic.
at 8:51: PM Thu, February 13th 2010

Использование JavaScript для отображения вашего статуса является наиболее элегантным способом продвижения вперед, поскольку вы можете загружать его асинхронно после загрузки страницы, что означает, что даже если Twitter не работает или не работает, ваш сайт функционирует одинаково.

Мы собираемся использовать метод jQuery ajax, чтобы сделать всю нашу грязную работу сегодня.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
$.ajax({
           url : «http://twitter.com/statuses/user_timeline/userid.json?callback=?»,
           dataType : «json»,
           timeout:15000,
    
           success : function(data)
           {
                 $(«#data»).html(«Data successfully obtained! <br />»);
 for (i=0; i<data.length; i++)
               {
 $(«#data»).append(«<p>» + data[i].text) +»</p>»;
 $(«#data»).append(«<p>» + data[i].created_at +»</p>»);
               }
           },
    
           error : function()
           {
               alert(«Failure!»);
           },
    
       });

Опять же, большой кусок кода, но, с разбивкой, это действительно просто. Мы используем низкоуровневую AJAX-функцию jQuery вместо метода getJSON, поскольку низкоуровневый вызов кажется более универсальным.

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

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

Наконец, функция успеха, которая вызывается, когда ошибок не обнаружено. Мы просто анализируем возвращенный объект JSON и распечатываем текст и время создания. #data — это просто контейнер, в который мы помещаем все наши данные.

Этот код является шаблоном для всех ваших методов доступа к данным. Для его модификации требуется минимальное изменение для работы с другими методами API.

В примере с PHP все, что вам нужно сделать, это изменить значение URL-адреса, чтобы оно указывало на новый метод, и в большинстве случаев это нужно сделать. Если метод требует параметры, вы просто добавляете их непосредственно в сам URL. Просто как тот.

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

Помните, этот код является основой для всех ваших других методов, которые получают данные. Это включает в себя методы получения ваших прямых сообщений, сроки, друзей, подписчиков и упомянутых твитов. Просто измените URL, добавьте параметр по мере необходимости, и все готово! Легко нет?


С любым приложением Twitter, которое вы создаете, позволить пользователям обновлять свой статус через него не составит труда. Помните, что ранее приложения, использующие базовую аутентификацию, могли использовать пользовательскую строку источника для всех твитов, отправленных из их приложения. Теперь реализация OAuth — единственный способ получить пользовательскую строку. Короче говоря, если вы хотите, чтобы все твиты, отправленные из вашего приложения, имели ссылку на ваше приложение, используйте OAuth. С этим из пути, давайте посмотрим код.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
    $username = ‘xxx’;
     $password = ‘yyy’;
    $status= ‘Testing out cURL with the Twitter API’;
    $curlhandle = curl_init();
     curl_setopt($curlhandle, CURLOPT_URL, «http://twitter.com/statuses/update.xml»);
     curl_setopt($curlhandle, CURLOPT_USERPWD, $username.’:’.$password);
    curl_setopt($curlhandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlhandle, CURLOPT_POST, 1);
     curl_setopt($curlhandle, CURLOPT_POSTFIELDS, «status=$status»);
    $response = curl_exec($curlhandle);
    curl_close($curlhandle);
 
?>

Мы можем так же легко использовать cURL для публикации в Twitter. Код почти такой же, как и раньше, за исключением того, что мы изменили URL на соответствующий. Кроме того, мы гарантируем, что публикация включена, и устанавливаем поля для публикации. Метод API требует параметров состояния, поэтому мы устанавливаем значение переменной состояния для этого параметра.

Не забудьте убедиться, что текст для публикации имеет кодировку UTF-8. В противном случае мы столкнулись бы с ненужными ошибками.

Теперь мы сохраняем ответ для последующего использования. В этом примере я решил ничего не делать. Но в практическом приложении вы определенно захотите отобразить сообщение об успехе / ошибке и / или отобразить ответ.

Публикация обновления статуса в Twitter с использованием только JavaScript сейчас кажется невозможной, поскольку невозможно передать идентификатор пользователя и пароль. С Flickr эти учетные данные передаются как часть самого запроса POST. В Twitter эти данные нужно отправлять в заголовках HTTP, и, похоже, нет способа сделать это.

Даже несмотря на то, что вы не можете отправить учетные данные в службу, по-прежнему существует проблема невозможности выполнения междоменных запросов POST с объектом XMLHttp. Эти два пункта делают методы API, которые требуют POST-запроса, строгим запретом на JavaScript.

В случае, если вы заинтересованы, успешная публикация вам ответит.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version=»1.0″ encoding=»UTF-8″?>
<?xml version=»1.0″ encoding=»UTF-8″?>
<status>
  <created_at>Fri Aug 14 21:31:53 +0000 2009</created_at>
  <id>3316091255</id>
  <text>Testing out cURL with the Twitter API</text>
  <source><a href=»http://apiwiki.twitter.com/» rel=»nofollow»>API</a></source>
  <truncated>false</truncated>
 
  <in_reply_to_status_id></in_reply_to_status_id>
  <in_reply_to_user_id></in_reply_to_user_id>
  <favorited>false</favorited>
  <in_reply_to_screen_name></in_reply_to_screen_name>
  <user>
    <id>18118645</id>
    <name>Tony / Siddharth</name>
 
    <screen_name>lordtottuu</screen_name>
    <location>India</location>
    <description>Gamer, developer, web designer, writer, geek.
    <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/300532536/NVAGSoNIpS_o5XxbmB4pl-boGheY6JBASaiLiieGIAO6JTitHnRMNJa6ktCPRMQW_normal.jpg</profile_image_url>
    <url>http://ssiddharth.com</url>
    <protected>false</protected>
  
  </user>
 
</status>

Методы кода, рассмотренные выше, состоят из базы для всех ваших данных, которая отправляет данные в Twitter. Это включает в себя методы, которые позволяют вам отслеживать / отписываться от кого-либо, отправлять прямые сообщения, создавать избранное, блокировать людей и т. Д.

Единственное, что вам нужно сделать, это изменить эти URL, посмотреть, требуют ли они дополнительных параметров, и добавить их по мере необходимости. Больше ничего не требуется.


Предоставление пользователям возможности поиска информации в Твиттере потенциально является важной потребностью приложения. Для этого мы можем использовать API поиска для запроса Twitter.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
 
    $searchstring = «Envato»;
    $curlhandle = curl_init();
    curl_setopt($curlhandle, CURLOPT_URL, «http://search.twitter.com/search.json?q=$searchstring»);
    curl_setopt($curlhandle, CURLOPT_RETURNTRANSFER, 1);
 
    $response = curl_exec($curlhandle);
    curl_close($curlhandle);
 
    $json = json_decode($response);
    foreach ($json->results as $result)
    {
    echo $result->text;
    }
     
?>

Приведенный выше код позволяет вам искать в Твиттере твиты, которые ссылаются на Envato. Как обычно, мы меняем URL, чтобы указать правильный метод API, и продолжаем. Поскольку этот метод доступен только в форматах JSON или ATOM, я решил использовать JSON.

Я использовал встроенную в PHP функцию json_decode, чтобы преобразовать ее в объект, чтобы мы могли легко проанализировать ответ. В этом примере я распечатал только сами твиты. В ваших приложениях вы, вероятно, захотите отобразить больше. Пример ответа ниже.

01
02
03
04
05
06
07
08
09
10
[text] => @nsethi check out http://www.envato.com/ if you want some sick tuts…I’m gonna blog about it later.
[to_user_id] => 1273919
[to_user] => nsethi
[from_user] => thinklime
[id] => 3315720513
[from_user_id] => 33020944
[iso_language_code] => en
source] => <a href=»http://www.atebits.com/» rel=»nofollow»>Tweetie</a>
[profile_image_url] => http://s3.amazonaws.com/twitter_production/profile_images/201032569/idTwitter_normal.jpg
[created_at] => Fri, 14 Aug 2009 21:10:42 +0000

Как видите, доступно много информации о пользователе и самом твите. Не стесняйтесь смешивать и сочетать.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
$.ajax({
           
           url : «http://search.twitter.com/search.json?q=somestring&callback=?»,
           dataType : «json»,
           timeout:15000,
    
           success : function(data)
           {
                 // parse data here
           },
    
           error : function()
           {
               alert(«Failure!»);
           },
    
       });

Как обычно, мы используем метод ajax для проверки связи с поисковой службой Twitter. Как и в предыдущем примере, мы включили функцию обратного вызова для преодоления междоменного ограничения.

Пример ответа, взятый прямо из Twitter, выглядит так.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{«results»:[
 
     {«text»:»@twitterapi http:\/\/tinyurl.com\/ctrefg»,
 
     «to_user_id»:396524,
 
     «to_user»:»TwitterAPI»,
 
     «from_user»:»jkoum»,
 
     «id»:1478555574,
 
     «from_user_id»:1833773,
 
     … truncated …],
 
     «since_id»:0,
 
     «max_id»:1480307926,
 
     «refresh_url»:»?since_id=1480307926&q=%40twitterapi»,
 
     «results_per_page»:15,
 
     «next_page»:»?page=2&max_id=1480307926&q=%40twitterapi»,
 
     «completed_in»:0.031704,
 
     «page»:1,
 
     «query»:»%40twitterapi»}
}

Как примечание, метод поиска может быть использован по-разному.

  • ? q = Envato — ищет твиты, содержащие строку Envato
  • ? q = # Envato — ищет хэштеги Envato
  • ? фраза = Envato + marketplace — поиск твитов, содержащих фразу Envato marketplace
  • ? q = from: NETTUTS — возвращает все твиты из NETTUTS
  • ? q = to: NETTUTS — возвращает все твиты в NETTUTS

Я решил ограничиться показом того, как читать и писать в сервис, используя его API. Таким образом, я могу сосредоточиться только на этих конкретных методах. А также потому, что большинство методов основаны на этих основах. Если вы хотите вернуть временную шкалу друга, вы просто измените URL и разберете ответ с минимальными усилиями.

То же самое происходит, если вы хотите отправить прямое сообщение другому пользователю или упомянуть другого пользователя. Основы размещения еще там. Вам просто нужно добавить один или два параметра, чтобы все это произошло. Нет смысла охватывать все это, когда я могу просто объяснить основы более четко.


Я надеюсь, что вы узнали больше о том, как работать с API Twitter сегодня. Как всегда, дайте мне знать, через комментарии, если вам нужна помощь!