Pull to refresh

Автоматическая отсылка анонсов в твиттер

Reading time3 min
Views769
Недавно, при работе над проектом на Джанго, понадобилось автоматически отправлять в твиттер заголовок и укороченную ссылку для публикуемых статей от имени пользователя.

Как оказалось, делается это совсем несложно.


Я сразу решил не изобретать велосипед и воспользоваться одной из доступных библиотек для работы с твиттером. Больше всего мне глянулся twython. Импортируем его в models.py:

Copy Source | Copy HTML
  1. import twython.core as twython

Вот упрощенная модель публикаций. Я оставил только самый минимум полей:

Copy Source | Copy HTML
  1. class Post(models.Model):
  2.     title = models.CharField(max_length=100)
  3.     media = models.TextField()
  4.     published = models.BooleanField(default=False)
  5.     tweeted = models.BooleanField(default=False, editable=False)
  6.  
  7.     def __unicode__(self):
  8.         return u'%s' % self.title
  9.  
  10.     @models.permalink
  11.     def get_absolute_url(self):
  12.         return ('news.views.news_view', [str(self.id)])

У модели есть два поля — published для того, чтобы не «твитить» черновики и tweeted, чтобы каждый пост анонсировался только один раз.

Теперь сам процесс отправки анонса:

Copy Source | Copy HTML
  1. def post_to_twitter(sender, instance, **kwargs):
  2.     """<br/>    Отправляем анонс в тви если пост опубликован но еще не затвитен<br/>    """
  3.     if instance.published and not instance.tweeted:
  4.         try:
  5.             twitter = twython.setup(username="TWITTER_USER", password="TWITTER_PASSWORD")
  6.             long_url = "http://%s%s" % (Site.objects.get_current(), instance.get_absolute_url())
  7.             short_url = twitter.shortenURL(long_url)
  8.             twi_message = instance.title + " " + short_url
  9.             try:
  10.                 twitter.updateStatus(twi_message)
  11.                 Post.objects.filter(pk=instance.pk).update(tweeted = True)
  12.             except TwythonError:
  13.                 pass
  14.         except AuthError:
  15.             pass

Процесс отсылки в твиттер логично повесить на событие post_save:

post_save.connect(post_to_twitter, sender=Post)


Вот и все. Можно добавить всяких полезностей по-вкусу, но и в таком виде вполне себе работает.
Tags:
Hubs:
+19
Comments32

Articles