Python: Получение последнего сообщения из Twitter
Пишем сейчас на 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-лента комментариев к этой статье | Обратная ссылка (trackback link)



Есть же pyTwitter? Или она не позволяет последнее сообщение получить?
Быть может и может, насколько мне известно pyTwitter реализует полноценную или почти полноценную работу с сервисом через Twitter API, т.е. постинг сообщений, фолоувинг и прочие функции твиттера, в моем случае нужно гораздо меньше
Твиттер вообще набирает обороты!
В django уже вроде simplejson встроен.
from django.utils import simplejson
Ставить ее не обязательно.