微信开放平台跨出友好一步,Python(bottle)版代码调试指南

网安智编 厦门萤点网络科技 2026-02-10 00:10 46 0
摘要:微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋... 微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好...

摘要:微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋...

微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋不已的去申请了微信公共平台,然后开始找各种api的位置……

花费了近一个小时,依然没找到……

最后动用大杀器,终于找到了这么个链接。我了个去的,没比这还简单的api文档了吧。

最让人无法理解的是:居然没有本地开发环境支持,每次都要放在生产环境去调试。

最让人欣慰的是:就那么俩方法,生产环境调试几次也就完事了。

()版代码如下:

# -*- :utf-8 -*-from debug, , run, get, , sys, os, time, @get('/')def index(): .GET.get('')@post('/')def (): for key, value in .POST.():doc = .(key)_to = doc.xpath('//'). = doc.xpath('//').# = doc.xpath('//'). """%s0"""%(_to, _from, int(time.time()), u'我了个去啊')if == "": # mode debug(True) port = int(sys.argv if len(sys.argv) > 1 else 8888) run(host='0.0.0.0', port=port, =True)else: # Mod WSGI os.chdir(os.path.()) app = ()

演示直接看图:

在Python的Bottle框架中使用微信API的示例1

本文介绍使用进行网络编程,假设读者已经具备了基本的网络编程知识和的基本语法知识,本文中的代码如果没有说明则都是运行在 3.4下。

的功能封装在库中,要使用,记得先 ,库的详细介绍参见官方文档。

创建

首先创建一个,使用库中得函数创建。

# an INET, = .(., .)

例子中创建了一个TCP ,.函数的前两个参数的默认值是.和.,创建TCP 时可以直接写成.()。

连接服务器

使用的函数连接到服务器,以下几种参数都是合法的。

s.(('', 8000))s.(('127.0.0.1', 8000))s.(('', 80))

发送数据

发送数据有两个方法send和,send不能保证所有的数据都发送完了,它会返回已发送数据的长度,程序要循环发送数据直到所有数据都已发送完毕。

def (s, msg): = len(msg) = 0 while < :sent = s.send(msg

:

)if sent == 0:raise (" ") += sent

能够保证所有的数据都已发送完毕,除非发送过程中出现了错误,它实际上也是循环发送数据直到所有数据发送完成。

这里还要讲一个需要特别注意的地方,从一个例子开始吧:

= .()s.(('', 80))s.('test')

都是上面讲过的东西,没什么特别的,分别在 2和 3中执行以上的代码,结果是:

# 2.7>>> socket>>> s = .()>>> s.(('', 80))>>> s.('test')

2中执行成功。

# 3.4>>> socket>>> s = .()>>> s.(('', 80))>>> s.('test') (most call last): File "", line 1, in : 'str' does not the

3中却发生了异常。

同样的代码换个环境却不能执行了,我没有写错呀,怒砸电脑。好吧,你确实没写错,是环境变了,导致这个结果的变化请移步官方的说明。

接收数据

使用recv函数接收数据:

data = s.recv(4096)

在 3中返回的是bytes对象,在 2中返回的是。注意函数返回的数据长度是小于或者等于参数指定的长度的,要接收到指定长度的数据,需要循环接收数据。

def (s, ): = = 0 while < :chunk = s.recv(min( - , 2048))if chunk == b'':raise (" ").(chunk) = + len(chunk) b''.join()

关闭连接

当连接不再需要时可以使用close关闭连接,关闭后的连接不能再进行任何操作。当一个被回收时会自动关闭,但是不要依赖这种机制,不需要时就主动的close。

服务端

服务端程序执行的步骤:

1. 创建服务端

1. 将服务端绑定到指定的地址和端口

1. 监听连接

1. 接受客户端连接

1. 处理客户端的数据

1. 关闭客户端连接

微信公共平台API文档_Python微信开发API接口_python 框架 微信

一个简单的echo 示例:

= ''PORT = = .(., .)s.bind((HOST, PORT))s.(10)conn, addr = s.()while True: data = conn.recv(1024) if not data:break conn.(data)conn.close()

客户端程序:

= ''PORT = = .(., .)s.((HOST, PORT))s.(b'hello ')data = s.recv(1024)print('', repr(data))s.close()

错误处理

处理过程中发生错误会抛出异常,相关的异常有:

- .error - . - . - .

= = : s = .(., .) s.bind((HOST, PORT)) s.(10): .error as msg: print(msg)

厂里上个网需要设置代理服务器,切换各种环境『包括但不仅限于开发环境、QA、预上线、验收、生产环境、压力测试、Demo……』都需要给浏览器设置不同的代理服务器。

虽然俺有神器+ Host++Proxy 的组合来轻松切换Host,切换浏览器代理,但是…凡是就怕『但是』。

但是碰到一些IE才有的bug时候不得不换浏览器啊!!还要开虚拟机进去搞IE6、IE8、360、搜狗这些奇葩浏览器啊!!!

有同事建议搞个bat脚本来做这些,但没人肯动手……而且bat能不能实现先不说,重点是咱不熟啊。

搞个C#写个或者控制台还需要.NET 不是,虚拟机装个.NET .0又要很多时间『而且不同的都要装一遍…』

最最重要的,好久不写文章了不是,咱不想在博客里写C#相关的东西不是。所以,操刀写几行代码和厂里兄弟们显摆一下『人生苦短,我用』的好处。

具体实现步骤如下:

安装、WMI支持。具体下载地址一下,因为我的是32位.7系列,下载到的文件名分别为(-218.win32-py2.7.exe、WMI-1.4.7.win32.exe)

开搞。

首先,我们查资料知道,IE浏览器的代理内容在注册表中『t 』这里存着,所以我们理论上只要修改这里相关的键值就可以切换IE代理。

所以,第一个函数就是修改注册表键值:

def (, ): = ' ' key = .(.,, 0, .) .(key, , 0, ., ) .(key)

因此段代码中用到了的的东西,所以在文件最开头需要做 , ,引入相关的class

修改系统注册表的函数其实就这么几行…当然,因为我厂必须通过代理服务器上网,所以修改系统注册表的键值类型我只用到了这一种,实际其他情况还会有啊等等类型。

然后咱需要一个配置文件,来保存各种场景『QA啊开发环境啊』的不同的配置信息,这时候我使用的配置文件为ini格式,用自带的就可以解析此种文件格式。

没有采用以往我最熟悉的XML或者json纯粹为了装x,xml和json总觉着是web上用的东西,ini看起来比较像一个.exe比较常用的配置文件格式。

也因为以前没用过ini格式的配置文件,这次权当又学会一种的玩法而已。

所以读取ini配置文件的代码为:

= .().read('.ini')if .(): = .get(, '') = .get(, '')

同样,因为用到了,需要在文件最开头也 一下。

细心的小伙伴会注意到这段代码中有一个的变量实际是没有定义的,而这个变量俺给它的含义是前边所写的『场景』,比如=='dev'表示开发环境,=='qa'表示QA环境,而咱们这次既然做的是一个类似exe的程序,所以需要在执行exe时候当作参数传进来。

这时候咱们就要用到的sys模块了,同样 sys,然后在程序中通过:

= sys.argv if len(sys.argv) > 1 else 'dev'

这样的方式来获取『场景』这个参数,这一段代码就会变成:

= sys.argv if len(sys.argv) > 1 else 'dev' = .().read('.ini')if .(): = .get(, '') = .get(, '')

既然已经读取到配置文件中的和这俩东东了,写入到注册表理论上就能完成咱们的修改IE代理配置的大业了:

= sys.argv if len(sys.argv) > 1 else 'dev' = .().read('.ini')if .(): = .get(, '') = .get(, '') ('', ) ('', )

前一句为啥是『理论上』呢,因为注册表内容虽然已经修改了,但实际上IE浏览器并没有生效,让IE浏览器生效需要关闭重新打开。

这时候就用到前边安装的一个叫做WMI的东东, wmi ,然后:

def (): c = wmi.WMI() = .. for in c.():if .Name=='.exe':.(.(1, 0, .), 0)

当然,这段代码是有一点点问题的,只关闭了IE没有重新打开……是因为俺偷懒了,俺可以接受手动打开IE…

综上所述:

完整的代码为:

#=utf- , , sys, , os, wmi, (): c = wmi.WMI() = .. for in c.():if .Name=='.exe':.(.(1, 0, .), 0)def (, ): = ' ' key = .(.,, 0, .) .(key, , 0, ., ) .(key)def (): if not os.path.('.ini'):cfg = .()#开发环境cfg.('dev')cfg.set('dev', '', '192.168.0.6:3128')cfg.set('dev', '', ';127.0.0.1')#预上线cfg.('')cfg.set('', '', '192.168.0.6:3128')cfg.set('', '', ';127.0.0.1;')#线上cfg.('')cfg.set('', '', '192.168.0.6:3128')cfg.set('', '', ';127.0.0.1')#QAcfg.('qa')cfg.set('qa', '', '192.168.2.16:3128')cfg.set('qa', '', ';127.0.0.1')cfg.write(open('.ini', 'a')) False == "": = sys.argv if len(sys.argv) > 1 else 'dev' if ():() = .().read('.ini')if .(): = .get(, '') = .get(, '')('', )('', )print 'done, open ie' else:print '.ini is , .ini and try again'