基于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')

运行效果:

运行效果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容