С недели 2 назад для одного хитрого сайта понадобилось сделать автоматический репост статей в твиттер. Решил не писать на php, а попробовать на python’е наваять. Откровенного говоря очень понравилось! Получилось очень просто и легко.
Написал наверное за пол часа, что с учетом того, что python я вообщем то не знаю совсем не плохо.
- #!/usr/local/bin/python
- # -*- coding: utf8 -*-
- import urllib
- import libxml2
- import pickle
- import twitter
- import os
- from time import sleep
- bit_api="bit.ly.api"
- bit_login="bit.ly.login"
- twit_login="name"
- twit_pass="pass"
- rss_url="http://feed"
- def shorten_url(long_url, login_user, api_key):
- try:
- longUrl = urllib.urlencode(dict(longUrl=long_url))
- login = urllib.urlencode(dict(login=login_user))
- apiKey = urllib.urlencode(dict(apiKey=api_key))
- encodedurl="http://api.bit.ly/shorten?version=2.0.1&%s&%s&%s" % (longUrl, login, apiKey)
- request = urllib.urlopen(encodedurl)
- responde = request.read()
- request.close()
- responde_dict = eval(responde)
- short_url = responde_dict["results"][long_url]["shortUrl"]
- return short_url
- except IOError, e:
- raise "urllib error "
- if __name__ == '__main__':
- doc = libxml2.parseFile(rss_url)
- links=[]
- for item in doc.xpathEval('//channel/item/link'):
- links.append(item.content)
- titles=[]
- for item in doc.xpathEval('//channel/item/title'):
- titles.append(item.content)
- rss_path = os.path.join(os.path.dirname(__file__), 'rss.db')
- file = open (rss_path)
- old_links=pickle.load(file)
- file.close()
- items=[]
- f=0
- for x in xrange(0,len(links)):
- for old in old_links:
- f=0
- if (old==links[x]):
- f=1
- break
- if (f==0):
- items.append(x)
- api = twitter.Api(username=twit_login, password=twit_pass)
- for x in items:
- title=titles[x].decode("utf8")
- if len(title)<=120:
- print "link %s: %s" % (x,links[x])
- if x!=0:
- sleep(15)
- api.PostUpdate(title+" "+shorten_url(links[x], bit_login, bit_api))
- file=open(rss_path,"w")
- ser=pickle.dump(links,file)
- file.close()
Какие трудности вылезли в процессе:
1. Нужно как-то было не постить то что уже отправлено. Решилось сохранением списка ссылок в сериализованном виде в файл
2. Размер сообщение в твиттере не больше 140 символов, а надо бы в твитты еще и ссылки на статьи вставлять, притом что заголовки у статей я бы сказал не маленькие. Решилось регистрацией на bit.ly (сервис укорачивания ссылок) и собственно укорачивание. Не помню уже сам написал или с сайта их взял функцию, ибо там все так просто что даже неинтересно.
3. Невероятно, но встала проблема с кодировкой. Решилось за 5 минут гугления и пробования нескольких комбинаций. Что-то не понимал я откуда куда функции перекодируют. Вобщем вот так надо
title.decode(«utf8»)
4. Ну и задержку пришлось поставить, иначе bit.ly говорило зайдите позже 🙂
Дальше все это безобразие запихал в крон:
*/12 * * * * /usr/local/bin/python /usr/local/www/rss2twitter/rss2twit.py
За время пока это дело работает, уже сделан репост 1256 твиттов, так что красота.
А вообще все очень просто и легко, особенно учитывая что twitter api уже написано. хотя если бы его небыло, думаю я бы просто логинился, сохранял куки и постил обычным POST запросом.
Ну и файлик со скриптом на последок: rss2twit.tar.gz
З.Ы. с удовольствием выслушаю критику, потому как первое не Hello, world! приложение на python’е. 🙂
на питоне то не сложно 🙂 многие советуют ruby использовать как альтернативу. но я хз, я сишник..вам виднее )
Кажется, это подойдет.