发票查验分析 2022年12月

网上分析的有很多,本文是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或者其他模型训练验证码识别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值