django + twitter

«Мопед не мой, я лишь объяву разместил»
У меня пока не хватает кармы, чтоб высылать за такие статьи инвайты на хабр, поэтому видимо кроме меня этого не жалает делать никто, то буду опубликовать тут. ибо информацию считаю полезной, не только для себя.

Доброго времени суток!
Появилась необходимость следующего характера: в движке на django, при публикации новости, чтоб создавался кросс-пост на twitter. Т.е. пишем новость, жмём сохранить и на твиттере появляется пост аля «Название статьи, bit.ly/s/ссылка_на_нашу_новость».

Для реализации потребовались следующие пакеты:

1. python-oauth2 | https://github.com/simplegeo/python-oauth2
2. oauth-python-twitter2 | http://code.google.com/p/oauth-python-twitter2/
3. simplejson | http://pypi.python.org/pypi/simplejson/
4. oauth2 | http://pypi.python.org/pypi/oauth2/
5. bitlyapi | http://pypi.python.org/pypi/bitlyapi/

1-4 пакеты нужны нам для связи с twitter’ом, 5-ый для укорачивания ссылок…
Перед тем как начать предполагаю, что у Вас есть аккаунт в twitter.com и bit.ly. Если нет, то это по минуте на регистрацию на каждом из сервисов.

Начнём с twitter’a…

При-python-им twitter

Проставляем все пакеты и выполняем следующие действия (кстати они описаны выше в руководстве python-oauth2):
Логинимся в браузере в twitter.com, и после этого переходим по ссылке http://twitter.com/apps/new. Далее мы воспользуемся инструкциями из замечательной статьи:

1. Заполняем все поля на свое усмотрение, для Application Type выбираем Client
2. Для Default Access type выбираем Read & Write, Use Twitter for login я оставил не выбранным
3. Вводим капчу и сабмитим

После этого twitter сгенерит CONSUMER_KEY, CONSUMER_SECRET.
Следующие два параметра нам вернет такой скрипт

from oauthtwitter import OAuthApi
import pprint

CONSUMER_KEY = "*****"
CONSUMER_SECRET = "*****"

twitter = OAuthApi(consumer_key, consumer_secret)
temp_credentials = twitter.getRequestToken()
print(twitter.getAuthorizationURL(temp_credentials))
oauth_verifier = raw_input('What is the PIN? ')
access_token = twitter.getAccessToken(temp_credentials, oauth_verifier)

print("oauth_token: " + access_token['oauth_token'])
print("oauth_token_secret: " + access_token['oauth_token_secret'])

В CONSUMER_KEY, CONSUMER_SECRET вводим значения полученные на предыдущем этапе, запускаем. Скрипт сгенерит url, переходим по нему и копируем PIN который нам вежливо предлагает twitter. Вставляем PIN в скрипт, он как раз его ждет.

На выходе мы получим значения для двух последних параметров OAUTH_TOKEN и OAUTH_TOKEN_SECRET.
Все, теперь у нас есть все что надо для oauth авторизации, осталось немного подправить скрипты.

Готовимся сокращать ссылки вместе с bit.ly

Предельно простой и удобный модуль bitlyapi. Схема простая:

1. Регистрируемся на bit.ly
2. Логинимся
3. Переходим по ссылке
4. Копируем username и api key

Правим модель в Django

Здесь мы не рассматриваем создание модели, предполагается, что Вы это умеете. В шапку добавляем:

#twitter
import oauth2 as oauth
import bitlyapi
bitly = bitlyapi.BitLy('username bitly', 'api key bitly') #вводим данные с прошлого шага
from oauthtwitter import OAuthApi
CONSUMER_KEY = "*****вводим свои данные*****"
CONSUMER_SECRET = "*****вводим свои данные*****"
OAUTH_TOKEN = "*****вводим свои данные*****"
OAUTH_TOKEN_SECRET = "*****вводим свои данные*****"
twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

Переходим к моделе. Логика проста, есть boolean поле twitter_export, если галочка ставится, то новость публикуется при сохранении на твиттере. Если не понятно, то сейчас всё увидите и поймёте ))

class News(models.Model):
    title = models.CharField(max_length=300)
    content = models.TextField()
    twitter_export = models.BooleanField(default=False)

def save(self):
    link = bitly.shorten(longUrl='http://example.com/news/' + str(self.id) + '/') #формируем ссылку, которая будет сокращенна
    if self.twitter_export:   #если стоит галочка на twitter_export
        twit = u'%s... | Читать %s' % (self.title[:70], link['url'])  #формируем, что писать в твиттер.. учтите, что длина сообщения в твиттере 160 символов
        twitter.UpdateStatus(twit) #публикуем наш твит
        self.twitter_export = False #убираем галку twitter_export
    super(News, self).save()

Всё готово! Можно тестировать!

Источники

1. Пишем twitter-бота на python
2. Twitter Three-legged OAuth Example

  1. Приятно видеть свою статью )))
    нашёл несколько версий её в инете… только Вы написали, что «мопед не мой»… ))) везде народ выставляет как собственное творчество…

    А по-поводу инвайта на хабре.. и под это дело в том числе писалась эта статья… но к сожалению django’нистов на хабре мало(.. так что не оч ценят.. )))

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


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">