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

VitaliyRodnenko, 13.09.2009

Пишем сейчас на 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(),
    }

Все просто, без заморочек, пользуйтесь на здоровье.

PS: Кстати у нас новый осенний логотип, очень симпатично получилось на наш взгляд.

Интересно почитать:

Подписаться на обновления блога

Вам понравился наш блог, хотите следить за обновлениями? Подпишитесь на RSS рассылку или рассылку по электронной почте. Так же вы можете следить за нами в Twitter.

Категории: Python | Комментировать

Комментарии

  1. Kirill Vlasov / 13.09.2009 в 05:37

    Есть же pyTwitter? Или она не позволяет последнее сообщение получить?

  2. Skaizer / 13.09.2009 в 17:10

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

  3. Давидка / 16.10.2009 в 23:15

    Твиттер вообще набирает обороты!

  4. Daiska / 17.01.2010 в 03:39

    В django уже вроде simplejson встроен.

    from django.utils import simplejson

    Ставить ее не обязательно.

Оставить комментарий

480×60
480×60