影刀RPA新手教程:会计凭证自动化完全指南——进项发票核验、凭证录入与账期核对
我做影刀RPA的第一个财务项目,是帮会计部做进项发票核验和凭证录入。每个月底,会计小姐姐要对着几百张发票在税务平台查真伪,再打开财务系统一张张录入凭证,最后核对账期。她告诉我,这项工作最折磨人的地方不是累,而是不敢错。错一张凭证,后面对账就要翻好几天。我帮她用影刀搭了一套流程,发票查验、凭证生成、账期核对全自动。这篇文章把整个过程讲透。
一、安装影刀与浏览器插件
财务电脑通常装了很多安全软件,影刀安装时可能会被拦截。我建议先和安全部门沟通,把影刀和浏览器插件加入白名单。浏览器插件安装后,打开增值税发票查验平台测试捕获。财务系统可能是网页版也可能是客户端,网页版优先用元素定位,客户端只能用图像识别或键盘模拟。安装完成后,先不要急着写流程,手动走一遍完整的发票查验和凭证录入,录屏或截图记录每一步。
二、元素定位四合一
税务平台和财务系统的界面都偏老,元素命名不一定规范。XPath 定位发票查验页面的输入框,例如 //input[@id='fpdm'] 发票代码、//input[@id='fphm'] 发票号码、//input[@id='kprq'] 开票日期、//input[@id='kjje'] 校验码。财务系统的凭证录入页面,科目输入框可以用 //input[contains(@name,'subject')] 定位。
CSS 选择器用于定位按钮,比如 .btn-search、.btn-save、.btn-next。正则表达式从发票 PDF 或图片里提取信息:发票代码\s*[::]\s*(\d{10,12})、发票号码\s*[::]\s*(\d{8,20})、金额\s*[::]\s*([0-9,]+\.?\d*)。XPath 和 CSS 选型:税务平台表单字段有固定 id,用 CSS 最快;财务系统科目树层级深,用 XPath 的轴定位更合适。
三、变量与数据类型
一张发票的数据结构通常这样设计:
[video(video-z75cuVCp-1782597823051)(type-csdn)(url-live.csdn.net/v/embed/525…)]
invoice = {
"code": "044002100111",
"number": "12345678",
"date": "20240615",
"amount": 5680.50,
"tax": 737.46,
"seller": "云海科技有限公司",
"buyer": "我方公司",
"verify_result": "一致"
}
数字用于金额和税额计算,字符串用于发票代码、号码和公司名。列表存所有发票,ForEach 循环逐张处理。字典键不存在时用默认值,比如某些发票没有备注,invoice.get("remark", "")。字符串拼接用于生成凭证摘要,例如 "购" + invoice["seller"][:10] + "材料"。JSON 在调用财务系统接口或税务接口时使用,虽然现在大部分税务平台没有开放 API,但企业自研财务系统通常有接口。
四、流程控制
发票处理流程是标准的循环加判断。ForEach 列表循环处理每张发票。If 判断处理发票类型:增值税专用发票走 A 流程,普通发票走 B 流程,电子发票走 C 流程。If 还用于判断查验结果,如果税务平台返回不一致或查无此票,就标记异常并跳过。
Try-Catch 处理税务平台验证码和滑动验证。我第一次做发票查验时,被验证码卡了很久。后来我的方案是:先用 OCR 识别简单验证码,识别失败就暂停流程人工输入,或者接入第三方打码平台。查验请求太频繁会被限流,用 sleep 控制节奏。凭证录入时如果科目不存在,捕获异常后写入异常表。
for invoice in invoices:
try:
result = verify_invoice(invoice)
if result == "一致":
create_voucher(invoice)
else:
mark_abnormal(invoice, result)
except Exception as e:
print("处理失败:" + str(e))
save_to_retry(invoice)
五、网页自动化
税务平台和财务系统的网页加载速度不稳定,等待策略尤为重要。我一般用 等待元素存在 等登录后的首页出现,再用 元素存在 判断当前页面是否到达目标。弹窗处理五步流程:税务平台查验结果弹窗、财务系统保存成功提示、科目不存在提示都要处理。
翻页在发票列表和历史凭证查询里常见,用下一页 disabled 判断。懒加载在凭证列表里较少见,但在科目选择树里常见,展开父节点后子节点才加载,需要先点击展开再定位子节点。iframe 在财务系统里非常常见,尤其是报表和凭证录入页面,切换 frame 后操作完切回主文档。窗口切换在打开发票预览 PDF 时常见。
六、数据处理
Excel 是发票数据和凭证模板的主要来源。读取 Excel 里的发票清单,每一行转成一个字典。数据清洗包括:发票代码和号码去空格、日期统一成 YYYYMMDD 格式、金额和税额转数字、校验合计是否等于价税合计。我踩过一个坑:Excel 里的金额是文本格式,前面带了人民币符号,直接转数字会失败,必须先用正则去掉非数字和小数点。
数据库操作在财务自动化里很常见。凭证生成后写入财务系统数据库的凭证表和凭证明细表,查询时做账期核对。连接参数加 read_timeout,大批量核对不会断线。入库报 将截断字符串或二进制数据,通常是摘要或科目名称超长,先截断或检查表字段长度。关闭连接不能忘,财务系统对数据一致性要求高,连接泄漏可能引发锁表。
七、鼠标键盘图像自动化
税务平台有验证码和滑动条,影刀的图像识别和鼠标模拟能部分处理。对于简单验证码,用 图像识别文字 或 OCR 读取后填入。滑动条用 鼠标拖动 指令,从滑块位置拖到缺口位置。如果识别率不高,建议接入第三方打码服务或人工干预。财务系统客户端如果是 C/S 架构,用图像识别点击菜单和按钮,用键盘输入填凭证。
八、进阶技能
OCR 在发票处理里非常关键。影刀可以调用 OCR 识别发票图片或 PDF,提取发票代码、号码、金额、税率、销售方、购买方。我刚开始用通用 OCR,识别率一般,后来改用发票专用 OCR 接口,准确率提升到 95% 以上。Python 协同用于复杂计算,比如价税分离、凭证分录生成、账期差异分析。pandas 读取 Excel,openpyxl 写入凭证模板。
HTTP 请求在调用财务系统 API 时使用。如果财务系统是自研的,通常有凭证创建接口,影刀里用 JSON 传数据比模拟点击更稳。第三方税务接口也有提供发票查验 API,可以直接调用,省去网页模拟。
[video(video-ivJkLg0T-1782597829815)(type-csdn)(url-live.csdn.net/v/embed/524…)]
九、平台实战
财务自动化经常要对接多个平台。比如从邮箱下载供应商发来的 PDF 发票,用 OCR 识别后录入系统;从 ERP 获取采购订单数据,和发票核对三单匹配;从银行网银下载回单,和凭证匹配。影刀可以串联这些流程。我做过一个三单匹配流程:采购订单、入库单、发票三方核对,不一致的自动标红。
十、系统联动
机器人跑完要通知会计。飞书消息最常用,把已处理发票数、异常数、异常清单发到财务部群。飞书多维表格可以做发票台账,机器人把查验结果和凭证号写进去,方便查询。邮件用于发送月末凭证汇总和异常报告。定时任务设置每天晚上 10 点跑一遍发票录入,第二天早上会计上班审核;月末最后一天晚上跑账期核对。
十一、工程化与规范
财务流程必须规范,因为容错率低。建议拆成:读取发票、税务查验、生成凭证、写入财务系统、账期核对、发送报告。每个子流程独立,用参数传递发票字典。命名规范:变量 v_、子流程 sub_、元素 ele_。调试时用断点,我遇到过一次凭证金额总是差一分钱,逐行看才发现是浮点数精度问题,后来用 Decimal 计算。
版本选择上,财务场景对稳定性和日志要求高,建议至少用创业版,企业版更好。流程模板化方面,可以把凭证生成逻辑做成模板,不同公司只改科目映射表。安全方面,税务平台账号密码要加密存储,操作日志要完整保留。
十二、速查表与常见报错
元素定位失败:财务系统 iframe 多,先检查 frame。XPath 语法报错:检查引号和中括号。Excel 报错:金额格式问题,先清洗再转数字。循环报错:发票列表为空。弹窗拦截:税务平台弹窗标题不固定,用 contains 模糊匹配。验证码识别失败:OCR 识别率低时转人工或第三方打码。数据库报错:连接超时加 read_timeout,字段截断检查长度,金额精度用 Decimal。
我整理的影刀RPA学习主页有财务自动化模板和发票处理流程:home.linyan.cloud。会计凭证自动化的核心价值不是完全无人化,而是把重复、机械、容易出错的录入和核对交给机器人,让会计把精力放在审核、分析和合规上。
#影刀RPA #RPA教程 #财务自动化 #会计凭证 #发票查验 #账期核对 #新手入门
作者:林焱