Недавно, при работе над проектом на Джанго, понадобилось автоматически отправлять в твиттер заголовок и укороченную ссылку для публикуемых статей от имени пользователя.
Как оказалось, делается это совсем несложно.
Я сразу решил не изобретать велосипед и воспользоваться одной из доступных библиотек для работы с твиттером. Больше всего мне глянулся twython. Импортируем его в models.py:
Вот упрощенная модель публикаций. Я оставил только самый минимум полей:
У модели есть два поля — published для того, чтобы не «твитить» черновики и tweeted, чтобы каждый пост анонсировался только один раз.
Теперь сам процесс отправки анонса:
Процесс отсылки в твиттер логично повесить на событие post_save:
Вот и все. Можно добавить всяких полезностей по-вкусу, но и в таком виде вполне себе работает.
Как оказалось, делается это совсем несложно.
Я сразу решил не изобретать велосипед и воспользоваться одной из доступных библиотек для работы с твиттером. Больше всего мне глянулся twython. Импортируем его в models.py:
Copy Source | Copy HTML
- import twython.core as twython
Вот упрощенная модель публикаций. Я оставил только самый минимум полей:
Copy Source | Copy HTML
- class Post(models.Model):
- title = models.CharField(max_length=100)
- media = models.TextField()
- published = models.BooleanField(default=False)
- tweeted = models.BooleanField(default=False, editable=False)
-
- def __unicode__(self):
- return u'%s' % self.title
-
- @models.permalink
- def get_absolute_url(self):
- return ('news.views.news_view', [str(self.id)])
У модели есть два поля — published для того, чтобы не «твитить» черновики и tweeted, чтобы каждый пост анонсировался только один раз.
Теперь сам процесс отправки анонса:
Copy Source | Copy HTML
- def post_to_twitter(sender, instance, **kwargs):
- """<br/> Отправляем анонс в тви если пост опубликован но еще не затвитен<br/> """
- if instance.published and not instance.tweeted:
- try:
- twitter = twython.setup(username="TWITTER_USER", password="TWITTER_PASSWORD")
- long_url = "http://%s%s" % (Site.objects.get_current(), instance.get_absolute_url())
- short_url = twitter.shortenURL(long_url)
- twi_message = instance.title + " " + short_url
- try:
- twitter.updateStatus(twi_message)
- Post.objects.filter(pk=instance.pk).update(tweeted = True)
- except TwythonError:
- pass
- except AuthError:
- pass
Процесс отсылки в твиттер логично повесить на событие post_save:
post_save.connect(post_to_twitter, sender=Post)
Вот и все. Можно добавить всяких полезностей по-вкусу, но и в таком виде вполне себе работает.