codeisartАвторский веб-архив · 2008–2011

Python

Python: Получение последнего сообщения из Twitter

В этой статье

Продолжить чтение

Python →

Пишем сейчас на Django сайт, где требуется получать последнее сообщение из Twitter аккаунта корпоративного микроблога. Некоторое время назад я показывал, как это можно сделать в PHP, теперь пишу тоже самое на Python.

Небольшие отличия есть, а именно — мы получаем данные из Twitter API в формате JSON (используется библиотека simplejson), а не в XML, как это было в PHP версии. Можно без проблем использовать и XML, просто с JSON мне удобнее работать.

Аналогично реализовано кеширование твитта в локальный файл и обновление через определенный промежуток времени.

Код, вся дополнительная информация в комментариях:

from django.conf import settings
from time import time
import urllib, os, simplejson

class Twitter:
  """
  Скачиваем последнее сообщение из Twitter пользователя.

  Требуется:
  - библиотека simplejson (http://pypi.python.org/pypi/simplejson/)
  - библиотека urllib
  - библиотека os
  - метод time.time()

  Необходимо в settings.py добавить переменные:

  TWITTER_ACCOUNT = 'Skaizer' # Логин пользователя, чью ленту будем читать.
  TWITTER_CACHE_PERIOD = 3600 # Период обновления кеша в секундах, когда 0, кеш игнорируется.
  TWITTER_CACHE_FILE = 'last_twitt.txt'; # Имя файла, куда будем дампить кеш. Строится путь относительно MEDIA_ROOT.

  """
  def __init__(self):
    self.twitt_file = getattr(settings,'MEDIA_ROOT','./') + getattr(settings,'TWITTER_CACHE_FILE','last_twitt.txt')
    self.cache_period = getattr(settings,'TWITTER_CACHE_PERIOD',0)
    self.username = getattr(settings,'TWITTER_ACCOUNT',None)

  def returnLastTwitt(self):
    """
    Возвращаем кеш, если он имеется, и по времени существует не менее установленного в конфигах периода.
    Иначе возвращаем сообщение из инета.
    """
    if self.cache_period !=0:
      if os.path.exists(self.twitt_file):
        if self.cache_period > self.getCacheDateDiff():
          return self.getLastFromCache()
    return self.getLastFromWeb()

  def getLastFromWeb(self):
    """
    Скачивает твиттер ленту в Интернет и выбирает последнее сообщение
    """
    feed = 'http://twitter.com/statuses/user_timeline/' + self.username + '.json';
    feed_obj  = simplejson.loads(urllib.urlopen(feed).read())
    last_twitt = feed_obj[0]['text']
    self.cache_twitt(last_twitt.encode("utf_8"))
    return last_twitt

  def cache_twitt(self, msg):
    """
    Записывает последний твитт в локальный файл
    """
    handle = open(self.twitt_file,'w')
    handle.write(msg)
    handle.close()

  def getCacheDateDiff(self):
    """
    Считает время в секундах с последнего изменения файла кеша.
    """
    diff = float(time()) - float(os.path.getmtime(self.twitt_file))
    return diff

  def getLastFromCache(self):
    """
    Возвращает закешированное сообщение из файла.
    """
    handle = open(self.twitt_file,'r')
    cached_twitt = handle.read()
    handle.close()
    return cached_twitt

  def getLast(self):
    if not self.username:
      return False
    return self.returnLastTwitt()

Вот так класс используется:

def last_twitt():
    t = Twitter()
    return {
      'last_twitt' : t.getLast(),
    }

В примере показана схема файлового кеша. Старый публичный endpoint twitter.com/statuses/user_timeline/<name>.json и синтаксис Python 2 не подходят для нового клиента. Получение данных требуется отдельно реализовать по актуальному договору API; кеш не заменяет обработку сетевой ошибки или пустой ленты.