【简化工作】山东农商行批量下载银行回单
1. 来源
发布缘由:
温馨提示:
您可点击“回单”链接,查询此笔交易的详细信息;若为账务性交易可以下载打印电子回单。
您可一次选择两张电子回单进行打印。
2. 准备工作
- 工具:IE浏览器(或Edge浏览器+IEChooser.exe)
3. 主要分析步骤
- 第一步:登录网银,并进入客户回单打印界面,打开浏览器开发者工具界面
1、IE浏览器:右键点击检查元素;
2、Edge浏览器:运行%systemroot%\system32\f12\IEChooser.exe
,并选择网页。 - 第二步:开发者工具网络页签,查看在点击查询回单和打开回单时的网络请求及响应内容,提炼为以下函数
function newSession(url, data) {
// 预设请求会话格式
// @param url: 请求链接
// @param data: 请求内容
return {
"url": url,
"method": "POST",
"headers": {
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-Hans-CN, zh-Hans; q=0.8, en-US; q=0.5, en; q=0.2",
"Cache-Control": "no-cache",
"Connection": "Keep-Alive",
"Content-Type": "application/json; charset=utf-8",
"Host": "ebank.sdrcu.com",
"User-Agent": navigator.userAgent,
"Cookie": document.cookie
},
"data": JSON.stringify(data),
async: false
}
}
function getTradeLists(accSnIN, begin, end, current) {
// 查询回单列表:模拟分页
// @param accSnIN: 银行账号序列ID,需要在任一请求中获取
// @param begin: 开始日期,格式yyyy-mm-dd,例2023-01-01
// @param end: 结束日期,格式yyyy-mm-dd,例2023-01-01
// @param current: 回单列表页,一页10行,超出最大页数响应内容是第一页,易引发死循环,最好从第一页开始遍历至最后一页
var result = {
}
$.ajax(newSession(
"https://ebank.sdrcu.com/eweb/EcifTrsPrintQryList.do?_locale=zh_CN&BankId=305100001008&LoginType=C",
{
"BeginDate": begin,
"EndDate": end,
"inmPageUpDown": current > 1 ? 2 : 0,
"inmPagesEndKey": current > 1 ? current * 10 - 10 : "",
"inmPagesStaKey": current > 1 ? current * 10 - 19 : "",
"TrdGrpCodes": "B01",
"accSnIN": accSnIN
}
)).done(function (response) {
result = response
})
return result
}
function getCustomerAdvice(accSnIN, trdSeqno, trdDate, trandId, curName, returnType) {
// 获取银行回单base64字符串
// @param accSnIN: 银行账号序列ID,需要在任一请求中获取
// @param trdSeqno: 交易序列号,从回单列表中获取
// @param trdDate: 交易日期,从回单列表中获取
// @param trandId: 款项序列ID,从回单列表中获取(暂未知用途)
// @param curName: 币别,从回单列表中获取
// @param returnType: 转账类型,从回单列表中获取
var result = {
}
$.ajax(newSession(
"https://ebank.sdrcu.com/eweb/EcifTrsPrintQryDetail2.do?_locale=zh_CN&BankId=305100001008&LoginType=C",
{
"accSnIN": accSnIN,
"trdSeqno": trdSeqno,
"trdDate": trdDate,
"trandId": trandId,
"curName": curName,
"returnType": returnType
}
)).done(function (response) {
result = response
})
return result
}
4. 编写代码
- 组合以上回单列表,单页回单打印的请求,逐项遍历保存图片base64字符串,并下载保存为json格式(字符串长度超过excel单元格最大长度限制)
function downLoadDataToLoc(saveDatas, filename) {
// 下载数据
// @param saveDatas: 数据体
// @param filename: 文件名
var blob = new Blob([JSON.stringify(saveDatas)], {
type: 'application/json' })
if ("msSaveOrOpenBlob" in navigator) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
var url = window.URL.createObjectURL(blob)
var link = document.createElement('a')
link.href = url
link.setAttribute('download', filename)
link.click()
}
}
function getAllCustomerAdvices(accSnIN, begin, end) {
// 遍历保存指定日期回单,并在控制台输出下载进度
// @param accSnIN: 银行账号序列ID,需要在任一请求中获取
// @param begin: 开始日期,格式yyyy-mm-dd,例2023-01-01
// @param end: 结束日期,格式yyyy-mm-dd,例2023-01-01
var results = []
var i = 1
console.group("银行回单:从" + begin + "至" + end)
do {
var res = getTradeLists(accSnIN, begin, end, i)
var islast = res.page.lastPageFlag
console.log("正在下载" + (islast == "Y" ? "最后一页" : "第" + i + "页"))
$(res.List).each(function (k, v) {
var val = res.List[k]
val["eleRec"] = getCustomerAdvice(accSnIN, v.trdSeqno, v.trdDate, v.trandId, v.curName, v.returnType).eleRec
results.push(val)
})
i++
} while (islast == "N")
console.log("下载完毕,共%s条", results.length)
console.groupEnd()
return results
}
// 函数使用例子,参数自行调整:
var accSnIN = "开发者工具中查到的银行账号ID"
var results = getAllCustomerAdvices(accSnIN, "2023-01-01", "2023-01-31")
downLoadDataToLoc(results, "results.json")
5. 结语
- 以上为从山东农商行批量获取银行回单步骤,每次使用时,在浏览器控制台粘贴所有函数代码,调整accSnIN、开始日期和结束日期即可;
- 获取的base64字符串需要转换为图片保存,以下为powershell代码示例,其他方式可查阅base转图片相关资料:
# Set-ExecutionPolicy RemoteSigned
Add-Type -AssemblyName System.Drawing
function Convert-Base64ToJPG {
param
(
[Parameter(Mandatory = $true)]
[String]
$baseString
)
$bytes = [System.Convert]::FromBase64String($baseString)
$stream = [System.IO.MemoryStream]::new($bytes)
$image = [System.Drawing.Image]::FromStream($stream, $true)
$stream.Close()
return $image
}
# 存在prIntCount,printCount冲突字段
$arr = (Get-Content ".\results.json" -Encoding UTF8) -replace '"prIntCount":\s?null,' | ConvertFrom-Json
# 顺序自由调整,无合适的方式
$arr = $arr | Sort-Object -Property 'trdDate', 'trdSeqno'
# [Array]::Reverse($arr)
if (-not (Test-Path ".\回单")) {
New-Item "回单" -ItemType Directory
}
for ($i = 0; $i -lt $arr.Count; $i++) {
$image = Convert-Base64ToJPG $arr[$i].eleRec
$image.Save(".\回单\$(@(
("{
0:000}" -f ($i + 1)),
$arr[$i].trdDate,
$arr[$i].inOutFlag,
$arr[$i].toName,
$arr[$i].trdAmt) -join "_"
).png", [System.Drawing.Imaging.ImageFormat]::Png
)
}
- 查看账号序列ID
$.ajax({
"url": "https://ebank.sdrcu.com/eweb/EAcNoListQry.do?_locale=zh_CN&BankId=305100001008&LoginType=C",
"method": "GET",
"headers": {
"User-Agent": navigator.userAgent,
"Cookie": document.cookie
}
}).done(function (response) {
$(response.AcList).each(function (i, v) {
console.log("账号:" + v.acProtectAcNo + ",序列号:" + v.acSeq)
})
})