HighLoad.org – блог о высоких нагрузках
HighLoad.org > Пишем Twitter службу на App Engine

Пишем Twitter службу на App Engine
2010-02-20 20:18 my_fess  
Сейчас очень популярны приложения, которые позволяют получать или делать обновления Twitter. Есть такие приложения и на App Engine. Twitter предоставляет исчерпывающий API, который дает доступ к большей части возможностей.
API Twitter можно разделить на 2 части: Streaming API и все остальное. Streaming API - это рекомендуемый способ для получения больших объемов твитов в реальном времени. К сожалению сейчас его использование на App Engine неосуществимо. Однако, остальная часть API хорошо подходит для использования на App Engine, и включает следующие возможности:
  • получение timeline, mention, retweet;
  • отправка обновлений статуса (удаление и ретвиты);
  • получение информации о пользователе.

Аутентификация

Большая часть вызовов Twitter API требует аутентификации. В настоящее время поддерживаются 2 различных метода: Basic и OAuth. Basic аутентификация, как следует из названия, использует HTTP Basic аутентификацию, которая требует запроса логина и пароля у пользователя. Мы не будем использовать этот метод, потому что он устарел, и это плохая идея запрашивать у пользователя полномочия. OAuth API делает возможным использовать Twitter API от имени пользователя, не зная его пароль, на этом мы и сосредоточимся сегодня. Ключевая особенность OAuth − это то, что для каждого потребителя (то есть для вас) требуется 'consumer key'  и 'consumer secret'. Первое − это ключ, который идентифицирует вас, второе - секретное значение, которые известно только вам и Twitter. Вместе они позволяют вам доказать Twitter, что вы тот за кого себя выдаете. В дополнение, для каждого пользователя, которого вы аутентифицируете, вам необходимо хранить user token и user secret. Они действуют также как client token и secret, и позволяют вам доказать Twitter, что вы делаете легальные запросы от имени клиента. Для того, чтобы получить разрешение действовать от имени пользователя, вам необходимо пройти через процесс аутентификации. Он состоит из отправки пользователя на URL на сайте twitter.com, где Twitter спрашивает у него, разрешает ли он вам использовать его аккаунт. Если пользователь соглашается, Twitter отправляет пользователя назад на ваш сайт, встраивая в URL все необходимые подробности. После этого у вас есть все необходимые ключи и секреты для использования API от имени этого пользователя (пока он не отменит ваш доступ!). OAuth − сравнительно простой протокол, но было бы замечательно, если бы нам не надо было реализовать его самим. К счастью, Mike Knapp проделал всю тяжелую работу за нас в виде библиотеки AppEngine-OAuth (ссылка ведет на мой собственный форк, который содержит несколько улучшений, которые еще не перенесли в основную ветку). Библиотека берет на себя OAuth аутентификацию и OAuth запросы, делает так, чтобы это просто работало.

Использование AppEngine-OAuth

В первую очередь, вам надо создать в Twitter OAuth потребителя. Возьмите ключ и секрет и сохраните их где-нибудь - в коде, в хранилище данных, где вам будет удобно. Затем скачайте библиотеку по ссылке, приведенной выше. Вам нужен только файл 'oauth.py'. Вам надо интегрировать 3 основных компонента:
  1. отправка пользователя в Twitter для аутентификации;
  2. обработка редиректа назад для завершения аутентификации;
  3. совершение вызовов Twitter API, используя полученные полномочия.
Рассмотрим их по очереди.

Запуск процесса аутентификации

Это очень просто. Сначала сконструируем oauth.TwitterClient:
consumer_key = "LKlkj83kaio2fjiudjd9...etc"
consumer_secret = "58kdujslkfojkjsjsdk...etc"
callback_url = "http://www.myurl.com/callback/twitter"

client = oauth.TwitterClient(consumer_key, consumer_secret, callback_url)
callback_url это полный URL callback обработчика в вашем приложении. Затем вы можете вы сгенерировать URL и перенаправить пользователя на него следующим образом:
self.redirect(client.get_authorization_url())

Завершение аутентификации

Когда пользователь закончит в Twitter, он будет перенаправлен на callback URL, который мы предоставили. Обработка этого требует конструирования другого экземпляра TwitterClient и вызова get_user_info у него:
class CallbackHandler(webapp.RequestHandler):
  def get(self):
    client = oauth.TwitterClient(consumer_key, consumer_secret, callback_url)
    auth_token = self.request.get("oauth_token")
    auth_verifier = self.request.get("oauth_verifier")
    user_info = client.get_user_info(auth_token, auth_verifier=auth_verifier)
Переменная 'user_info' − это словарь, содержащий соответствующую информацию об аутентифицированном пользователе. Отдельного внимания заслуживают ключи 'token' и  'secret', которые нам надо хранить для аутентификации будущих запросов, и ключ 'username', который идентифицирует пользователя. Такие службы как Twitter также выдают дополнительные ключи, например, 'name' - отображаемое имя пользователя, URL аватара. Если хотите увидеть реально работающий callback-обработчик, посмотрите на Tweet Engine.

Выполнение аутентифицированных запросов

Теперь, когда вы аутентифицировали пользователя и сохранили полномочия, вы можете делать аутентифицированные запросы от его имени. Библиотека OAuth опять-таки упрощает это. Создаем снова экземпляр TwitterClient и вызываем его метод make_request, передавая URL, OAuth token  и secret пользователя вместе с любыми дополнительными параметрами:
client = oauth.TwitterClient(consumer_key, consumer_secret, callback_url)

additional_params =
{
  status: "Testing Twitter OAuth",
}

result = client.make_request
(
    "http://twitter.com/statuses/update.json",
    token=client_token,
    secret=client_secret,
    additional_params=additional_params,
    method=urlfetch.POST
)
Переменная 'result' − это объект Response urlfetch, который вы можете рассматривать как результат любого другого urlfetch вызова. В качестве реального примера можете опять посмотреть на то, как это делает Tweet Engine. Хотя там это немного усложнено некоторыми добавочными слоями абстракции, нерассмотренными здесь.

Rate Limiting

Одна из проблем, которая возникает у большинства пользователей при работе с Twitter через AppEngine − это ограничение частоты запросов. У Twitter есть 2 системы ограничений: по IP и по приложению/пользователю. Ограничения по IP проявляются у пользователей search API, потому что AppEngine приложения делают внешние запросы через один и тот же пул IP. Частота аутентифицированных запросов, которые мы делаем, ограничивается по приложению и/или по пользователю,  поэтому нам не приходится волноваться насчет ограничений по IP. Пожалуй, это все, что касается использования Twitter OAuth API через App Engine.

Автор статьи: Nick Johnson Дата: 17 февраля 2010 Оригинал статьи


комментарии [0]  | комментировать

  © 2010-2018 HIGHLOAD