前言
这是一篇含金量很高的干货文章,笔者将手把手带领各位一步一步地实现爬取国家税务总局全国增值税发票查验平台(以下简称“查验平台”)。这个想法诞生在19年初,当时在做一款通过扫描二维码就可以查验发票的小程序。
当时由于笔者学艺尚浅,没办法模拟请求爬取查验平台,所以最终采用的技术方案是通过web自动化测试工具selenium控制浏览器去模拟查验步骤,即使这样,开发过程也是困难重重,不过最后笔者和伙伴们成功实现了整套流程,最后开发出的产品口袋发票夺得了包括2019微信小程序开发大赛赛区三等奖在内的多个奖项。
但是产品是无法真正上线的,因为通过selenium爬虫的方式实在是太消耗性能了,测试结果表明:百度云4核8G的服务器职能同时服务10人以内。
笔者一直不甘心,暗自下定决心:一定要实现模拟请求爬取。
那么闲话少说,我们开始吧。
查一张发票
第一步肯定是分析查验平台整体的逻辑,所以我们首先来真实地查验一张发票。
这里笔者使用的是Chrome 76.0.3809.132,是本文发布时的最新版本。
- 这里我找到了一张发票,首先输入发票号码
我发现:当我的光标移动到发票号码输入框时发票代码右侧出现了一个对勾,这说明在发票代码失焦的时候会检测发票代码正确性,然后给用户一个反馈。
这是我在京东买书的发票,是在北京开具的,这里可以了解一下发票号码的含义:百度百科 - 接下来我们继续输入发票号码
有趣的事情出现了,发票号码失焦之后下面突然出现了验证码,这里我们得出结论:验证码请求的时机是在发票号码失焦之后 - 继续输入开票日期和校验码后六位
此时查验按钮还不可点击 - 输入验证码
此时我们了解到税务总局的验证码含有中文和英文,并且需要根据颜色指示输入,让我们多刷新几次验证码。
我刷新了n次之后发现:验证码提示只有4种情况:输入全部、黄色、红色、蓝色
查验按钮在所有信息填写完之后出现 - 最后点击查验即可得到发票的真伪和详细信息
查看获取验证码的请求
- 我将网页刷新然后F12打开Chrome的调试工具,点击Network然后将列表清空。
- 接下来我们重复刚才查验发票的操作,直到失焦发票号码输入框,然后观察验证码是怎么来的。
此时我们发现了验证码的请求,看一下详细信息。
这是一个jQuery发起的请求,笔者对jQuery了解的不深,不过我们继续看请求参数:
参数名 | 含义 |
---|---|
callback | 固定值 |
fpdm | 发票代码 |
fphm | 发票号码 |
r | 看起来像是个用来签名的随机数 |
v | 应该是版本号 是个固定值 |
nowtime | 请求发起时的时间 |
area | 简单猜测和地区有关系 |
publickey | 签名(我们需要破解的东西) |
_ | 不知道这是什么 |
那么现在我们的目标很明确了,找到publickey的计算方法。
让我们来利用Chrome调试工具的动作追踪功能,首先定位发票号码的输入框,然后打开这个项目
下面的blur指的就是失焦操作,