网上分析的有很多,本文是2022年12月国税查验平台的分析
官方网址
请求分析
国税查验平台请求共分为获取验证码和输入验证码后查验数据并返回发票详细信息。
安装更证书
打开查验平台
打开开发者工具 F12
输入发票信息
可以看到获取验证码的地址就是:
地址:
https://fpcy.tianjin.chinatax.gov.cn/NWebQuery/yzmQuery?callback=jQuery1102049868737222047077_1663132875505&fpdm=034012000211&fphm=12345678&r=0.8199210530535583&v=2.0.10_020&nowtime=1663133791591&publickey=1663133791591&key9=dbb6960e0167113b94bcbde0a48e0c93&_=1663132875507&flwq39=WvPkgRokuUxn2Z6Tmbj%2FQ3sqI7YWUT8PC%2BYZKFccHzHv7ezF%2F3Szbdi5wLWfKvNdg%2BcK98YcCqg3Ogohh0U5%2BowlcitWzS5XlWQRs8i0chuaDGzHM6EdB2aXAFEG6ranrIKDqE32bz8umFwC%2FK%2FJnr9G%2BPQMtVSZe3AYr0F3dOY%3D
参数:
callback: jQuery1102049868737222047077_1663132875505
fpdm: 034012000211
fphm: 12345678
r: 0.8199210530535583
v: 2.0.10_020
nowtime: 1663133791591
publickey: 1663133791591
key9: dbb6960e0167113b94bcbde0a48e0c93
_: 1663132875507
flwq39: WvPkgRokuUxn2Z6Tmbj/Q3sqI7YWUT8PC+YZKFccHzHv7ezF/3Szbdi5wLWfKvNdg+cK98YcCqg3Ogohh0U5+owlcitWzS5XlWQRs8i0chuaDGzHM6EdB2aXAFEG6ranrIKDqE32bz8umFwC/K/Jnr9G+PQMtVSZe3AYr0F3dOY=
分析请求验证码
我们开始找下ajax调用的参数
在开发者工具的 sources 下按下 crtl + shift + f 全局搜索:key9
找到jquery的ajax的参数
r 参数: Math.random()
搜索 VVV
v参数: 2.0.11_060
nowtime参数和publickey参数:
_0x3cf19a 这个参数调用的是showTime()
function showTime() {
var _0xa663c0 = new Date();
var _0x5bad4f = _0xa663c0['getTime']();
return _0x5bad4f;
}
key9参数:
验证码的key9调用的是
$['nnyd']['yzm'](_0x5bf6a5, _0x11290e, _0x3cf19a)
这个方法,全局搜索**‘yzm’** 记得加单引号。
flwq39参数:
_0xc6dfaa 就是 flwq39
var _0xc6dfaa = _0x3fa78b['RweZE'](_0x461197, _0x1da4ef);
_0x25339e 就是生成 flwq39的方法
分析请求查验接口参数
// 地址
https://fpcy.tianjin.chinatax.gov.cn/NWebQuery/vatQuery?callback=jQuery361020736171529766634_1670850684903&key1=034012000211&key2=12345678&key3=20220921&key4=746759.5&fplx=01&yzm=fgdb&yzmSj=2022-12-13%2000%3A44%3A39&index=671dd7a812b81eba42c95e847f005a37&key6=8a8a8aac84c873000185073a46442d42&publickey=2022-12-13%2000%3A44%3A39&key9=e8b58b6e8c4bceb08f7236293d6c7d3c&_=1670850684906&flwq39=Xkw9vTzuX%2F3UhUHk8aidUr6teItnvHuyZ3BJKyUpDk4Bs6%2B1l9Qw%2BKf6I35r%2BE9KwRPQog736htaHvSA%2FzplObZ%2Btrw9gRMRm%2FOBG5tB6xY2sPopOeCZ8Dcv%2B3DsvlIndnVVLCoeYIRcrk1WkBNyit89c0JO4qQQKbY2ec%2FslxE%3D
// 参数
key1: 034012000211
key2: 12345678
key3: 20220921
key4: 746759.5
fplx: 01
yzm: fgdb
yzmSj: 2022-12-13%2000%3A44%3A39
index: 671dd7a812b81eba42c95e847f005a37
key6: 8a8a8aac84c873000185073a46442d42
publickey: 2022-12-13%2000%3A44%3A39
key9: e8b58b6e8c4bceb08f7236293d6c7d3c
flwq39: Xkw9vTzuX%2F3UhUHk8aidUr6teItnvHuyZ3BJKyUpDk4Bs6%2B1l9Qw%2BKf6I35r%2BE9KwRPQog736htaHvSA%2FzplObZ%2Btrw9gRMRm%2FOBG5tB6xY2sPopOeCZ8Dcv%2B3DsvlIndnVVLCoeYIRcrk1WkBNyit89c0JO4qQQKbY2ec%2FslxE%3D
搜索**‘cy’**
向下找到查验时的参数
key1 参数
发票号码
key2 参数
发票代码
key3 参数
日期
key4 参数
金额或者校验码
fplx 参数
发票类型
yzm 参数
验证码
yzmSj、index、key6 参数
是验证码接口返回的
key9参数
$['nnyd']['cy'](_0x3e827f, _0x277a13, yzmSj)
这个方法
flwq39
和上边的验证码接口一样
成功后的部分代码
通过发票代码获取请求的url
#ifndef __IP_H__
#define __IP_H__
#include <map>
#include <string>
static std::map<std::string, std::string> citys = {
{"1100", "https://fpcy.beijing.chinatax.gov.cn:443/NWebQuery"},
{"1200", "https://fpcy.tianjin.chinatax.gov.cn/NWebQuery"},
{"1300", "https://fpcy.hebei.chinatax.gov.cn/NWebQuery"},
{"1400", "https://fpcy.shanxi.chinatax.gov.cn:443/NWebQuery"},
{"1500", "https://fpcy.neimenggu.chinatax.gov.cn:443/NWebQuery"},
{"2100", "https://fpcy.liaoning.chinatax.gov.cn:443/NWebQuery"},
{"2102", "https://sbf.dalian.chinatax.gov.cn:8402/NWebQuery"},
{"2200", "https://fpcy.jilin.chinatax.gov.cn:4432/NWebQuery"},
{"2300", "https://fpcy.heilongjiang.chinatax.gov.cn:443/NWebQuery"},
{"3100", "https://fpcy.shanghai.chinatax.gov.cn:1001/NWebQuery"},
{"3200", "https://fpcy.jiangsu.chinatax.gov.cn:80/NWebQuery"},
{"3300", "https://fpcy.zhejiang.chinatax.gov.cn:443/NWebQuery"},
{"3302", "https://fpcy.ningbo.chinatax.gov.cn:443/NWebQuery"},
{"3400", "https://fpcy.anhui.chinatax.gov.cn:443/NWebQuery"},
{"3500", "https://fpcy.fujian.chinatax.gov.cn:443/NWebQuery"},
{"3502", "https://fpcy.xiamen.chinatax.gov.cn/NWebQuery"},
{"3600", "https://fpcy.jiangxi.chinatax.gov.cn:82/NWebQuery"},
{"3700", "https://fpcy.shandong.chinatax.gov.cn:443/NWebQuery"},
{"3702", "https://fpcy.qingdao.chinatax.gov.cn:443/NWebQuery"},
{"4100", "https://fpcy.henan.chinatax.gov.cn/NWebQuery"},
{"4200", "https://fpcy.hubei.chinatax.gov.cn:443/NWebQuery"},
{"4300", "https://fpcy.hunan.chinatax.gov.cn:8083/NWebQuery"},
{"4400", "https://fpcy.guangdong.chinatax.gov.cn:443/NWebQuery"},
{"4403", "https://fpcy.shenzhen.chinatax.gov.cn:443/NWebQuery"},
{"4500", "https://fpcy.guangxi.chinatax.gov.cn:8200/NWebQuery"},
{"4600", "https://fpcy.hainan.chinatax.gov.cn:443/NWebQuery"},
{"5000", "https://fpcy.chongqing.chinatax.gov.cn:80/NWebQuery"},
{"5100", "https://fpcy.sichuan.chinatax.gov.cn:443/NWebQuery"},
{"5200", "https://fpcy.guizhou.chinatax.gov.cn:80/NWebQuery"},
{"5300", "https://fpcy.yunnan.chinatax.gov.cn:443/NWebQuery"},
{"5400", "https://fpcy.xizang.chinatax.gov.cn:81/NWebQuery"},
{"6100", "https://fpcy.shaanxi.chinatax.gov.cn:443/NWebQuery"},
{"6200", "https://fpcy.gansu.chinatax.gov.cn:443/NWebQuery"},
{"6300", "https://fpcy.qinghai.chinatax.gov.cn:443/NWebQuery"},
{"6400", "https://fpcy.ningxia.chinatax.gov.cn:443/NWebQuery"},
{"6500", "https://fpcy.xj-n-tax.gov.cn:443/NWebQuery"}
};
static std::string getDqdmByCode(const std::string _0x317587) {
if (_0x317587 == "91")
return "2102";
if (_0x317587 == "92")
return "3702";
if (_0x317587 == "93")
return "3302";
if (_0x317587 == "94")
return "3502";
if (_0x317587 == "95")
return "4403";
if (_0x317587 == "00")
return "0000";
return "";
}
static std::string getIp(const std::string fpdm) {
std::string fpdm_s = fpdm;
if (fpdm_s.length() == 12) {
fpdm_s = fpdm_s.substr(1, 4);
}
/*else if (fpdm_s.length() == 20) {
std::string code = fpdm_s.substr(2, 2);
std::string dqdm = getDqdmByCode(code);
if (dqdm.empty()) {
dqdm = code + "00";
}
}*/
else {
fpdm_s = fpdm_s.substr(0, 4);
}
if (fpdm_s != "2102" && fpdm_s != "3302" && fpdm_s != "3502" && fpdm_s != "3702" && fpdm_s != "4403") {
fpdm_s = fpdm_s.substr(0, 2) + "00";
}
return citys[fpdm_s];
}
#endif // __IP_H__
通过发票代码和发票号码获取发票类型
static const std::string fplx(const std::string _0x22feeb, const std::string _0x301f86) {
std::string _0xadb8e2;
std::string _0x5ddd1a = "99";
std::string code[] = { "144031539110", "131001570151", "133011501118", "111001571071" };
if (_0x22feeb.length() == 12) {
_0xadb8e2 = _0x22feeb.substr(0x7, 0x1);
for (int _0x325999 = 0x0; _0x325999 < std::end(code) - std::begin(code); _0x325999++) {
if (_0x22feeb == code[_0x325999]) {
_0x5ddd1a = "10";
break;
}
}
if (_0x5ddd1a == "99") {
if (_0x22feeb.at(0x0) == '0' && _0x22feeb.substr(0xa, 0x2) == "11") {
_0x5ddd1a = "10";
}
if (_0x22feeb.at(0x0) == '0' && (_0x22feeb.substr(0xa, 0x2) == "04" || _0x22feeb.substr(0xa, 0x2) == "05")) {
_0x5ddd1a = '04';
}
if (_0x22feeb.at(0x0) == '0' && (_0x22feeb.substr(0xa, 0x2) == "06" || _0x22feeb.substr(0xa, 0x2) == "07")) {
_0x5ddd1a = '11';
}
if (_0x22feeb.at(0x0) == '0' && _0x22feeb.substr(0xa, 0x2) == "12") {
_0x5ddd1a = '14';
}
}
if (_0x5ddd1a == "99") {
if (_0x22feeb.substr(0xa, 0x2) == "17" && _0x22feeb.at(0x0) == '0') {
_0x5ddd1a = "15";
}
if (_0x5ddd1a == "99" && _0xadb8e2 == "2" && _0x22feeb.at(0x0) != '0') {
_0x5ddd1a = "03";
}
}
if (_0x5ddd1a == "99") {
if (_0x22feeb.at(0x0) == '0' && _0x22feeb.substr(0xa, 0x2) == "13") {
_0x5ddd1a = "08";
}
}
}
else if (_0x22feeb.length() == 0xa) {
_0xadb8e2 = _0x22feeb.substr(0x7, 0x1);
if (_0xadb8e2 == "1" || _0xadb8e2 == "5") {
_0x5ddd1a = "01";
}
else if (_0xadb8e2 == "6" || _0xadb8e2 == "3") {
_0x5ddd1a = "04";
}
}
else if (_0x22feeb.length() == 0) {
if (_0x301f86.length() == 20) {
if ("9" == _0x301f86.substr(0x4, 0x1)) {
_0x5ddd1a = "83";
}
else if ("8" == _0x301f86.substr(0x4, 0x1)) {
_0x5ddd1a = "61";
}
else {
_0x5ddd1a = "09";
}
}
}
return _0x5ddd1a;
}
获取验证码
static const std::string yzmInfo(const std::string fpdm, std::string fphm, time_t nowtime) {
std::string version = "2.0.11_060";
srand(nowtime);
std::ostringstream url;
url << getIp(fpdm) << "/yzmQuery"
<< "?callback=jQuery36102451955861480899_" << nowtime
<< "&fpdm=" << fpdm
<< "&fphm=" << fphm
<< "&r=" << rand() / (RAND_MAX + 1.0)
<< "&v=" << version
<< "&nowtime=" << nowtime
<< "&publickey=" << nowtime
<< "&key9=" << yzm(fpdm, fphm, std::to_string(nowtime))
<< "&_=" << nowtime - 999
<< "&";
std::string reqUrl = url.str() + "flwq39=" + yzm_flwq39(url.str());
std::string res = request(reqUrl);
const boost::regex e(".*\\((\\{.*\\})\\)");
const std::string machine_format("\\1");
res = boost::regex_replace(res, e, machine_format, boost::match_default | boost::format_sed);
configor::json::value resObj = configor::json::parse(res);
if (resObj.count("data") == 1) {
std::string val;
Base64Decode(replaceStr(resObj["data"], std::to_string(nowtime)), &val);
return val;
}
return res;
}
{"key1":"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","key2":"2022-12-13 01:26:57","key3":"5c987d57ffba379c18abc0fa8951cec6","key4":"03","key5":"2","key6":"8a8a8aa984c8491f0185073790407565"}
获取查验信息
static const std::string cyInfo(const std::string fpdm, std::string fphm, std::string date, std::string je, configor::json::value obj, time_t nowtime) {
std::string key1 = obj["key1"];
std::string key2 = obj["key2"];
std::string key3 = obj["key3"];
std::string key4 = obj["key4"];
std::string key5 = obj["key5"];
std::string key6 = obj["key6"];
std::string code = recCode(key1, atoi(key4.data()));
std::ostringstream url;
url << getIp(fpdm) << "/vatQuery"
<< "?callback=jQuery36102451955861480899_" << nowtime
<< "&key1=" << fpdm
<< "&key2=" << fphm
<< "&key3=" << date
<< "&key4=" << je
<< "&fplx=" << fplx(fpdm, fphm)
<< "&yzm=" << code
<< "&yzmSj=" << urlEncode(key2)
<< "&index=" << key3
<< "&key6=" << key6
<< "&publickey=" << urlEncode(key2)
<< "&key9=" << cy(fpdm, fphm, key2)
<< "&_=" << nowtime - 1000
<< "&";
std::string reqUrl = url.str() + "flwq39=" + cy_flwq39(url.str());
std::string res = request(reqUrl);
if (res.empty()) {
return res;
}
const boost::regex e(".*\\((\\{.*\\})\\)");
const std::string machine_format("\\1");
res = boost::regex_replace(res, e, machine_format, boost::match_default | boost::format_sed);
if (res.find("\"data\":") != std::string::npos) {
configor::json::value resObj = configor::json::parse(res);
std::string val;
Base64Decode(replaceStr(resObj["data"], key2), &val);
return urlDecode(val);
}
else {
const boost::regex e1("\\n");
const std::string machine_format1("");
return boost::regex_replace(res, e1, machine_format1, boost::match_default | boost::format_sed);
}
}
验证码识别
文字识别的模型有很多可以使用百度的PaddleOcr或者自己用crnn + ctc或者其他模型训练验证码识别。