做一个树莓派微博机器人
###准备
首先得有一个树莓派,如果你还不知道什么是树莓派,可以先去淘宝一百多淘一个,就是一个小巧的卡片电脑,可以安装linux操作系统,就用树莓派配置一个crontab定时跑就可以。如果没有的话,vps或者虚拟机都可以,不过树莓派比较方便,可以搭建一个简单的服务器没日没夜拼命地跑。机器人的话可以做微博推广,自己定制内容。比如我的叫做『老王讲段子』,每个小时自己发一个段子、搞笑图片或者无节操的gif。当然目前还不太好控制发的内容,就是有时候担心发的太没节操。冏。。。
###微博接口
建议之前先看看微博的开发者文档,了解一下一些接口的调用。不过有人已经封装了微博的python接口,直接pip install weibo
就可以安装(感谢这位代码贡献者)。这里使用它继续封装成一个类,使用更加方便。
from weibo import Client
class WeiboApp(object):
"""WeiboApp client."""
def __init__(self, api_key, api_secret, callback_url, username,
password, uid):
self._c = Client(api_key, api_secret, callback_url,
username=username, password=password)
self._uid = uid
def get_show(self):
return self._c.get('users/show', uid=self._uid)
def post_text(self, text):
text = text if len(text) <= 139 else text[0:139]
self._c.post('statuses/update', status=text)
def post_img(self, text, img_ori):
text = text if len(text) <= 139 else text[0:139]
self._c.post('statuses/upload', status=text, pic=img_ori)
###内容来源
当然是爬虫啦,找到你想爬的内容,比如我这里用的是糗事百科的内容,我在项目文件里建立了一个文件夹crawler,不同网站的爬虫都可以塞进去,建立一个crawler基类,以后每个网站的爬虫都可以继承它。当然也可以直接用scrapy框架,不过微博api接口有频率限制,爬虫就是简单的就好,不需要多线程的。
form bs4 import BeautifulSoup
import lxml
class QiubaiCrawler(object):
def __init__(self, url):
self._url = url
def get_html(self):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
try:
html = requests.get(self._url, headers=headers, timeout=10).text
except:
html = ''
traceback.print_exc()
return html
def get_hot(self, html):
soup = BeautifulSoup(html, 'lxml')
article_tag_list = soup.find_all('div',
class_='article block untagged mb15')
res_list = []
try:
for article_tag in article_tag_list:
author_a_tag = article_tag.find('div', class_='author')
if author_a_tag:
author_tag = author_a_tag.find('a')
author = author_tag.text if author_tag else ''
else:
author = ''
content_tag = article_tag.find('div', class_='content')
content = content_tag.text if content_tag else ''
thumb_tag = article_tag.find('div', class_='thumb')
img = thumb_tag.find('img').get('src') if thumb_tag else ''
d = {'content': content, 'img': img, 'author': author}
res_list.append(d)
except:
traceback.print_exc()
return res_list
def get_duanzi(self, html):
return self.get_hot(html)
def get_img(self, html):
return self.get_hot(html)
###存储内容
爬虫爬下来的内容有些可以不用保存,有些还是想把它保存下来,比如煎蛋的妹子图和一些好玩的没节操的gif,这里就使用一些云存储服务,比如leancloud或者qiniu,把爬下来的东西直接上传上去就好。存个上万几十万的无压力,还有外链。你可能需要看下lencloud或者qiniu的文档了解下如何上传和检索。
比如一个简单的上传文件的例子,用的leancloud,不过File对象没法直接检索,只能迂回。新建一个类,然后把File文件类作为它的一个成员。比如为图片文件创建一个类叫做ImgFile。以后查询检索等都是用ImgFile。
from leancload import File
def upload_file(file_abspath):
filename = os.path.basename(file_abspath) # filename have suffix
with open(file_abspath, 'r') as f:
upload_file = File(filename, f)
upload_file.save()
print 'uploaded', file_abspath
img_file = ImgFile()
img_file.set('File', upload_file)
img_file.set('filename', filename)
img_file.save()
###定期发微博
有了前面这些铺垫,就可以发微博了。实际上有了第一个类就可以直接发了,后边都是为了寻找发送内容的。为了实现定期发送微博,需要用crontab配置每小时发一个,写个shell脚本跑。
#!/bin/bash
PREFIX=$(cd "$(dirname "$0")"; pwd)
cd $PREFIX
python weibo_app.py
到这里就大功告成了,把代码clone到树莓派上,用pip install -r requirements.txt
安装所有依赖,就可以用crontab每个小时跑这个shell脚本了。不过最主要的不是代码,而是找到高(wu)质(jie)量(cao)的内容发送,这样才会有人(qiu)关(guan)注(zhu)。