美文网首页
python学习---实现微信公众号聊天机器人

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

作者: 络筱矶 | 来源:发表于2019-06-27 14:00 被阅读0次

    最近在学习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'))
    

    相关文章

      网友评论

          本文标题:python学习---实现微信公众号聊天机器人

          本文链接:https://www.haomeiwen.com/subject/prxrcctx.html