python3+服务器+微信公众号的聊天机器人

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37726973/article/details/79227530

    写在最前:假期想稍微自学一下python语言,在课程中实现了聊天机器人,但是那时候是从网上找的源码,这次想要自己一句一句试试编码。为了利于交互,希望基于微信平台进行开发,但是用自己的微信账号害怕发出去奇怪的东西,现在微信都要基于手机号,小号也用不了,所以希望通过微信公众号实现与聊天机器人的对话,废话就到这里~

    一,编译环境

     这次开发我是基于python3.6 因为我一直喜欢用最新版的东西。。强迫症伤不起。。写到一半才发现。。很多东西真的用python2.x比较好,,但是用都用了。。硬着头皮写下去。。

      在网上搜了很多资料,很多源码,大牛教程都是基于新浪sae作为后台。。但是那个我不懂。。之前毕设有接触过阿里云服务器,9.9半年,一年学生价也就120不到,还是可以接受的,,所以我就自以为是的继续用了阿里云服务器作为后台。

      首先,申请服务器、公众号什么的就不说了,然后我选的是window下的系统,因为习惯..当然了也选了我可以选的最新版2012...在服务器上安装python3.6,安装web.py,这部分代码基本上都是参考大牛教程,将几个大佬的代码整合起来,然后只是把他们从python2.x移植到python3也能跑起来。

        注明:在python3下,pip install web.py不成果,版本不一样

                   需要用pip install web.py==0.40.dev0,

                  然后,千万别忘了去服务器控制台,通过安全规则把80端口放出来,因为微信公众号发的xml包需要的url必须要80端口

      现在为验证token成功,现在环境只需要web框架,暂时不牵扯到别的框架

     二,代码开发

    1,新建main.py文件,程序主体运行语言:

import web
from handle import Handle

urls = (
    '/wx', 'Handle',
)

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()
     2,新建handle.py,这部分是程序反应的主要代码,当服务器接受到指定get请求后,进行反馈的内容

import hashlib
import web




class Handle(object):
    def GET(self):
        try:
            data = web.input()
            if len(data) == 0:
                return "hello, this is handle view"
            signature = data.signature
            timestamp = data.timestamp
            nonce = data.nonce
            echostr = data.echostr
            token = "gzh2018"  # 请按照公众平台官网\基本配置中信息填写
            list1 = [token,timestamp,nonce]
            list1.sort()
            str_list1 = ''.join(list1)
            print(str_list1)
            sha1 = hashlib.sha1()
            sha1.update(str_list1.encode('utf-8'))
            hashcode = sha1.hexdigest()
            print("handle/GET func: hashcode, signature: ", hashcode, signature)
            if hashcode == signature:
                return echostr
            else:
                return ""
        except Exception as Argument:
            return Argument

        说一下这边因为是python3的一点坑。。首先是因为list,python3 和python2 hashlib同样的代码 sha1 结果不一样

        原来教程里的代码是map(sha1.update,list),但是因为在python2中map返回list,python3中map返回的则是迭代器。所以sha1加密的是一个空值,当然token怎么验证都不会通过的。。。所以我用以下方法实现,把排序好的list1,通过 ''.join(list1)拼接成字符串,然后再sha1,就正确啦

       程序运行:

                通过cmd命令行,python main.py 80进行运行,因为要指定80端口

        三,测试回复用户发送

             微信公众号连接好了,那么下面当然是怎么和用户互动啦,首先最基础的就是怎么获取到用户的信息,怎么将想要回复的值回复给用户,这里需要用到一个小知识点~模板,Templetor: web.py 模板系统

              web.py 的模板语言叫做 Templetor,它能负责将 python 的强大功能传递给模板系统。

               这样我们就可以直接把值赋给模板然后返回给用户啦

               微信客户端消息回复模板:

$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>
              获取用户发送,并返回给用户函数,只要添加在handle.py后即可

       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
            render = web.template.render('templates/')
            return render.reply_text(fromUser, toUser, int(time.time()), content)
        elif msgType == 'image':
            pass
        else:
            pass
            现在基本功能就这样啦,下面就是怎么调用图灵机器人等api或者怎么怎么自己写语料库啥的了。。继续学习。。未完待续,欢迎大家一起讨论学习。

             附上最新的测试公众号,后面会一步一步完善各项功能~请各位大佬指教
                                                          

展开阅读全文

没有更多推荐了,返回首页