会博通API对接实战:如何打通铁路基建项目的OA、监理系统与档案平台?
变更指令在OA里躺了三个月,检验批数据在施工系统里出不来,监理日报还在Excel里手动传……
档案验收前,开发团队通宵写脚本导数据,这种事我不信你没遇到过。
铁路基建项目,从来就不是“一个系统走天下”。业主用OA走流程,施工单位用项目管理系统管进度,监理单位有自己的日报系统,还有一堆纸质签批单、变更图纸散落在各参建方手里。到了档案归档节点,这些数据要从四面八方汇入统一的档案管理平台——问题是,怎么汇?

手工导出再导入?太Low,而且元数据容易丢。
写定制脚本?每个系统一套,维护成本爆炸。
等供应商开发接口?黄花菜都凉了。
今天这篇实战,我们基于会博通官方发布的《龟仔系列产品文件同步API接口文档》,把真正的开放接口讲透。并演示如何用Python封装这套接口,配合「龟仔妈妈」的全域连接能力,把结构化数据和非结构化数据(纸质签批单扫描件)一起拉入自动化流水线。
声明:本文所有接口调用方式、参数名称、认证流程均经过官方文档核验,代码示例可直接对标生产环境。
一、痛点再拆解:铁路基建档案自动化的三个死结
先回忆一下场景。某新建高速铁路项目,参建单位十几家,档案验收需要归档的数据包括:
- 变更指令:业主OA系统发起,经过审批生效;
- 检验批记录:施工单位项目管理系统每天填报;
- 监理日报/月报:监理系统生成;
- 纸质签批单:现场签认后扫描成PDF或图片。
三种来源的结构化数据(单据字段、签字记录等)要归档到会博通档案库,非结构化数据(扫描件、图纸)也要挂接到对应的档案条目上。
手工操作的痛苦大家都懂:登录三个系统导出Excel→人工录入会博通→再手工上传扫描件。一个变更单可能折腾半小时,而且元数据(责任者、日期、档号)极易丢失。
那么,会博通官方开放了哪些接口来终结这种痛苦?
二、官方API架构:推送+回调+主动下载,三阶段解耦
会博通的文件同步API采用了一种非常经典的设计:推送元数据 + 回调确认 + 主动拉取文件内容。
整个流程分为三个角色:
- 龟仔一体机(含龟仔妈妈、龟仔爸爸、龟仔):扫描或上传文件到会博通服务器;
- 会博通服务器:存储文件,并根据配置文件主动向第三方推送文件信息(仅元数据,不含文件内容);
- 第三方系统(你的OA/监理系统/档案中台):实现回调接口接收元数据,再按需调用下载接口获取实际文件。

为什么要把“文件信息”和“文件内容”分两次传递?
因为文件二进制体积大,如果全部塞进回调请求里,网络超时和失败率会飙升。先推送轻量元数据,第三方收到后再根据业务需要主动下载,既灵活又可靠。
三、前置准备:第三方系统需要做的两件事
在正式对接之前,需要完成以下配置(通常由会博通实施工程师或甲方技术负责人操作):
3.1 会博通侧配置推送目标
修改会博通服务器配置文件 ~/Config/SingleUpLoadOtherSystem.json,添加第三方系统的回调地址。示例:
json
复制
下载
{
"OtherName": "铁路工程公司档案中台",
"CallBlackUrl": "https://your-system.com/api/hbt_callback"
}
- OtherName:第三方系统的唯一标识,用于日志追踪和失败重试。
- CallBlackUrl:会博通推送文件信息时调用的HTTP接口(通常为POST)。
如果是云托管用户,需要把回调地址提供给会博通技术支持团队代为配置。
3.2 第三方系统开发回调接口
回调接口的作用仅仅是接收文件元数据并返回成功确认。下面是基于ASP.NET Core的官方示例(稍作简化):
csharp
复制
下载
[ApiController]
[Route("[controller]/[action]")]
public class HbtCallBlackController : ControllerBase
{
[HttpPost(Name = "PushMsg")]
public Results PushMsg(PushData pushData)
{
// 记录元数据到本地数据库,用于后续业务处理
_logger.LogInformation($"收到文件: {pushData.FileName}, MD5: {pushData.MD5}");
// 返回成功
return new Results { success = true };
}
}
public class PushData
{
public string? FileName { get; set; }
public string? MD5 { get; set; }
public string? CardID { get; set; } // 上传人员ID
public string? CatID { get; set; } // 会博通文件唯一ID
public string? Sequence { get; set; } // 0=正文,>0=附件
public string? Type { get; set; } // Files/ExchangeFile等
public Dictionary<string, object>? Prop { get; set; } // 元数据字典
}
public class Results { public bool success { get; set; } }
注意:回调接口只接收信息,不处理文件二进制。文件内容需要后续单独下载。
四、实战:用Python对接会博通官方API
我们以“业主OA中的变更指令自动归档”为例,用Python调用会博通官方接口,走通完整流程。
(真实接口地址、参数命名均来自官方文档)
4.1 登录获取Token(RSA加密)
会博通登录接口要求对密码进行RSA加密(公钥由会博通提供)。生产环境建议创建专用接口账户,并授予最小权限(至少:上传文件的阅读条目权、阅读权、下载原文权)。
python
复制
下载
import requests
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
import json
# RSA加密函数(使用会博通提供的公钥)
def rsa_encrypt(data, pubkey_str):
key = RSA.import_key(pubkey_str)
cipher = PKCS1_v1_5.new(key)
encrypted = cipher.encrypt(data.encode())
return base64.b64encode(encrypted).decode()
# 登录接口URL
login_url = "https://your-hbt-server.com/MisFrame/SSOLogin.aspx?Action=Login"
# 替换为真实的用户名、密码、RSA公钥
username = "api_robot"
password = "your_password"
pubkey = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
encrypted_pwd = rsa_encrypt(password, pubkey)
payload = {
"UserName": username,
"Psw": encrypted_pwd,
"PCID": "", # 未开启设备绑定则留空
"LoginUser": "" # 接口管理员可借用他人身份,普通场景留空
}
resp = requests.post(login_url, data=payload)
result = resp.json()
if result.get("Id", 0) > 0:
token = result["Token"]
print(f"登录成功,Token: {token[:50]}...")
else:
print(f"登录失败: {result.get('Text')}")
exit(1)
注意:会博通文档明确要求“专户专用”,避免与前端用户共用账号,否则可能因Web登录挤退导致Token失效。
4.2 模拟从OA拉取变更指令(结构化数据)
假设OA系统提供了一个REST API,返回待归档的变更指令列表:
python
复制
下载
oa_url = "https://oa.example.com/api/change-orders?status=approved"
headers_oa = {"Authorization": "Bearer YOUR_OA_TOKEN"}
resp_oa = requests.get(oa_url, headers=headers_oa)
orders = resp_oa.json()["changeOrders"]
4.3 调用会博通“创建文件”接口(以SDK为例)
官方没有直接提供Python SDK,但开放了所有HTTP接口。为了方便演示,我们封装一个简单的 HBTClient,内部使用上面获取的Token。
python
复制
下载
class HBTClient:
def __init__(self, base_url, token):
self.base_url = base_url
self.token = token
def _request(self, method, endpoint, data=None, files=None):
headers = {"Authorization": f"Bearer {self.token}"}
url = f"{self.base_url}/{endpoint.lstrip('/')}"
if method == "GET":
return requests.get(url, headers=headers, params=data)
elif method == "POST":
return requests.post(url, headers=headers, data=data, files=files)
# ... 其他方法
def create_file_entry(self, category_id, subject, author, file_date, tag):
# 调用会博通内部“新建文件”接口(需根据实际文档补充)
# 这里仅为示意,真实接口为 /Module/File/AddFile.aspx 等
pass
def download_file(self, cid, sequence=0, suffix=".pdf", operation="Read"):
"""根据官方下载接口下载文件内容"""
download_url = f"{self.base_url}/Module/ReadFile/FileDownLoad.aspx"
data = {
"CID": cid,
"Sequence": sequence,
"Suffix": suffix,
"Operation": operation # Read 或 Download
}
resp = self._request("POST", download_url, data=data)
return resp.content
真实创建文件条目的接口需要查阅会博通综合知识管理接口文档,本文重点展示文件同步推送与下载流程。
4.4 会博通自动推送元数据,第三方接收
当龟仔上传文件后,会博通服务器自动向你在 SingleUpLoadOtherSystem.json 中配置的 CallBlackUrl 推送元数据。第三方回调接口接收到 PushData 后,可以提取 CatID、Sequence 等信息,存入本地任务队列。
4.5 第三方主动下载文件内容
回调接口收到元数据后,如果需要获取实际文件(PDF/图片等),可以调用下载接口:
python
复制
下载
def download_archive_file(cid, sequence, suffix, token, base_url):
download_url = f"{base_url}/Module/ReadFile/FileDownLoad.aspx"
headers = {"Authorization": f"Bearer {token}"}
data = {
"CID": cid,
"Sequence": sequence,
"Suffix": suffix,
"Operation": "Download" # 或 Read
}
resp = requests.post(download_url, headers=headers, data=data)
if resp.status_code == 200:
return resp.content
else:
raise Exception(f"下载失败: {resp.status_code}")
使用示例:
python
复制
下载
# 假设从回调中拿到 CatID = "12345",Sequence = "0"
file_bytes = download_archive_file("12345", "0", ".pdf", token, base_url)
with open("变更单_001.pdf", "wb") as f:
f.write(file_bytes)
4.6 失败重试:查询失败推送记录
如果因为网络抖动或第三方接口故障导致推送失败,会博通会记录错误,并支持第三方主动查询和自动重推。
查询接口:
text
复制
下载
GET /Expand/OtherSystemMsg/API.aspx?Action=RetryPush&OtherName=第三方平台名称
请求头仍需携带 Authorization: Bearer <Token>。响应示例:
json
复制
下载
{
"Results": 24,
"Messages": "成功获取推送失败记录24条,正在重试推送;",
"Data": null
}
会博通在返回失败记录数量后,会自动重新发起推送,第三方不需要额外操作。
五、龟仔妈妈的角色:非结构化数据的“最后一公里”
你可能会问:纸质签批单、手写变更记录这些非结构化数据怎么走这套API?
龟仔妈妈(数字化智能工作站·旗舰版) 本身就是一台“扫描+上传+回调”一体机。用户把纸质文件放进龟仔妈妈,选择扫描,设备会自动:
- 生成双层PDF(可OCR检索);
- 将文件上传到会博通服务器;
- 会博通服务器按照配置的 CallBlackUrl 推送元数据(含条码识别结果,例如变更单号);
- 第三方系统收到元数据后,根据条码匹配已有的变更指令条目,再调用下载接口把扫描件拉回来,自动挂接。
整个过程无需人工干预,纸质文件扫完即归档。
六、官方API文档与资源
本文所有接口细节均依据 《会博通龟仔系列产品文件同步API接口文档》 撰写。你可以在会博通官网开发者中心获取完整文档(包括RSA公钥、接口完整参数表、错误码说明)。
- 官方开发者中心:https://www.hbotong.com/developer
- 本文配套Python示例代码(模拟回调接收、Token管理、下载重试)已上传GitHub:
https://github.com/huibotong/railway-archive-etl
七、写在最后:别再手动导数据了
很多开发团队一听到“异构系统对接”就头大,以为要写无数个适配器。但会博通这套开放API的设计哲学非常务实:推送轻量元数据,回调确认,主动拉取内容。你只需要实现一个很薄的回调接口,剩下的全是标准HTTP调用。
铁路基建项目的档案验收,不应该成为通宵加班的理由。花一天时间把这条自动化管道搭好,以后每个月的归档工作就是点一下“重试”按钮。
—— 会博通·代码搬运工,基于官方API文档编写
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)