这里是 基于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')
运行效果:
运行效果
网友评论