呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

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

这里是 基于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的微信公众平台开发(二) - 后续