python学习---实现微信公众号聊天机器人

最近在学习python,想做一个聊天机器人,百度了很多资料,有的也是根据别人分享的文档一步步操作,但过程中还是遇到了一些问题,因此 我自己总结了一下我的步骤:

1. 申请一个公众号, 具体的可以百度微信公众号跟着步骤申请一个就行 自己玩的话 订阅号就可以了

(https://mp.weixin.qq.com/)

2. 申请一个服务器

我用的是新浪云,不要问我为什么选择这个, 我也是刚开始跟着一个教程做的
创建一个云应用

image

选择python开发语言 这里我选择的共享环境 具体计费及配额旁边都有说明,输入二级域名(自己起个名字就行),输入应用名称---->确认创建

新浪云的代码管理有两种方式 SVN 和git 为了方便我选择了git

3. 在本地建一个文件夹 weixin

新建config.yaml文件

name: wxpytest

version: 1

libraries:

- name: webpy

  version: "0.36"

- name: lxml

  version: "2.3.4"

新建index.wsgi文件

# coding: UTF-8

import os

import sae

import web

from weixinInterface import WeixinInterface

urls = (

'/weixin','WeixinInterface'

)

app_root = os.path.dirname(__file__)

templates_root = os.path.join(app_root, 'templates')

render = web.template.render(templates_root)

app=web.application(urls, globals()).wsgifunc()

application = sae.create_wsgi_app(app)

新建weixinInterface.py文件

# -*- coding: utf-8 -*-

import hashlib

import web

import lxml

import time

import os

from lxml import etree

import urllib2

import robot

class WeixinInterface:

    def __init__(self):

        self.app_root = os.path.dirname(__file__)

        self.templates_root = os.path.join(self.app_root, 'templates')

        self.render = web.template.render(self.templates_root)

    def GET(self):

        #获取输入参数

        data = web.input()

        signature=data.signature

        timestamp=data.timestamp

        nonce=data.nonce

        echostr = data.echostr

        #自己的token

        token="你的token" #这里改写你在微信公众平台里输入的token

        #字典序排序

        list=[token,timestamp,nonce]

        list.sort()

        sha1=hashlib.sha1()

        map(sha1.update,list)

        hashcode=sha1.hexdigest()

        #sha1加密算法

        #如果是来自微信的请求,则回复echostr

        if hashcode == signature:

            return echostr

新建一个文件夹/weixin/templates,新建一个文件reply_text.xml

$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>

https://www.sinacloud.com/doc/sae/tutorial/code-deploy.html
参考官方文档部署代码

4.设置微信公众号,进入开发--->基本配置

image.png

例如我的域名是test.applinzi.com
ur填写为:https://test.applinzi.com/weixin
查找自己的域名参考下图:
image.png

token和代码里写的token保持一致就行
EncodingAesKey 随机生成就好了
消息加密方式选择明文或兼容都可以
点击提交
如果出现token验证失败请检查你的token和代码里填写的是否一致,url是否正确

5. 调用图灵api实现机器人聊天

首先需要去图灵官网注册 开通一个机器人
新建robot.py

# -*- coding=utf-8 -*-
import requests

KEY = "创建机器人后生成的apikey"

def get_response(msg):
    apiUrl='http://www.tuling123.com/openapi/api'
    data={
       'key':KEY,
       'info':msg,
       'userid':'机器人名字',
   }
    try:
       r=requests.post(apiUrl, data=data).json()
       return r.get('text').encode("utf-8")
    except:
       return msg
    return msg

修改weixinInterface.py文件

# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
from lxml import etree
import urllib2
import robot
class WeixinInterface:

    def __init__(self):
        self.app_root = os.path.dirname(__file__)
        self.templates_root = os.path.join(self.app_root, 'templates')
        self.render = web.template.render(self.templates_root)

    def GET(self):
        #获取输入参数
        data = web.input()
        signature=data.signature
        timestamp=data.timestamp
        nonce=data.nonce
        echostr = data.echostr
        #自己的token
        token="********" #这里改写你在微信公众平台里输入的token
        #字典序排序
        list=[token,timestamp,nonce]
        list.sort()
        sha1=hashlib.sha1()
        map(sha1.update,list)
        hashcode=sha1.hexdigest()
        #sha1加密算法
        #如果是来自微信的请求,则回复echostr
        if hashcode == signature:
            return echostr
            
    def POST(self):
        str_xml = web.data()#获得post来的数据
        xml = etree.fromstring(str_xml)#进行XML解析
        msgType=xml.find("MsgType").text
        fromUser=xml.find("FromUserName").text
        toUser=xml.find("ToUserName").text
        if msgType == 'text':
            content=xml.find("Content").text
          
            rpyMsg=robot.get_response(content)
            return self.render.reply_text(fromUser,toUser,int(time.time()), rpyMsg)
        else:
            pass

由于robot导入了requests包,我们需要把requests,urllib3,idna,chardet,certifi包拉到本地放在weixin目录下
并且修改index.wsgi文件

# coding: UTF-8
import os
import sae
import web
import sys

from weixinInterface import WeixinInterface

urls = (
'/weixin','WeixinInterface'
)

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