如何托管微信小程序注册(1)
随着微信小程序的功能越来越完善,小程序的应用也越来越广泛,需要小程序开发的个人与公司也越来越多~然而小程序的注册是一个比较麻烦的设计,里面涉及众多的表单交互,这次我会以自己的工作经验来帮助大家一步步实现小程序的注册托管。需要指出的是,托管小程序的注册平台并不意味着可以完全规避小程序的注册规则和限制。
本教程计划按照小程序注册的三步骤分为三部分,在阅读这一系列教程前,假设你和我一样是依托Python平台进行开发,而且对http协议已经有了一个比较深入的认识
在第一部分的教程当中我将教会大家破除以下3个难题:
- 如何在不自建SMTP服务下拥有“无限”邮箱
- 如何识别小程序注册时的验证码
- 让微信像我们的指名的邮箱发送邮件
下面我们就进入小程序注册的step1吧~如下图:
“无限“邮箱之道
整体介绍
小程序注册平台时的邮箱,将作为小程序的管理员账号登录。
前提
- 一个可以使用的域名(不需要备案,因为不是建站)
- 一个可供使用并且具有代收功能的SMTP服务邮箱用户
分析过程
经观察不难得出以下结论:
- 不能让用户输入自己的邮箱,这将无法管理,也无法处理后续的邮箱激活步骤
- 小程序平台不care你的邮箱是否真实“存在”,只要能够按照他所规定的步骤激活(发送请求)即可
想必你和我一样,会首先考虑在自己的服务器上搭建一个自定义域名的SMTP服务。当我提出这种解决方案时,马上被另一个更好的解决方案替代了:使用具有代收功能的SMTP服务代收该域名下的全部邮件即可。
当然搭建一个SMTP服务肯定也是可行的,但如果你和我一样没有搭建SMTP服务的经验,还是建议你使用代收邮件作为解决方案
实现步骤
首先请以自己的域名注册一个腾讯企业邮箱(如果你对其它平台的企业邮箱比较熟悉也没问题),地址
开启邮件代收功能(需使用管理员登陆),操作步骤如下:
在完成上述两步后,那么恭喜你,你的“无限”邮箱就已经具备啦,下面开始处理另外的2个问题
“焰狰马“识别之法
整体介绍
小程序注册时的验证码其实不算复杂,稍稍对http协议或爬虫技术有所了解的人是很容易破解的。我们这里的破解手段就是俗称的OCR(光学文字识别),需要说明的是肯定不是我们自己去做图像处理,然后OCR识别,这里我推荐大家使用斐斐打码平台,易接入,识别率很高,价格也很实在(绝无广告水分!)。在之前公司的爬虫的项目中,我所使用的是阿里的OCR,不过不知出于何种原因各大云服务商的验证码服务全部下架…只剩普通图片文字服务…值得一提的是,小程序验证码识别的原理,也可同样运用于其它简单验证码网站上~
前提
- 熟悉http协议
- 斐斐打码平台账号
分析过程
- 验证码请求过程
透过chrome自带的抓包工具,我们不难发现,验证码的获取接口如下:
于是我们很自然会在另一个窗口中访问https://mp.weixin.qq.com/wxopen/waverifycode?r=1545052181759
但是当你在另外一个浏览器中打开时会发现得到的验证码和之前的并不一样…起初我以为是参数“r”不同的原因所导致,后来证实并非如此,小程序的注册平台其实是依托session机制来保证注册时的邮箱和验证码处于同一的会话之下,而这个所谓的”r”参数个人猜测是以微秒为单位的UNIX时间戳,拿去一些工具网站验证之后证明我个人的猜想是正确的。
那么现在的问题是如何保证我获取验证码时的请求和我打开首页时的请求在同一会话下呢~想必细心的你其实已经发现我上图中红色方框圈住的set-cookie部分吧~是的,正是如此,小程序的注册平台正是依托sig这个cookie值来验证你填写邮箱等表单时和你获取验证码的请求是否在统一会话之下。好在Python的requests库封装了Session API,可以令你很方便的操作session对象。相关核心示例代码:
1 | s = requests.Session() |
验证码的识别过程
在了解了验证码的请求过程之后,接下来我们就可以进行识别了,我的解决方案是:将验证码图片直接下载下来,然后交由第三方API(斐斐打码)去识别即可。这一过程相对容易,并没有太多可细说的,有关斐斐打码平台的注册和接入不是本教程重点,感兴趣的童鞋可以走这里——传送门
相关接入代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29def _user_ocr(session):
t = time.time()
r = str(int(t))
code_url = 'https://mp.weixin.qq.com/wxopen/waverifycode' + '?r=' + r
code_rsp = session.get(code_url, headers=HEADERS)
code_content = code_rsp.content
sig = code_rsp.cookies['sig']
print('sig: ', sig)
filename = r + '.png'
with open(filename, 'wb') as f:
f.write(code_content)
sign, asign = _cacu_sign(r)
data = {'user_id': PD_ID, 'timestamp': r, 'sign': sign, 'predict_type': '30400',
'asign': asign, 'up_type': 'mt'}
files = {'img_data': ('img_data', code_content)}
url = 'http://pred.fateadm.com/api/capreg'
rsp = requests.post(url, data=data, files=files)
res = rsp.json()
try:
captcha = json.loads(res['RspData'])
captcha = captcha['result']
print('验证码:', captcha)
except Exception:
return None, None
else:
os.remove(filename)
return sig, captcha
发送邮件到我们指定的邮箱
整体介绍
在以上两部分完成之后,最后一步令小程序发送邮件其实就是抓取一个表达提交接口,想必这对各位同鞋来说不是什么难事,这里也没有太多的内容需要分析,需要的注意的地方仍然是两点:
- 仍然要保证你最后提交数据的请求和之前的请求在同一session之下
- 需要更改requests的User-Agent头信息来模拟浏览器,否则请求会被微信直接拦截
- 需要修改Referer请求头信息,越过微信的referer防盗链检查
相关代码:
1 | def _send_auth_request(session, sig, verifycode): |
测试结果如下:
收到的邮件如图:
结语
好啦,今天的第一部分教程就到此为止啦,下一次我将为大家带来有关IMAP协议的介绍,读取邮件并激活,敬请期待。如果你喜欢我的文章,可以扫一下这个二维码给我一点鼓励