Thursday, September 13, 2012

Twitter RSS Бот На Python

http://www.spoofi.ru/2011/10/30/twitter-rss-bot-python/

Twitter RSS Бот На Python

30 октября, 2011 г. Категория: Python
Как это обычно бывает, дело было вечером, делать было нечего и я решил немножко изучить язык программирования Python, которым хотел заняться уже давно. Так как я часто пишу в твиттер, то именно на него упал мой взор и я решил написать бота для twitter, который бы умел читать RSS ленты и постить твиты с новыми записями.
Что получилось из моей задумки смотрим под катом. 
И так, для начала я поставил для себя следующие задачи:
  1. Бот должен уметь читать RSS ленты и уметь их парсить.
  2. Бот должен быть написан только на питоне.
  3. Бот должен автоматически фолловить всех, кто фолловит его и отписываться от тех, кто его перестал читать.
Немного посмотрев примеры на других блогах, я попробовал написать отдельно «читалку» RSS,  саму авторизацию и постинг сообщений, фолловинг/анфолловинг твиттерян.
Для всего бота понадобились следующие библиотеки:
  • feedparser — для обработки RSS лент
  • tweepy — для работы с APIлками твиттера
  • oauth — зависимость tweepy — работа с oauth авторизацией
  • cPickle, time — стандартные библиотеки для работы с файлами и временем
  • googl — для сокращения ссылок через сервис goo.gl
Как устанавливать библиотеки я говорить не буду, есть очень много способов, описанных в интернете.  Я использовал easy_install (гугл вам о нём расскажет (: ).
Когда набор для создания бота готов, можно приступить к работе.
Для начала нужно создать приложение и твиттер аккаунт для бота. Делается всё просто — просто заходим на страницу регистрации предложения (я использовал свою учетную запись твиттера для создания приложения, но можно создать аккаунт бота и делать все действия от его имени — так будет даже удобнее) и заполняем все данные. Там же нам нужно будет получить Consumer key и Consumer Secret, а такжеустановить права на Чтение и Запись во вкладке Settings:
access settings twitter app Twitter RSS бот на PythonВ случае если Вы будете использовать для бота ту же учетную запись, от которой и создали приложение — нажимаем на кнопку «Create my access token» и сохраняем полученные Access token и Access token secret.
Если приложение  создано от другого пользователя, который ботом не будет, то нужно проделать следующие операции:
1. Залогинится под аккаунтом бота
2. Написать следующий скрипт, заполнив переменные CONSUMER_KEY и CONSUMER_SECRET:
import tweepy, webbrowser
CONSUMER_KEY = 'paste your Consumer Key here'
CONSUMER_SECRET = 'paste your Consumer Secret here'
auth = tweepy.OAuthHandler (CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url ()
webbrowser.open (auth_url)
verifier = raw_input('PIN: ').strip ()
auth.get_access_token (verifier)
print «ACCESS_KEY = '%s % auth.access_token.key
print «ACCESS_SECRET = '%s % auth.access_token.secret
3. Запустить написанный скрипт. Откроется браузер и Вам будет выдан ПИН код.
4.  Ввести ПИН код в терминале
5. Сохранить Access token и Access token secret, выданные скриптом.

Всё отлично, теперь у нас есть все нужные ключи, питон, требующиеся библиотеки. Пишем код самого бота (в самом коде вставлены комментарии, с помощью которых можно все с легкостью разобрать):
import oauth, tweepy, feedparser, cPickle, time, googl
def Sleep(sec): # функция для приостановки скрипта на заданное время
    print "Ждём %d секунд" % sec
    time.sleep (sec)
    return True
    
def Short(longurl): # сокращает ссылки
    url = short.shorten (longurl)
    return url["id"]
def Tweet(twit): # обновляет статус в твиттере
    if len(twit)<=140 and len(twit)>0:
        res = api.update_status (twit) #обновляем статус
        return True
    else:
        return False
def bot(feedurl):
    feed = feedparser.parse (feedurl) # парсим фид 
    file = open("db.txt""r"# подключаем бд, получаем отправленные ссылки
    posted = cPickle.load (file)
    file.close ()    
    ok = 1
    newposted = posted
    for item in feed.entries:
            for i in posted: # перебираем отправленные и новые ссылки
                    if i == item.link:
                            ok = 0
                            break
                    ok = 1
            if ok:
                text = item.title + " " + Short (item.link)
                print "Твитим: ", text
                Tweet (text) # если такая ссылка не отправлялась - отправляем
                Sleep (300)
                newposted.append (item.link)
    file = open("db.txt","w"# сохраняем в файл отправленные ссылки
    cPickle.dump (newposted, file)
    file.close ()
    return True
def refollow(): # подписывается на всех, кто читает бота
    followers = api.followers ()
    following = api.friends ()
    fnames = []
    for user in following:
        fnames.append (user.screen_name)    
    for follower in followers:
        if (not follower.screen_name in fnames):
            print "Подписываюсь на @",follower.screen_name
            follower.follow ()
    return True
def reunfollow(): # отподписывается от всех, кто не читает бота, но есть в нашем френд листе
    followers = api.followers ()
    following = api.friends ()
    fnames = []
    for user in followers:
        fnames.append (user.screen_name)    
    for follower in following:
        if (not follower.screen_name in fnames):
            print "Отписываюсь от @",follower.screen_name
            follower.unfollow ()
    return True
def init(): 
    global api
    global short
    consumer_key = "" # ваш consumer key
    consumer_secret = "" # ваш consumer secret 
    access_key="" # access key
    access_secret="" # и access secret
    auth = tweepy.OAuthHandler (consumer_key, consumer_secret)
    auth.set_access_token (access_key, access_secret)
    api=tweepy.API (auth)
    short = googl.Googl (""# ключ для API goo.gl
init () # старт
while 1#вечный цикл
    bot ("http://feeds2.feedburner.com/spoofi"# запускаем обработку фида
    Sleep (20*60# спим 20*60 (1800) секунд
    refollow () # фолловим новых читателей
    Sleep (20*60# опять спим
    bot ("http://prodigger.ru/rss/index/"# можно добавить еще один фид
    Sleep (20*60)
    reunfollow () # удаляем не читающих нас
    Sleep (20*60)
И да, для получения ключа APIлок goo.gl: проходим в консоль API, жмем «Add project», почти в самом низу выбираем «URL Shortener API». В подпункте «API access» будет ваш ключ для APIлок:
googl api access key 300x148 Twitter RSS бот на Python
Собственно на этом всё, вставляем в код все ключи, сохраняем в файл, например bot.py и, предварительно дав права на запуск, запускаем его.
Наблюдаем за ботом в твиттере (:
Возможно я что-то сделал не так коротко как можно было, может быть есть и другие косяки — честно говорю, что сел за питон первый раз и за несколько часов родил этот код, сильно помидорами не швыряйтесь (: Буду рад Вашим советам, относительно кода.
UPD: исходники можно скачать архивом.
P.S. вот что получилось у меня — @pytbot
Ну, а если Вы решили транслировать RSS ленту в твиттер, то у Вас явно есть сайт, на котором можно заработать. Биржи купли-продажи ссылок могут помочь с этим!

No comments:

Post a Comment