test(hjc): 一站式入向推送测试脚本(POST /api/hjc/push/project,appKey+timestamp+sign 鉴权)
This commit is contained in:
@@ -0,0 +1,101 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
汇吉采 <-- 一站式:推送标书项目测试脚本(入向 POST /api/hjc/push/project)
|
||||||
|
|
||||||
|
用法:
|
||||||
|
python hjc_test_push.py # 默认 http://uk.frp.one:62335
|
||||||
|
python hjc_test_push.py http://uk.frp.one:62335
|
||||||
|
python hjc_test_push.py --base http://uk.frp.one:62335 --project-no TEST-xxx
|
||||||
|
|
||||||
|
无第三方依赖,仅标准库(hashlib + urllib)。时间用北京时间(UTC+8)。
|
||||||
|
签名 sign = MD5(appKey + password + timestamp),timestamp = yyyyMMddHHmm。
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import hashlib
|
||||||
|
import urllib.request
|
||||||
|
import urllib.error
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
APP_KEY = "HJC_Official_Website"
|
||||||
|
PASSWORD = "vQ8$kR3#mW6@xP2!nF"
|
||||||
|
DEFAULT_BASE = "http://uk.frp.one:62335"
|
||||||
|
|
||||||
|
DEFAULT_PAYLOAD = {
|
||||||
|
"projectNo": "TEST-HJC-20260801",
|
||||||
|
"projectName": "测试标书项目·服务器采购",
|
||||||
|
"category": "货物类",
|
||||||
|
"tenderPrice": 500.00,
|
||||||
|
"files": "[{\"name\":\"招标文件.pdf\",\"url\":\"https://file.example.com/t.pdf\"}]",
|
||||||
|
"tenderOnsaleTime": "2026-08-01 09:00:00",
|
||||||
|
"tenderOffsaleTime": "2026-08-10 17:00:00",
|
||||||
|
"bulletinName": "中标公告-测试",
|
||||||
|
"customerName": "某招标单位",
|
||||||
|
"supplierName": "某中标公司",
|
||||||
|
"bidAmount": 128000.00,
|
||||||
|
"content": "测试公告正文。中标供应商:某中标公司,中标金额 128000 元。",
|
||||||
|
"fileList": "[{\"name\":\"中标通知书.pdf\",\"url\":\"https://file.example.com/n.pdf\"}]",
|
||||||
|
"needSellTender": 1,
|
||||||
|
"sellingMethod": 2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def bj_now() -> str:
|
||||||
|
"""北京时间 yyyyMMddHHmm"""
|
||||||
|
return (datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=8)).strftime("%Y%m%d%H%M")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
base = DEFAULT_BASE
|
||||||
|
payload = dict(DEFAULT_PAYLOAD)
|
||||||
|
args = sys.argv[1:]
|
||||||
|
i = 0
|
||||||
|
while i < len(args):
|
||||||
|
a = args[i]
|
||||||
|
if a in ("--base", "-b"):
|
||||||
|
base = args[i + 1]
|
||||||
|
i += 2
|
||||||
|
elif a in ("--project-no", "-p"):
|
||||||
|
payload["projectNo"] = args[i + 1]
|
||||||
|
i += 2
|
||||||
|
elif a == "--json":
|
||||||
|
with open(args[i + 1], encoding="utf-8") as f:
|
||||||
|
payload = json.load(f)
|
||||||
|
i += 2
|
||||||
|
else:
|
||||||
|
base = a # 位置参数作为 baseUrl
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
url = base.rstrip("/") + "/api/hjc/push/project"
|
||||||
|
ts = bj_now()
|
||||||
|
sign = hashlib.md5((APP_KEY + PASSWORD + ts).encode("utf-8")).hexdigest()
|
||||||
|
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
|
||||||
|
|
||||||
|
req = urllib.request.Request(url, data=body, method="POST", headers={
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"appKey": APP_KEY,
|
||||||
|
"timestamp": ts,
|
||||||
|
"sign": sign,
|
||||||
|
"tenantId": "10626"
|
||||||
|
})
|
||||||
|
|
||||||
|
print("== 请求 ==")
|
||||||
|
print("URL:", url)
|
||||||
|
print("timestamp:", ts, "| sign:", sign)
|
||||||
|
print("body:", body.decode("utf-8"))
|
||||||
|
print()
|
||||||
|
print("== 响应 ==")
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(req, timeout=20) as resp:
|
||||||
|
print("HTTP", resp.status)
|
||||||
|
print(resp.read().decode("utf-8"))
|
||||||
|
except urllib.error.HTTPError as e:
|
||||||
|
print("HTTP", e.code)
|
||||||
|
print(e.read().decode("utf-8"))
|
||||||
|
except Exception as e:
|
||||||
|
print("ERROR:", type(e).__name__, e)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user