作者:JiawuZhang 尝试记录系列是JiawuLab原创栏目,经过实在项目标操纵,记录全部尝试进程。 大师好,我是JiawuZhang,本次尝试记录的项目是--微信公众号开辟。 挑选这个项目标缘由有二: 好了,闲话不多说,间接进入主题。 结果演示先放出尝试进程中结果图,闪烁退场: 消息答复演示 关注答复演示 关键字答复演示 这么有本性的答复能否是很好玩,不再是牢固的几个答复,具体的实现方式请往下看。 您也可以关注公众号:JiawuLab,来体验更多功用。 前期预备工作一、预备一个微信公众号,我的是小我定阅号,未认证。(ps:小我公众号,不能认证) 认不认证都没关系,只是接口权限几多的题目,未认证的接口已经能满足此次尝试目标。 (具体权限可见-公众号背景-开辟-接口权限) 二、预备一台办事器,现在供给云办事器的厂家很多,大师可自行预备。 倡议挑选自力ip的办事器,(同享ip会廉价些,可是不保举,具体缘由前面会说到。) 我挑选的是某厂的1核2G1M(1核cpu,2G内存,1M带宽)的自力ip办事器,具体品牌就不说了,怕有广告怀疑。 这个设置对付常规公众号充足了,可是假如你的公众号的流量出格大,需要按照自己的情况增加设置。 三、办事器上安装python情况,我的情况是python3.7.4, Centos7.5。 假如你不清楚怎样安装,可关注公众号:JiawuLab,给我留言,这里不展开。 开辟偏向微信公众号开辟,官方的技术文档,写的很具体,也有典范参照。 别的,github上获得3000多星的WeRoBot,也是一个很受接待的微信公众号开辟框架,有爱好的朋友可自行领会。 上面提到的相关资本链接,请到文末获得。 我们此次以官方开辟文档来停止尝试。 尝试起头首先,进入官方开辟文档-入门指引,以下图: 我们只用关注红框中的内容,这里是python2.7版本,办事器上是python3.7.4版本。 所今前面需要对该指引所提到的内容停止版本转化,我会在前面提到若何转,不用担忧。 然后需要安装web.py,这是一个python的轻型web开辟框架,我们只来用,不用出格进修,如需自行百度。 现在,在办事器中停止安装web.py,很简单,间接用pip安装就好 # 安装web.pypip(3) install web.py 这里需要留意两点: 安装无缺,我们测试一下,拷贝下面的代码,保存为main.py文件 # -*- coding: utf-8 -*-# filename: main.py import web urls = ( '/wx', 'Handle', ) class Handle(object): def GET(self): return "pika pika pikaqiu!" if __name__ == '__main__': APP = web.application(urls, globals()) app.run() 然后找到当前文件地点目录输入 说明设置没有题目,这里记得一定要办事器将80端口放行。到这里,我们便可以正式停止公众号的设置及操纵了。 微信公众号设置翻开微信公众号背景,找到-开辟-根基设置-办事器设置,停止以下设置: ps:这里先依照明文形式停止,前面会改成平安形式,进程城市触及的。点击提交,出现报错,说Token考证失利,公然和文档中说的一样,出现毛病,先不管它。 继续看文档前面的内容,本来是办事器没有停止设置,所以报错,我们依照文档前面的来。 先将之前的main.py文件改成以下:(留意备注) # -*- coding: utf-8 -*-# filename: main.py import web from handle import Handle # 将Handle类放进handle.py文件中,再导入进来 urls = ( '/wx', 'Handle', ) if __name__ == '__main__': app = web.application(urls, globals()) app.run() 然后新建handle.py文件,里面写入:(留意备注) # -*- coding: utf-8 -*-# filename: handle.py import hashlib import web class Handle(object): def GET(self): try: data = web.input() if len(data) == 0: return "pika pika pikaqiu!" signature = data.signature timestamp = data.timestamp nonce = data.nonce echostr = data.echostr token = "xxxx" #请依照公众平台官网\根基设置中信息填写 list = [token, timestamp, nonce] list.sort() sha1 = hashlib.sha1() # map函数在python2和3的功用分歧,需要转化 # map(sha1.update, list) sha1.update(list[0].encode('utf-8')) sha1.update(list[1].encode('utf-8')) sha1.update(list[2].encode('utf-8')) hashcode = sha1.hexdigest() # 这里print转为python3 print("handle/GET func: hashcode, signature: ", hashcode, signature) if hashcode == signature: return echostr else: return "" except Exception as Argument: # 这里加as 转为python3 return Argument 备注中已提到python3转化的位置, 然后在token中填入微信公众号中对应的token。 保存后输入 再次回到微信公众号的设置,点击提交,设置成功,显现以下: 现在微信公众号就设置好了,买通办事器与微信公众号这一步很关键,一切后续功用都是在此根本上开辟的。 答复功用实现到这里,指引列出两个示例,别离是你说我学、图尚来往,展现笔墨答复和图片答复功用。 别的还展现了获得accessToken、获得姑且素材、获得永久素材、自界说菜单等四个功用演示。 现在按照自己的需求,以及获得接口权限来决议挑选哪些功用,比如我没有自界说菜单权限,就不用理它。 而图片答复需要用光姑且素材或是永久素材功用,来挪用分歧图片,这些都可按照现实需求来选用。 我需要用到的是笔墨答复,所以这里实现笔墨答复演示。 官方文档中关于笔墨答复的机制,以及留意事项很具体,大师先仔细研讨一下,比如消息体收到和答复的区分,消息答复流程等。 这里只做一个关键点的提醒,就是答复success题目: 这是什么意义呢?是指需要保证你的功用代码,在办事器收到消息后,5秒内做出反应,这也是为什么我不保举同享IP办事器的原因。 在功用代码中,我们能够需要做一些递归运算,数据库的查询等花时候的工作,而同享IP办事器会遭到其他网站的很大影响。 到时能够你写了很利害的功用,由于没法在5秒内实现,最初给读者的展现,就是无尽的“该公众号临时没法供给办事,请稍后再试” 好了,码代码的时候到了,这里间接将示例中的三段代码保存即可。 别离是接管消息代码、答复消息代码、handle类的改写,以下: 接管消息代码,保存为receive.py# -*- coding: utf-8 -*-# filename: receive.py import xml.etree.ElementTree as ET def parse_xml(web_data): if len(web_data) == 0: return None xmlData = ET.fromstring(web_data) msg_type = xmlData.find('MsgType').text if msg_type == 'text': return TextMsg(xmlData) elif msg_type == 'image': return ImageMsg(xmlData) class Msg(object): def __init__(self, xmlData): self.ToUserName = xmlData.find('ToUserName').text self.FromUserName = xmlData.find('FromUserName').text self.CreateTime = xmlData.find('CreateTime').text self.MsgType = xmlData.find('MsgType').text self.MsgId = xmlData.find('MsgId').text class 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').text self.MediaId = xmlData.find('MediaId').text 答复消息代码,保存为reply.py# -*- coding: utf-8 -*-# filename: reply.py import time class Msg(object): def __init__(self): pass def send(self): return "success" class TextMsg(Msg): def __init__(self, toUserName, fromUserName, content): self.__dict = dict() self.__dict['ToUserName'] = toUserName self.__dict['FromUserName'] = fromUserName self.__dict['CreateTime'] = int(time.time()) self.__dict['Content'] = content def 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'] = toUserName self.__dict['FromUserName'] = fromUserName self.__dict['CreateTime'] = int(time.time()) self.__dict['MediaId'] = mediaId def 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类停止改写,以下: # filename: handle.pyimport hashlib import reply # 导入答复文件 import receive # 导入接收文件 import web class Handle(object): def GET(self): try: data = web.input() if len(data) == 0: return "pika pika pikaqu!" signature = data.signature timestamp = data.timestamp nonce = data.nonce echostr = data.echostr token = 'XXXX' # 请依照公众平台官网\根基设置中信息填写 list = [token, timestamp, nonce] list.sort() sha1 = hashlib.sha1() sha1.update(list[0].encode('utf-8')) sha1.update(list[1].encode('utf-8')) sha1.update(list[2].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 def POST(self): # 新增加的POST函数 try: webData = web.data() print("Handle Post webdata is ", webData) # 背景打日志 recMsg = receive.parse_xml(webData) if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text': toUser = recMsg.FromUserName fromUser = recMsg.ToUserName content = "test" # 这里是答复内容 replyMsg = reply.TextMsg(toUser, fromUser, content) return replyMsg.send() else: print("临时不处置") return "success" except Exception as Argment: return Argment 现在代码都写好了,保存后输入 正幸亏测试时代有读者答复,下面是截图: 初步test成功,不外还没有到达我们的要求。现在简单的消息答复功用就实现了。 下一步预告经过一番试探,我们买通了办事器与微信公众号,也简单实现了消息答复功用,虽然还不是那末理想。 别的在测试中发现,本来设备的自界说菜单不见了,关注也没有答复了,答复语音达不到结果。。。 下一步,我们将停止以下尝试,对接智能机械人,让答复更有本性;关注与关键字答复;语音也能很好的答复;自界说菜单又出现了等功用。 本期尝试记录到此竣事,感激您的阅读。假如您喜好这期文章,请点赞,支持一下。 您可以关注公众号:JiawuLab,提早体验更多功用,大概给我留言,说说你碰到的题目,我们一路探讨。 文中资本:1、微信公众号官方文档地址: ▼▼▼▼▼▼ |
前些日子在知乎上看到了一篇文章 Python公众号开发部分代码开源 - 学习编程 - 知乎专
▼纯教程,并没有多少技术含量▼在16年的时候,我就开始弄公众号了,断断续续到现在也
现在很多公众号都直接在正文页通过SVG交互动画增加文章的阅读交互体验,而不再跳转H5
Windows 11在发布初期,微软就画了个大饼,表示将提供WSA,一个可以在PC上运行Android
公众号运营系列 NO.3:自定义菜单关键词:公众号菜单怎么设置 公众号自定义菜单 公
本框架基于Spring Boot实现,使用注解完成快速开发,可以快速的完成一个微信公众号,
一、简介最近抖音上面有个很火的天气推送的公众号,可以给自己爱的人进行定时推送。效
如何建立一个微信公众号一、定位首先要对公众号有一个定位,比如说美妆、时尚、校园生
本文面向想通过Python学习公众号开发的同学。一站式解决新手开发微信公众号遇到的所有
作者:JiawuZhang 出品:JiawuLab(ID:jiawulab) 实验记录系列是JiawuLab原创栏目,
众所周知,每家公司在发展过程中都需要构建大量的内部系统, 比如运营使用的用户管理
今天给大家分享一下如何快速搭建一个公众号服务平台。基本服务端的搭建1、首先搭建最
最近有许多人在问怎么注册微信公众号,今天我就给大家做一个注册微信公众号的教程。微
编辑导语:如何搭建微信公众号矩阵?首先,你需要了解微信公众号矩阵是什么、建立微信
上次弄了个公式识别的公众号,有人问如何实现,今天趁着周末把整个流程讲下。其实我对
最近申请了个微信公众号,发现其提供的基础功能只有一个——向用户推送图文消息,其他
大家好,我是番喜,今天给大家分享9个自媒体排版编辑网站,这年头谁还没有个公众号鸭
今天看到篇教程,是用python开发微信公众号的,觉得有意思,就敲代码实现了一下,成功
2023.1.2更新:当前产品已经发布上线你好呀,我是盾宇,我是一名测试开发工程师,最近
微信公众号是社交平台上一个不错的选择,构建与读者之间良好的互动,但对于开发者来说
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15314649589
Copyright @ 2022-2044 杭州共生网络 www.gongshengyun.cn Powered by Discuz!