做一个树莓派微博机器人

###准备
首先得有一个树莓派,如果你还不知道什么是树莓派,可以先去淘宝一百多淘一个,就是一个小巧的卡片电脑,可以安装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)。

项目地址:
https://github.com/PegasusWang/WeiboApp.git