最近在学习python,想做一个聊天机器人,百度了很多资料,有的也是根据别人分享的文档一步步操作,但过程中还是遇到了一些问题,因此 我自己总结了一下我的步骤:
1. 申请一个公众号, 具体的可以百度微信公众号跟着步骤申请一个就行 自己玩的话 订阅号就可以了
2. 申请一个服务器
我用的是新浪云,不要问我为什么选择这个, 我也是刚开始跟着一个教程做的
创建一个云应用
选择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'))
网友评论