首页 » PHP教程 » wxbizmsgcryptphp技巧_我的年夜众号开拓第五步python实现年夜众号消息加密

wxbizmsgcryptphp技巧_我的年夜众号开拓第五步python实现年夜众号消息加密

访客 2024-11-29 0

扫一扫用手机浏览

文章目录 [+]

作者:JiawuZhang

出品:JiawuLab(ID:jiawulab)

wxbizmsgcryptphp技巧_我的年夜众号开拓第五步python实现年夜众号消息加密

实验记录系列是JiawuLab原创栏目,通过真实项目的操作,记录全体实验过程。

wxbizmsgcryptphp技巧_我的年夜众号开拓第五步python实现年夜众号消息加密
(图片来自网络侵删)

旨在通过一步步过程,零根本的朋友都能直接上手。

大家好,我是JiawuZhang,本次实验记录的项目是——微信"大众年夜众号开拓。

我的"大众年夜众号开拓的第五篇文章,如果您没看过前四篇文章,这里是传送门:

我的公众年夜众号开拓(第一步)大略功能实现

我的公众年夜众号开拓(第二步)智能AI对接

我的"大众年夜众号开拓(第三步)数据库实现关键字回答

我的"大众年夜众号开拓(第四步)图文回答

希望您多多关注。

上期回顾

我们首先新增图文回答,用一种更都雅的办法来进行回答

并且让数据库更轻松,可承载更多的并发处理

末了也拥有了日志功能。

现在已经拥有了相对完全的功能,只须要日后根据运营情形,进行完善干系功能就行。

不过为了安全,我们还得多做一步,便是加密,本期我们就来实现它。

本期知识点

1、加密

2、后续事情

吐槽两句

官方对付加密的资料太乱了,本来我认为"大众年夜众号的资料就能办理,想不到还要跑到开放平台找资料

再便是示例代码中的坑有点多,尤其是对python3而言,在处理过程中,常常要调试

Web.py的一个bug太坑了,也是针对python3的,便是在POST方法中,利用web.input()方法会出错

一贯报错write() argument must be str, not bytes,紧张缘故原由是python2和python3中对‘bytes’和‘str’的处理不同

而且在调试中还不能直接显示,我是在"大众年夜众号平台中的运维中央创造的,

由于这个问题,耗费了我近两天的韶光来找出办理办法,

网上的信息太少,为此,我基本把web的源代码看了一半,为了理解代码的处理逻辑。

吐槽完了,心里舒畅了,我们连续进行本期文章

加密

首先解释一下,用python来实现"大众号加密,在网络中的资料特殊少,基本上都是放一些根本的知识,就像我的第一期文章那样,

以是,你看到我的分享,并用于实现公众号的开拓中,是非常有用的。

开始我以为资料少,是由于大家都很随意马虎处理,结果我就碰到上面吐槽的两大坑了。

官网找资料

加密,当然须要在官网资料中找找, 我们唯一能创造的地方便是如下图

资料只有右边红框中的先容,最下方有个示例代码,我们下载后,

得到这五个文件夹,我们当然是选用python,把稳,这个示例代码是用python2写成的,我们需转为python3,才能利用

打开后一共有四个文件,\"大众pycache\公众是修正后天生的缓存文件

经由剖析后,紧张有三个功能文件:

1、ierror.py 定义各种缺点编号的文件,不用改

2、WXBizMsgCrypt.py 主要功能文件,也是唯一须要转换为python3的文件

3、Sample.py 测试文件,不用改,我们将WXBizMsgCrypt.py文件转换后,用来测试是否成功的

这里,我就直接把已经转换过WXBizMsgCrypt.py文件贴出来,代码有点长,我们后面剖析

从上面代码中,我来剖析给大家听听:

1、class WXBizMsgCrypt(object) 这个是我们后面紧张调用的类,天生它的实例来完成加密和解密的事

2、 DecryptMsg WXBizMsgCrypt类中的解密方法,当做事器收到加密的体后,我们就用这个来进行解密

3、 EncryptMsg WXBizMsgCrypt类中的加密方法,当我们处理好回答体,就用这个方法来进行加密

4、 class XMLParse 这个类是用来处理体加解密的,返回的也是相应的体,“extract”、“generate”这两个便是相应的加解密的方法

5、 class PKCS7Encoder和class Prpcrypt 这两个类是做加密算法的,不用太关注

6、 class SHA1 这个类是用来对收到的加密体做验证的,验证通过,才会进行后续的处理

这么一大段代码,通过上面的剖析之后,你是不是已经很清楚这个文件的逻辑了。

好了, 我们处理完示例文件的转换事情后,然后我们用Sample.py来验证一下,

输出没有问题,很好,那我们须要将代码改造到项目中。

那么后面该进行什么呢?

按照资料来说,进展不下去了, 这也便是我碰着的第一个坑。

通过对官网资料一个字一个字的研究,创造两个词很关键——接入指引、技能方案

顺着这个线索,我终极在开拓平台里面的第三方平台标签下找到了,如下图

上天不负眼神好的人啊,终于被我找到了。
咳咳咳,谈笑了。

我们连续看接入指引、技能方案两篇内容,这里不再截图,大家可以仔细研究一下

我说一下个人的理解,收到加密体后,进行体验证,署名验证通过后,解密体,然后成了正常的体

再进行我们原来的操作, 得到正常的回答体后,再对回答体进行加密,发送即可

这里验证体署名,须要用到“msg_signature“、”timetamp“、”nonce”,这三个参数,以及加密体本身

而这三个参数,直接可以从url链接中就能得到,就像我们最开始做token验证一样

好大略啊,我们只要在原来项目前面做下验证与解密,末了做下加密事情,就可以了(事后创造,小伙,你想的太大略了。

那我们开始操作吧。

验证与解密

首先,我们来做验证与解密,细心的朋友,在上面大段代码剖析中已经看到,里面有个class SHA1类,直接做了验证事情

我们只须要传进行参数就可以了,这四个参数便是技能文档说的“msg_signature“、”timetamp“、”nonce”,以及加密体本身

(事后注释:以下操作有缺点的,大家可以看看逗比过程!
〜)

我们直接进Handle类中的POST方法进行变动

首先是在__init__中增加三个设置,三个值在公众年夜众号后台-基本配置里面,如下图

将三个值增加到代码中,后面注释中已经解释了,当然这里我已经调为“安全模式”了,如果你还没有变动,可以在修正配置中改过来。

经由上面的代码改造,我们来测试一下,看看加密后,回答是否正常

(事后注释:由于代码是错的,以是省略回答的部分,直接进入测试环节)

很显然,是禁绝确的,当我利用'python3 main.py 80'重启做事后,利用手机发送,情形是这样的

还有好几页呢,全屏的“做事涌现故障,稍后重试”,按照技能文档写的,该当没有问题啊

日志文件中也没有报错,只是原来能打印出信息,现在没有打印出来

经由半天的测试摸索,终于在"大众年夜众号后台的运维中央找到的缘故原由。

这里都是记录回答出错的地方,我们点进去看看,涌现什么缺点:

我将私密信息隐蔽了,红块有点多,大家紧张看箭头所指的地方

缺点显示是write() argument must be str, not bytes,也便是说“bytes”、“str”两个类型弄错了。

然后,我经由无数考试测验,什么“bytes”类型转为“str”类型等,创造还没有办理

百度,csdn,cnblog,简书,stackoverflow,知乎,V2EX。


可能你能想到的地方,都找了一下这个问题的缘故原由

大部分都是说的文件读取的事,与我们没什么关系。

末了通过DEBUG,创造紧张问题涌如今web.input(),本身是想用它来获取url上的参数

结果什么都没有得到,查看web官网的先容,没有什么问题啊

然后开始研究web的源代码,找到input和data的代码, 创造是在webapi文件中的,

然后看webapi文件,以及干系的cgi文件,utils文件等等

末了创造有个东西可以得到我想要的url参数,便是\"大众web.ctx.env\"大众,里面是post中的各种信息。

当然我还是希望能用更好的办法来进行,末了在web的github中的“issue”中创造了问题所在

看到没,最上面一条便是这个问题,而且是几个小时前刚发布的,然后我在closed里面也找到几条类似问题

你说为了写一篇文章,我随意马虎吗?这里终于创造了问题

通过“issue”中的解释,创造原来是python2和python3的版本问题

“bytes”、“str”在python2中不用指明,但在python3中必须指明,否则就会报出上面的缺点

也给出理解决办法,便是修正源文件,在里面继续“FieldStorage”类,再改写个中的“make_file”方法

精确的代码改造

上面方法也比较随意马虎,但是改写源代码,意味着通用性不高,比如我要将这个项目复制到另一个公众年夜众号上

我还要改写web.py的源代码,才能利用,这样不太好,

为了代码的普适性,以是我就利用上面创造的\"大众web.ctx.env\公众来进行,无非是自己从url中提取想要的信息嘛,这都不是事〜狗脸

确定好了方向,我们来进行代码改造,开始动手吧

依然是针对Handle类的POST方法进行改造

代码剖析:

1、web.ctx.env,这段获取的是POST的信息包中‘env’部分,里面包含了很多信息,我们须要取URL,这段恰好在'QUERY_STRING'中

我们可以看到各参数是由‘&’来联接的,以是这里把每个参数分出来,并转换为字典,方便取出,如下方

2、crypt是\公众WXBizMsgCrypt\公众的实例化,然后调用“DecryptMsg”方法,来进行体的验证及解密,得到解密的体

3、如代码中注释提到,如果解密失落败,“decryp_data”返回为“None”,如果直接传给recMsg,会涌现出错,

以是须要转换为空字符串,这样程序精确进行下去,只是“暂时不处理”

回答体加密

前面是做体验证及解密,经由Handle程序处理后,我们得到了回答体,现在进行回答体加密

再发送给微信端,这样粉丝才会收到相应的回答。

而得到回答体是在“replyMsg.send()”中返回后,直接发送给微信端

有两种办法可以办理:

1、直接在Handle每个回答的地方,将返回的回答体,实行加密后,再发送给微信端

2、在“reply”中的\公众send()\"大众方法内进行加密处理,只须要传入两个参数即可

我在这里演示第二种方法,首先在Handle中进行改造

只须要将所有的“replyMsg.send()”,改为“replyMsg.send(crypt, nonce)”即可,传入两个必须的参数

然后在“reply”中的所有\"大众send()\"大众方法进行改造

保存后,实行“nohup python3 main.py 80 > wx.log 2>&1 &”,做事启动,测试一下,如下图:

灰常Good~调用数据库的关键字回答,和调用智能机器人回答,都是能得到很好的演示

利用python来实现"大众年夜众号的加密,就达到了我们的目标。

后续事情

到目前为止,我们拥有一个完全功能,并且安全加密的公众年夜众号,后面就能很好的开始运营公众号。

比如须要增加更多的关键字回答,就将其添加到数据库中,基本上不用重启做事器,直接添加就好。

比如须要修正关注后的回答,直接改动就可以,也不用重启做事器

比如须要优化智能AI机器人,按照第三期中的内容,来进行操作即可

写更多的优质原创文章,实验更多的小项目,与粉丝更多的互动,这些都是更主要的事情。

当然,如果你拥有更多的权限,实在可以做更多有趣的事:

比如利用网页授权,来进行WEB开拓

比如利用素材权限,来进行图文管理,发布新图文的文章

比如利用主动权限,来进行客服,或是模板发布

比如利用自定义菜单权限,来进行更有趣的菜单实现

等等等等。


你都能连续深入研究。

很高兴,您能一贯陪着,看完成这五期的文章,感激你们。

之后,我还会带来更多新的原创实验项目,同时也会分享一些个人学习python的心得体会,以及碰着的一些精良的python库。

本次的实验项目——"大众年夜众号开拓——在此完结。
如果您喜好这期文章,请点赞,支持一下。

欢迎您关注"大众年夜众号:JiawuLab,体验完全功能,或者给我留言,说说你碰着的问题,我们一起磋商。

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0