搜索文档

输入关键词,回车打开结果

网银自动化对账:解决多重安全盾 UKey 限制下的双端数据自动抓取与对账

在企业财务流程中,最难自动化的环节之一是登录企业网银下载电子回单和交易流水

网银系统出于资金安全的考虑,普遍采用了物理 UKey(网银盾)插槽校验,并要求输入每次动态变化的短信验证码。这使得纯粹的无人值守机器人无法在网银端顺利工作。

一、 人机协同(Human-in-the-loop)的登录方案

为了攻克这个壁垒,三函代码采用了一种人机协作的混合自动化架构

[RPA 导航至网银登录页] ➔ [自动识别 UKey 状态] ➔ [触发验证码] ➔ [弹框提示出纳输入] ➔ [机器人接管下载]

通过将“验证码提取”这一步交由现场出纳处理,既保留了网银的高安全性,又省去了后续繁琐的分页、点击和格式下载手工作业。

二、 核心 Playwright 短信验证码等待脚本

以下为核心人机协作脚本的实现细节:

import { chromium, Page } from 'playwright';

async function loginToBankWithUkey(page: Page, username: string) {
    await page.goto('https://corporate.bank.example.com/login');
    
    // 填写用户名
    await page.fill('#corp-user-input', username);
    
    // 触发获取短信验证码按钮
    await page.click('#btn-send-sms');
    console.log('已发送短信验证码,等待出纳输入...');
    
    // 关键步骤:在控制台或本地 UI 弹窗提示输入,等待最长 90 秒
    const verifyCode = await waitForUserVerificationCode();
    
    // 填写验证码并点击登录
    await page.fill('#sms-code-input', verifyCode);
    await page.click('#btn-login');
    
    // 等待进入控制台主页,完成登录对接
    await page.waitForURL('**/dashboard');
    console.log('登录成功,准备开始下载流水...');
}

// 模拟本地 UI 弹出框等待输入
function waitForUserVerificationCode(): Promise<string> {
    return new Promise((resolve) => {
        // 在实际应用中,这里会弹出一个漂亮的 Electron/Windows 悬浮窗
        const readline = require('readline').createInterface({
            input: process.stdin,
            output: process.stdout
        });
        readline.question('请输入收到得短信验证码: ', (code: string) => {
            resolve(code.trim());
            readline.close();
        });
    });
}

三、 网银流水格式清洗与对齐

下载下来的网银流水(多为 CSV 或 XLS 格式)往往字段缺失,且不同银行的栏位命名不尽相同。我们需要建立标准化清洗函数:

import pandas as pd

def normalize_bank_csv(file_path, bank_type):
    df = pd.read_csv(file_path)
    
    if bank_type == "ICBC": # 工商银行
        df_clean = df.rename(columns={
            "交易日期": "date",
            "支出金额": "debit",
            "收入金额": "credit",
            "对方户名": "partner_name",
            "摘要": "remark"
        })
    elif bank_type == "CCB": # 建设银行
        df_clean = df.rename(columns={
            "记账日期": "date",
            "借方发生额": "debit",
            "贷方发生额": "credit",
            "对方名称": "partner_name",
            "交易摘要": "remark"
        })
    else:
        raise ValueError("未知的银行格式")
        
    # 统一借贷方向
    df_clean['amount'] = df_clean['credit'].fillna(0.0) - df_clean['debit'].fillna(0.0)
    df_clean['date'] = pd.to_datetime(df_clean['date'])
    return df_clean[['date', 'amount', 'partner_name', 'remark']]

四、 结论

通过这种人机协同的设计,我们既不破坏企业网银严格的物理安全准则,又解放了人工后续几百笔明细账的一页页翻看和手工核对流程,实现了银企自动对账的高效闭环。

准备好体验全能智能体了吗?

下载 OmniAgent 社区版,体验真正的本地 AI 自动化。数据安全、永久免费。