脚本如何解析快递单号

wen 实用脚本 24

本文目录导读:

脚本如何解析快递单号

  1. 方式一:基于正则表达式规则(本地判断 + 查询)
  2. 方式二:调用第三方API自动识别(推荐)
  3. 方式三:配合手机号查询(准确率最高)
  4. 脚本如何处理异常情况?
  5. 推荐方案

解析快递单号的核心在于根据单号的格式特征(长度、数字/字母组合、开头规律)判断快递公司,然后调用对应公司的查询API(如快递100、阿里云市场、顺丰API等)来获取物流信息。

以下是几种常见的解析与查询方式,以及对应的脚本逻辑(以Python为例):

基于正则表达式规则(本地判断 + 查询)

这是最常见的方式,脚本内部维护一个“单号-快递公司”的映射规则(正则表达式),不需要联网即可识别单号属于哪家快递。

常用快递单号规则(部分示例)

快递公司 常见格式(数字/字母) 长度
顺丰 12位纯数字(常见)或 10位字母+数字 12/13/15/17
中通 12位纯数字(开头通常为 7, 8, 2等) 12
圆通 10位、12位纯数字(开头为 0-9 或字母 D,Y等) 10/12/15
韵达 13位纯数字(开头为 1, 2, 3, 4, 5, 6, 8, 9等) 13
极兔 12位纯数字(开头为 1, 2, 3, 4 或字母 JT等) 12
邮政/EMS 13位字母+数字(通常以字母开头,如EA、LY等) 13
京东 10或12位纯数字(开头为 JD, JDX等) 10/12

Python 示例脚本

import re
# 定义单号规则字典 (正则表达式)
SHIPPING_RULES = {
    '顺丰': r'^[0-9]{12}$',         # 简化版,实际需要更复杂逻辑区分顺丰特惠
    '中通': r'^[0-9]{12}$',         # 结合开头数字判断
    '圆通': r'^(D|Y|0|1|2|3|4|5|6|7|8|9)[0-9]{9,14}$',
    '韵达': r'^[0-9]{13}$',
    '极兔': r'^(JT|1|2|3|4)[0-9]{10,11}$',
    '邮政EMS': r'^[A-Z]{2}[0-9]{9}[A-Z]{2}$',  # 如 EA123456789CN
    '京东': r'^(JD|JDX)[0-9]{9,11}$',
}
def identify_courier(tracking_number):
    """
    根据单号格式识别快递公司
    """
    for courier, pattern in SHIPPING_RULES.items():
        if re.match(pattern, tracking_number.upper()):  # 转为大写匹配
            return courier
    return "未知快递"
def query_tracking(tracking_number):
    """
    查询物流信息(此处为调用第三方API的占位)
    """
    courier = identify_courier(tracking_number)
    if courier == "未知快递":
        return {"error": "无法识别快递公司"}
    # 调用快递100或阿里云接口的代码 (需要API Key)
    # api_url = f"https://api.kuaidi100.com/query?type={courier}&postid={tracking_number}"
    # response = requests.get(api_url, params={"key": YOUR_API_KEY})
    return {"tracking_number": tracking_number, "courier": courier, "status": "待查询"}
# 测试
print(identify_courier("SF1234567890"))  # 假设顺丰规则返回
print(identify_courier("YT1234567890"))  # 圆通

注意:单号规则经常更新,如顺丰出现17位单号、极兔使用新字母开头,需定期维护规则库,或直接调用第三方识别API。

调用第三方API自动识别(推荐)

为了避免本地规则过时,最好的办法是直接使用成熟API,你只需传入单号,API会自动判断快递公司并返回物流轨迹。

常用API服务商:

  1. 快递100https://api.kuaidi100.com/(提供 auto 参数,自动识别单号对应的快递公司)
  2. 阿里云市场:搜索“快递物流查询”,有按次付费的接口
  3. 聚合数据 / 极速数据:也提供类似服务

Python 示例(快递100 自动识别)

import requests
def query_tracking_auto(tracking_number):
    """
    调用快递100 API自动识别单号并查询
    """
    api_key = "你的快递100企业版API Key"
    customer = "你的customer参数"
    # 构造加密签名 (快递100要求)
    import hashlib
    temp_str = f"{api_key}{tracking_number}{customer}"
    sign = hashlib.md5(temp_str.encode('utf-8')).hexdigest()
    url = "https://api.kuaidi100.com/poll/query.do"
    params = {
        "customer": customer,
        "sign": sign,
        "param": {
            "com": "auto",     # 关键点:com设为auto,系统自动识别
            "num": tracking_number,
            "phone": ""        # 顺丰等可能需要手机号后四位
        }
    }
    try:
        response = requests.post(url, json=params, timeout=10)
        return response.json()
    except Exception as e:
        return {"error": str(e)}
# 测试
result = query_tracking_auto("SF1234567890")
print(result)

配合手机号查询(准确率最高)

对于顺丰、京东、菜鸟裹裹等平台,单号本身可能重复或规则模糊,此时可以:

  1. 让用户输入手机号(末四位)
  2. 调用API时加上手机号参数
  3. 脚本会自动匹配该手机号关联的运单
# 快递100支持phone参数
param = {
    "com": "auto",
    "num": "1234567890",
    "phone": "1234"  # 收件人手机号末四位
}

脚本如何处理异常情况?

  1. 单号规则模糊(如中通和韵达都是纯数字):建议使用“前缀匹配 + 长度”混合逻辑,或直接交给自动API。
  2. 查询失败:返回给用户提示“单号不存在或已过期”,并建议检查是否输错。
  3. 并发请求:在高级脚本中可以使用异步(asyncio)批量查询多个单号,避免阻塞。

推荐方案

  • 高准确率:快递100/阿里云 auto 接口 + 手机号验证(适合商业应用)
  • 零成本:本地正则规则 + 爬取(不推荐,容易被封IP且规则频繁失效)
  • 简单示例:用 re 模块匹配长度和开头,然后拼接查询链接(如 https://m.kuaidi100.com/result.jsp?nu=单号 跳转到网页查看,不适合程序化解析)

对于一般开发者来说,接入快递100或阿里云的自动识别API是投入产出比最高的方式

抱歉,评论功能暂时关闭!