美文网首页星火优学技术杂谈程序员
基于Django、WeRoBot的微信公众平台开发(二) - 后

基于Django、WeRoBot的微信公众平台开发(二) - 后

作者: 呓语_yiyu | 来源:发表于2017-04-20 21:48 被阅读105次

    这里是 基于Django、WeRoBot的微信公众平台开发(二) 的后续,主要记录其它功能的开发。

    “优美诗句”功能

    原理:爬取优美诗句,存入数据库,封装接口,调用接口

    作用:在公众号里回复“来个优美的句子”或者“来句诗”,它便会回复给你一条优美的诗句。

    过程

    实现过程和“讲个笑话”功能类似。

    1、创建数据库表

    作用:在数据库(mysql)中创建用于存储诗句的表

    create table `poetrys` ( 
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `content` varchar(1024) NOT NULL
    ) DEFAULT CHARSET=utf8;
    

    2、编写段子抓取脚本

    作用:抓取 句子迷中“句集:小明”中的句子,存储在数据库中(只存储之前没出现过的诗句,避免重复)。

    #coding=utf-8
    import urllib
    import urllib2
    import re
    import MySQLdb
    
    timeout=5                                   # 超时时间
    host = 'http://www.juzimi.com'     # 句子迷主页面
    target = 'album/1572107'             # 句子迷“句集:小明”栏目
    
    def get_html(url,timeout=None):
        # 获取指定url的html源码
        try:
            headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  }
            request = urllib2.Request(url,headers=headers)
            response = urllib2.urlopen(request,timeout=timeout)
        except Exception,e:
            raise '[Error] get_html()获取源码失败\n' + e
        return response.read()
    
        
    def connectMySQL():
        # 连接mysql数据库
        conn = MySQLdb.connect(
            host='localhost',
            port=3306,
            user='YOUR_USERNAME',
            passwd='YOUR_PASSWORD',
            db='blog',
            charset='utf8',
            )
        return conn
    
    def getPoetry():
        # 抓取诗句
        # 获取总页数
        try:
            pagesum = 7
        except Exception,e:
            print e
            return []
    
        poetry_list = []
    
        # 开始爬取
        for page in range(0,pagesum):
            print '当前页数:',page
            url = '%s/%s?page=%d'%(host,target,page)
            try:
                html = get_html(url,timeout).decode('utf8')
            except Exception,e:
                print e
                print '抓取出错,跳过第%s页'%page
                continue
            print '正在匹配……'
            pattern = re.compile("<div id=\"bdshare\" class=\"bdshare_t bds_tools get-codes-bdshare\" data=\"{'text':'.*?','desc':'(.*?)','url':'.*?','pic':'.*?'}\">",re.S)
            items = re.findall(pattern,html)
    
            # 匹配到诗句
            for item in items:
                print item
                poetry_list.append(item)
                    
        return poetry_list
    
    def save2mysql(poetry_list):
        # 将抓取的段子存入数据库
        conn = connectMySQL()
        cur = conn.cursor()
        for i,poetry in enumerate(poetry_list):
            print '正在插入第%d句诗……'%(i+1)
            sql = 'select 1 from poetrys where content = "%s" limit 1; '%(poetry)
            isExist = cur.execute(sql)
            if isExist==1:
                print '-> 该诗句已存在于数据库!放弃插入!'
            else:
                sql = 'insert into poetrys (`content`) values ("%s")'%( poetry )
                cur.execute(sql)
        print '正在提交以上所有操作……'
        conn.commit()
    
    def main():
        #  主程序
        try:
            poetry_list = getPoetry()
            save2mysql(poetry_list)
        except Exception,e:
            print e
    
    if __name__=='__main__':
        main()
    

    3、接口函数实现

    作用:每次调用,从数据库中随机取出一条诗句,以json的格式返回。

    前言:代码集成在django中,不想在django中使用的可以适当修改代码。

    代码

    from django.http import HttpResponse
    import MySQLdb
    import random
    import json
    
    # 公共部分
    # 数据库设置
    username = 'YOUR_USERNAME'      # 你的数据库用户名
    password = 'YOUR_PASSWORD'      # 你的数据库密码
    dbname = 'YOUR_DB'                          # 你创建的表所在的数据库
    dbport = 3306
    
    # 数据库连接函数
    def connectMySQL():
        # 连接mysql数据库
        conn = MySQLdb.connect(
            host='localhost',
            port=dbport,
            user=username,
            passwd=password,
            db=dbname,
            charset='utf8',
            )
        return conn
    
    # 接口部分
    # 返回一条诗句
    def get_poetry(request):
        response = ''
        try:
            # 连接数据库
            conn = connectMySQL()
            cur = conn.cursor()
            # 生成随机抓取id
            sql = 'select count(*) from poetrys'
            cur.execute(sql)
            poetry_sum = cur.fetchone()[0]
            poetry_idx = random.randint(1,poetry_sum)
            # 抓取该id的段子数据
            sql = 'select * from poetrys where id=%d'%poetry_idx
            cur.execute(sql)
            poetry = {}
            poetry['id'],poetry['content'] = cur.fetchone()
            response = json.dumps(poetry,ensure_ascii=False)
            # 关闭数据库连接
            cur.close()
            conn.close()
        except Exception as e:
            print e
            logger.error(e)
        return HttpResponse(response)
    

    前端接口封装好之后,可以在浏览器中输入以下url测试这个接口:

    http://www.yangyingming.com/api/get_poetry/

    每次刷新都会返回不同的诗句。

    4、集成在微信机器人中

    作用:将“优美诗句”功能集成到微信机器人的聊天功能中,用户在聊天窗口发送“来个句子”类似的消息时,随机回复一条诗句。

    代码

    @robot.text
    def echo(message):
        if re.compile(".*?诗.*?").match(msg) or\
           re.compile(".*?句.*?").match(msg):
            apiurl = "http://www.yangyingming.com/api/get_poetry"
            response = get_html(apiurl,timeout=timeout)
            joke = json.loads(response)
            return joke['content'].encode('utf8')
    

    运行效果:

    运行效果

    相关文章

      网友评论

        本文标题:基于Django、WeRoBot的微信公众平台开发(二) - 后

        本文链接:https://www.haomeiwen.com/subject/hmhrzttx.html