博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Django、WeRoBot的微信公众平台开发(二) - 后续
阅读量:4101 次
发布时间:2019-05-25

本文共 4177 字,大约阅读时间需要 13 分钟。

这里是 的后续,主要记录其它功能的开发。

“优美诗句”功能

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

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

过程

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

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-8import urllibimport urllib2import reimport MySQLdbtimeout=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 conndef 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("
",re.S) items = re.findall(pattern,html) # 匹配到诗句 for item in items: print item poetry_list.append(item) return poetry_listdef 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 eif __name__=='__main__': main()

3、接口函数实现

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

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

代码

from django.http import HttpResponseimport MySQLdbimport randomimport 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测试这个接口:

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

4、集成在微信机器人中

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

代码

@robot.textdef 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')

运行效果:

 

转载地址:http://jzwsi.baihongyu.com/

你可能感兴趣的文章
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
聊聊gcc参数中的-I, -L和-l
查看>>
[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux select TCP并发服务器与客户端编程
查看>>