最近忙国赛的一个项目,我得做一个微信公众号。功能就是调数据并回复给用户,需要用户发送给公众号一个关键词,通过关键词自动回复消息。

这时就是查询微信公众平台文档了,地址如下:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
按照它的入门指南,我基本上了解了用户给公众号发送消息的一个机制,并且一旦给公众号发送消息,在开发者后台,会收到公众平台发送的一个xml,所以通过编写Python脚本进行xml的解析与自动发送功能。

如果用户给公众号发送一段text消息,比如“hello”,那么后台就会收到一个xml为:

<xml>
<ToUserName><![CDATA[公众号]]></ToUserName>
<FromUserName><![CDATA[粉丝号]]></FromUserName>
<CreateTime>1460541339</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[hello]]></Content>
</xml>

注意这里面有一些标记对于我们开发者来说是非常有用的:ToUserName,FromUserName,MsgType,Content
所以我们只要知道了这些信息,我们就能做到自动回复的功能。
我们发现这个MsgType 为 ‘text’。而微信中的MsgType有“text”(文本)、“image”(图像)、“voice”(语音)、“video”(视频)、“shortvideo”(短视频)、“location”(位置)、“link”(链接)、“event”(事件)


首先我们写一个main.py文件
main.py

# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handleurls = ('/wx', 'Handle',
)if __name__ == '__main__':app = web.application(urls, globals())app.run()

然后写一个receive.py,作为接受用户发送过来的数据,并解析xml,返回数据的脚本。
receive.py

import xml.etree.ElementTree as ETdef parse_xml(web_data):if len(web_data) == 0:return NonexmlData = ET.fromstring(web_data)msg_type = xmlData.find('MsgType').textif msg_type == 'text':#print('text')return TextMsg(xmlData)elif msg_type == 'image':return ImageMsg(xmlData)elif msg_type == 'location':#print('location')return LocationMsg(xmlData)elif msg_type == 'event':#print('event')return EventMsg(xmlData)class Event(object):def __init__(self, xmlData):self.ToUserName = xmlData.find('ToUserName').textself.FromUserName = xmlData.find('FromUserName').textself.CreateTime = xmlData.find('CreateTime').textself.MsgType = xmlData.find('MsgType').textself.Eventkey = xmlData.find('EventKey').textclass Msg(object):def __init__(self, xmlData):self.ToUserName = xmlData.find('ToUserName').textself.FromUserName = xmlData.find('FromUserName').textself.CreateTime = xmlData.find('CreateTime').textself.MsgType = xmlData.find('MsgType').textself.MsgId = xmlData.find('MsgId').textclass TextMsg(Msg):def __init__(self, xmlData):Msg.__init__(self, xmlData)self.Content = xmlData.find('Content').text.encode("utf-8")class ImageMsg(Msg):def __init__(self, xmlData):Msg.__init__(self, xmlData)self.PicUrl = xmlData.find('PicUrl').textself.MediaId = xmlData.find('MediaId').textclass LocationMsg(Msg):def __init__(self, xmlData):Msg.__init__(self, xmlData)self.Location_X = xmlData.find('Location_X').textself.Location_Y = xmlData.find('Location_Y').textclass EventMsg(Msg):def __init__(self, xmlData):Event.__init__(self, xmlData)self.Event = xmlData.find('Event').text

其中,我们使用xml.etree.ElementTree,这是一个简单而有效的用户解析和创建XML数据的API。而fromstring()就是解析xml的函数,然后通过标签进行find(),即可得到标记内的内容。

同时还要写一个reply.py,作为自动返回数据的脚本。
刚才提到了,用户给公众号发送消息,公众号的后台会接收到一个xml,那么如果公众号给用户发送消息呢,其实也就是公众号给用户发送一个xml,只是ToUserName,FromUserName换了一下而已,内容自己定。

<xml>
<ToUserName><![CDATA[粉丝号]]></ToUserName>
<FromUserName><![CDATA[公众号]]></FromUserName>
<CreateTime>1460541339</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[test]]></Content>
</xml>

reply.py

import timeclass Msg(object):def __init__(self):passdef send(self):return "success"class TextMsg(Msg):def __init__(self, toUserName, fromUserName, content):self.__dict = dict()self.__dict['ToUserName'] = toUserNameself.__dict['FromUserName'] = fromUserNameself.__dict['CreateTime'] = int(time.time())self.__dict['Content'] = contentdef send(self):XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{Content}]]></Content></xml>"""return XmlForm.format(**self.__dict)class ImageMsg(Msg):def __init__(self, toUserName, fromUserName, mediaId):self.__dict = dict()self.__dict['ToUserName'] = toUserNameself.__dict['FromUserName'] = fromUserNameself.__dict['CreateTime'] = int(time.time())self.__dict['MediaId'] = mediaIddef send(self):XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[{MediaId}]]></MediaId></Image></xml>"""return XmlForm.format(**self.__dict)

接着我们要写一个handle.py,作为对消息进行反映处理(自动回复)的脚本。
handle.py

import web
import reply
import receive
import JsonData
import xml.dom.minidom
class Handle(object):def GET(self):try:data = web.input()if len(data) == 0:return "hello, this is handle view"signature = data.signaturetimestamp = data.timestampnonce = data.nonceechostr = data.echostrtoken = "hello2016"list = [token, timestamp, nonce]list.sort()sha1 = hashlib.sha1()map(sha1.update, list)hashcode = sha1.hexdigest()#print("handle/GET func: hashcode, signature: ", hashcode, signature)if hashcode == signature:return echostrelse:return ""except Exception as Argument:return Argumentdef POST(self):try:webData = web.data()#print(webData)recMsg = receive.parse_xml(webData)#print(recMsg)if isinstance(recMsg, receive.Msg):toUser = recMsg.FromUserNamefromUser = recMsg.ToUserNameif recMsg.MsgType == 'text':try:a = JsonData.praserJsonFile()#print(a)except Exception as Argument:return Argumentif a['status'] == '1':content = "No equipment"else:if a['data'][0]['weather']=='0':israin = '7.没有下雨'else:israin = '7.下雨'#print(israin)content = ""#print(content)replyMsg = reply.TextMsg(toUser, fromUser, content)return replyMsg.send()if recMsg.MsgType == 'image':mediaId = recMsg.MediaIdreplyMsg = reply.ImageMsg(toUser, fromUser, mediaId)return replyMsg.send()if recMsg.MsgType == 'location':location_x = recMsg.Location_Xlocation_y = recMsg.Location_Ycontent = "您所在的位置是在:经度为"+location_x+";纬度为:"+location_yreplyMsg = reply.TextMsg(toUser, fromUser, content)return replyMsg.send()if recMsg.MsgType == 'event':#print('yes')event = recMsg.Eventif event == 'subscribe':content = "欢迎关注"replyMsg = reply.TextMsg(toUser, fromUser, content)return replyMsg.send()else:return reply.Msg().send()else:print("not do")return reply.Msg().send()except Exception as Argment:return Argment

注:代码贴了目前写的所有功能,接收关键字并自动返回数据;关注后自动回复欢迎文字;发送定位获得GPS信息。

那么我怎么样使用微信公众号去调取服务器上的数据呢,因为有了数据的json文件,我们就可以使用Python脚本进行json的解析,然后将数据在content中体现出来就可以了。

Json文件解析

import types
import urllib.request
import jsondef praserJsonFile():url = ""data = urllib.request.urlopen(url).read()value = json.loads(data.decode())#print(value)    #print(value['data'])return value#praserJsonFile()

这个value就是我们解析json出来的一个list

微信公众号开发——关键词自动回复相关推荐

  1. java微信自动回复开发,Java微信公众号开发----关键字自动回复消息

    在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有 ...

  2. JAVA微信公众号开发之自动回复消息与图片

    首先,应该建立一个消息与图片的实体,看一下微信公众号的文档: 回复文本消息 <xml> <ToUserName><![CDATA[toUser]]></ToU ...

  3. 微信公众号开发之自动回复

    自动回复这块是比较麻烦的 一.后端回复管理 后端没什么说的,根据微信公众平台的自动回复建表,添加数据即可 需要强调的是 规则.关键词.回复内容需要建三个表 规则表中关键词和回复内容拼接id成字符串 存 ...

  4. php 公众号回复天气预报,微信公众号开发天气自动回复

    当用户输入一个地名的时候,回复该地区的当前天气预报.使用的api接口为https://www.sojson.com/open/api/weather/json.shtml?city=北京返回的数据为j ...

  5. 微信公众号开发(总结)

    这一周给大家完整的分享了关于微信公众号开发之自动回复电影的功能实现,这可以说是一个项目了,一个简单的项目,一个用你学到的编程技术所实现的项目,我相信非常多的人刚开始学习编程,都不知道具体它可以怎么样用 ...

  6. 微信公众号 开发详解02【自动回复、发布文章、自定义菜单、3种链接跳转】

    [微信公众号--零基础全面系统教学] [P01-P07]微信公众号 开发详解01[目的.起名.准备工作.注册流程.后台功能] [P08-P12]微信公众号 开发详解02[自动回复.发布文章.自定义菜单 ...

  7. 微信公众号php编程,PHP编程:微信公众号开发之文本消息自动回复php代码

    搜索热词 <微信公众号开发之文本消息自动回复PHP代码>要点: 本文介绍了微信公众号开发之文本消息自动回复PHP代码,希望对您有用.如果有疑问,可以联系我们. 本文实例为大家分享了PHP微 ...

  8. 微信公众 php代码,微信公众号开发之文本消息自动回复php代码_php实例

    本文实例为大家分享了php微信文本消息自动回复 别代码,供大家参考,具体内容如下 1.PHP示例代码下载 下载地址1:http://xiazai.php.net/201608/yuanma/phpwx ...

  9. 微信公众号开发之——第三方自动回复机器人接入

    开发微信订阅号,服务号的朋友都知道,在微信公众号开发中有一个自动回复的消息功能,一般来说,自动回复的 内容需要我们自定义,而且每次返回的内容基本没什么特别的变化,如果要根据提问的内容返回不同的消息,那 ...

最新文章

  1. ASP.NET2.0 ReportingServices使用详解
  2. C#减少图片文件大小和尺寸
  3. python diango 并发_利用gunicorn提高django的并发能力
  4. 教师节html源码,教师节_实用电脑小技巧:通俗解答html 自己动手建一个非常简单的网页_沪江英语...
  5. [***]HZOJ 优美序列
  6. [javaSE] 数组(排序-冒泡排序)
  7. date oracle 显示毫秒_Oracle date timestamp 毫秒 - 时间函数总结
  8. 混合多云架构_使用混合多云每个人都应避免的3个陷阱(第2部分)
  9. 利用Excel批量高速发送电子邮件
  10. c语言中文件的读写函数
  11. 常见类 --Object
  12. 使用Redis+java(模仿数据库)实现对象存取和读取
  13. 【Unity3D】表格
  14. 【SCM】基于报童模型的MAPE与Profit仿真
  15. iOS模拟器录屏视频
  16. UCHome源码阅读
  17. 软件测试是什么工作状态,软件测试,现在主要的工作内容是干什么?
  18. 解决java.util.ConcurrentModificationException:null
  19. 不用linux转录组数据分析,RNA-seq转录组数据分析
  20. CentOS7 aarch64 arm平台sysbench安装及CPU、内存、IO测试

热门文章

  1. linux管理控制面板--可视化管理linux
  2. Python地理数据处理 十五:基于arcpy的批量操作
  3. 4.一脚踹进ViT——ViT再审视与DeiT的实现
  4. 超全面试汇总——Hive 超详细!!!带答案!!!持续更新中~
  5. 小米手机如何分屏?让你的小米手机做到“一心二用”
  6. python写一个简单的接口
  7. 数学算法:PI的计算方法,蒙特卡洛及割圆法
  8. Programming In Scala笔记-第十五章、Case Classes和模式匹配
  9. unity制作坦克大战
  10. 一套打通 Github 搜索语法