【简化工作】山东农商行批量下载银行回单

【简化工作】山东农商行批量下载银行回单

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)
    })
})

猜你喜欢

转载自blog.csdn.net/qq_41755979/article/details/131619275