​ 刚刚创建这个公众号的时候,我的一个同事就找我的公众号聊天,但是那个时候我的公众号还是仅支持根据关键词,如果要做到支持智能回复,那基本上就是不可能。然后我结合我之前做的微信自动回复机器人的经历,我首先就想到了图灵机器人。是不是可以把图灵机器人和微信公众号进行连接呢?于是我开始查看

图灵机器人的接口文档

微信公众号

发现其实只要我们拥有一个公网的web服务器地址,微信公众号和web服务器进行通信,我们对接收的微信公众号消息进行解析转发给图灵机器人,图灵机器人根据我们请求的内容返回对应的回复,我们再将回复返回给微信公众号即可。整个流程如下:

微信公众号服务器的配置

首先我们需要搭建一个web服务器用于接收微信公众号的请求,我们可以通过flask进行搭建。

在pycharm中中新建一个工程和main.py文件,输入如下内容:

from flask import Flask
from flask import request
​
app = Flask(__name__)
​
@app.route("/")
def index():return "Hello World!"
​
if __name__ == "__main__":app.run(host='0.0.0.0')

运行成功后,你可以在浏览器上访问自己的服务器

接下来我们需要将这个服务器映射到公网上获取一个公网url,我这边使用的ngrok,将下载的exe文件打开后,输入“ngrok http 80”,就出现一个公网映射地址如下图:

将红色框标注的地址拷贝到微信公众号的开发-基本配置-服务器配置的服务器地址(此时不要点击保存,因为我们需要对字段信息进行处理,否者是不会校验通过的)

查看微信公众号的开发手册,可以了解到信息处理流程。

# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib
​
app = Flask(__name__)
​
@app.route("/")
def index():return "Hello World!"
​
@app.route("/wechat", methods=["GET","POST"])
def weixin():if request.method == "GET":     # 判断请求方式是GET请求my_signature = request.args.get('signature')     # 获取携带的signature参数my_timestamp = request.args.get('timestamp')     # 获取携带的timestamp参数my_nonce = request.args.get('nonce')        # 获取携带的nonce参数my_echostr = request.args.get('echostr')         # 获取携带的echostr参数
​token = 'Your token'     # 一定要跟刚刚填写的token一致# 进行字典排序data = [token,my_timestamp ,my_nonce ]data.sort()# 拼接成字符串,进行hash加密时需要为字符串类型temp = ''.join(data)#创建一个hash对象s = hashlib.sha1()#对创建的hash对象更新需要加密的字符串s.update(data.encode("utf-8"))#加密处理mysignature = s.hexdigest()
​# 加密后的字符串可与signature对比,标识该请求来源于微信if my_signature == mysignature:return my_echostrelse:return ""if __name__ == "__main__":app.run(host='0.0.0.0', port=80)

再次运行程序,此时再在微信公众号的配置页面点击提交可以看到提交成功的提示信息。然后再我们的ngrok上可以看到200 OK的GET连接信息


这样我们的完成了一步——服务器的配置,将微信公众号和我们搭建的web服务器进行通信。

接入图灵机器人

刚刚我们在程序中判断了一个GET的连接信息就是进行通信认证的程序,若连接信息是一个POST请求那便是我们公众号的转发信息了。接下来我们需要对这个POST信息进行处理,提取出消息内容转发给图灵机器人即可。

# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib
import tyuling_replay
import time
import re
import ReplayFromExcel
import xml.etree.ElementTree as ET
​
​
app = Flask(__name__)
​
@app.route("/")
def index():return "Hello World!"
​
@app.route("/wechat", methods=["GET","POST"])
def weixin():if request.method == "GET":     # 判断请求方式是GET请求my_signature = request.args.get('signature')     # 获取携带的signature参数my_timestamp = request.args.get('timestamp')     # 获取携带的timestamp参数my_nonce = request.args.get('nonce')        # 获取携带的nonce参数my_echostr = request.args.get('echostr')         # 获取携带的echostr参数# my_token = request.args.get('token')print(my_signature)print(my_timestamp)print(my_nonce)print(my_echostr)# print(my_token)token = '123456'     # 一定要跟刚刚填写的token一致
​# 进行字典排序data = [token,my_timestamp ,my_nonce ]data.sort()# 拼接成字符串,进行hash加密时需为字符串data = ''.join(data)#创建一个hash对象s = hashlib.sha1()#对创建的hash对象更新需要加密的字符串s.update(data.encode("utf-8"))#加密处理mysignature = s.hexdigest()
​print("handle/GET func: mysignature, my_signature: ", mysignature, my_signature)
​# 加密后的字符串可与signature对比,标识该请求来源于微信if my_signature == mysignature:return my_echostrelse:return ""else:# 解析xmlxml = ET.fromstring(request.data)toUser = xml.find('ToUserName').textfromUser = xml.find('FromUserName').textmsgType = xml.find("MsgType").textcreateTime = xml.find("CreateTime")# 判断类型并回复if msgType == "text":content = xml.find('Content').text#根据公众号粉丝的ID生成符合要求的图灵机器人useridif len(fromUser)>31:tuling_userid = str(fromUser[0:30])else:tuling_userid = str(fromUser)tuling_userid=re.sub(r'[^A-Za-z0-9]+', '', tuling_userid)#调用图灵机器人API返回图灵机器人返回的结果tuling_replay_text = tyuling_replay.get_message(content,tuling_userid)return reply_text(fromUser, toUser, tuling_replay_text)
​else:return reply_text(fromUser, toUser, "我只懂文字")
​
def reply_text(to_user, from_user, content):"""以文本类型的方式回复请求"""return """<xml><ToUserName><![CDATA[{}]]></ToUserName><FromUserName><![CDATA[{}]]></FromUserName><CreateTime>{}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{}]]></Content></xml>""".format(to_user, from_user, int(time.time() * 1000), content)
​
if __name__ == "__main__":app.run(host='0.0.0.0', port=80)

我们将图灵机器人的调用封装在一个tyuling_replay模块中,具体内容如下:

import json
import urllib.request
tuling_key='图灵机器人的APIkey'
api_url = "http://openapi.tuling123.com/openapi/api/v2"
def get_message(message,userid):req = {"perception":{"inputText":{"text": message},
​"selfInfo":{"location":{"city": "","province": "","street": ""}}},"userInfo":{"apiKey": tuling_key,"userId": userid}}req = json.dumps(req).encode('utf8')http_post = urllib.request.Request(api_url, data=req, headers={'content-type': 'application/json'})response = urllib.request.urlopen(http_post)response_str = response.read().decode('utf8')response_dic = json.loads(response_str)results_code = response_dic['intent']['code']print(results_code)if results_code == 4003:results_text = "4003:%s"%response_dic['results'][0]['values']['text']else:results_text = response_dic['results'][0]['values']['text']return results_text

详细的内容可以参考图灵机器人的API接入文档。

至此,我们的微信公众号自动回复机器人就做好了,但是免费版的图灵机器人每天的调用次数也是有限,如何彻底解决这个问题呢?我们后续再讲我们的方法。

关注微信公众号“菜鸟小白的学习分享”回复“101”获取微信公众号自动回复机器人源码哦。

关注微信公众号——菜鸟小白的学习分享
妈妈再也不用担心我找不到路了

一个人的学习——孤单
一群人的学习——幸福

python调用图灵机器人实现微信公众号的自动回复功能相关推荐

  1. 手把手教你用图灵机器人做微信公众号自动回复助手

    本文首发于我的个人博客:尾尾部落 阅读这篇文章,你将会学会以下内容: 如何用flask搭建微信公众平台服务 如何将在微信公众平台调用图灵机器人 如何用uwsgi+supervisor+nginx部署f ...

  2. 关注微信公众号实现自动回复功能

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.创建CoreServlet文件 package com.jlc.action; import java.io.IOExcep ...

  3. python图灵机器人怎么退出_python调用图灵机器人实现微信自动回复

    python调用图灵机器人实现微信自动回复 发布时间:2018-06-17 22:04, 浏览次数:338 , 标签: python 环境准备: 微信号 pip  install itchat  pi ...

  4. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

  5. python使用微信设置-Python使用微信公众号实现自动回复

    原标题:Python使用微信公众号实现自动回复 作者:睿江云计算 Python作为一门热门的编程语言,已经被很多编程爱好者所使用,下面我们就看看它是怎么与公众号的对接,并且实现一些回复文字,图片内容. ...

  6. python wechatsougou_python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 ...

  7. vue 公众号扫描_vue编写微信公众号打开相机功能

    vue编写微信公众号打开相机功能,什么都不多说直接上代码 页面布局代码 class="previewer-demo-img" :key="index" :src ...

  8. html下拉加载原理,GitHub - gavinjzx/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...

    原生JS实现微信公众号或网页使用下拉加载和上拉刷新 微信浏览器打开网页显示网址安全信息解决办法,网上很多办法,也找了很久,但是最新的很多用不了. 先看看效果,是不是亲想要的,可以跳过,以免浪费宝贵时间 ...

  9. html下拉加载实现原理,GitHub - sybiele/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...

    原生JS实现微信公众号或网页使用下拉加载和上拉刷新 微信浏览器打开网页显示网址安全信息解决办法,网上很多办法,也找了很久,但是最新的很多用不了. 先看看效果,是不是亲想要的,可以跳过,以免浪费宝贵时间 ...

最新文章

  1. elk面试题_【182期】SpringCloud常见面试题(2020最新版)
  2. LoadRunner 8.1 学习笔记4
  3. selenium+java的常使用的一些操作
  4. 小论接口(interface)和抽象类(abstract class)的区别
  5. pfsense 2.2RC版本应用
  6. 菜鸟涂鸦作品展_No.1
  7. 电商库存设计mysql redis_基于redis实现的扣减库存
  8. SQL server (数据库)基础简介
  9. 关于C#中Remoting的使用
  10. 计算机信息科学学科分类,-学科分类与代码.doc
  11. Python爬虫实现无限刷不背单词app的酷币!很有意思!
  12. usb-blaster 驱动在设备管理器处更新且安装成功后仍有黄色感叹号,显示:Windows 无法加载此软件的设备驱动程序。驱动程序可能损坏或丢失(代码:39)
  13. bluescreen view-windows 蓝屏分析原因
  14. EMV L2 - 应用选择
  15. Android入门小项目--微信登录界面源码(倒计时、fragement切换、activity信息传递)
  16. 【JoJo的摄影笔记】百年尼康——相机之殇
  17. MediaPlayer详解
  18. virtual方法和abstract方法的使用(轉載)
  19. vivado ip打包归档
  20. 宝宝的成长脚印3/20

热门文章

  1. 【转】DDR3中的ODT
  2. ResultSet(结果集)、Statement
  3. Linux中vmstat命令详解
  4. 解决阿里云postfix邮件发不出去的问题
  5. 【微观金融理论与投资学】之第0章引论
  6. 学金融会python_大学生金融小白自学Python做量化投资需要注意哪些?
  7. web前端开发工程师是做什么工作的?
  8. Coursera | Introduction to Data Science in Python(University of Michigan)| Assignment4
  9. MySQL临时表创建及旧表建新表
  10. Vue+ElementUI table表格分页