python实现查物流快递鸟接口(通用接口)

import requests
import base64
import hashlib
import json


def get_logistics_info(number, code):

def get_dataSign(req_data, appKey):
md5 = hashlib.md5()
md5.update(req_data.encode('utf-8'))
md5.update(appKey.encode('utf-8'))
return base64.b64encode(md5.hexdigest().encode('utf-8'))

api_key = '9fae1305-3f0c-4d91-8312-**********' # 需要注册完获取
user_id = 13***** # 快递鸟的用户ID需要注册完获取
order_num = number # 运单编号
ShipperCode = code # 快递公司编码,这个是圆通的
url = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx'
order_data = {
"ShipperCode": ShipperCode,
"LogisticCode": order_num,
}

data = {
"RequestData": json.dumps(order_data).encode('utf-8'),
"EBusinessID": user_id,
"RequestType": 1002,
"DataSign": get_dataSign(json.dumps(order_data), api_key),
}

headers = {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36",
}

response = requests.post(url=url, data=data, headers=headers)
return response.content.decode('utf-8')
ret = get_logistics_info('YT9776941986622','YTO')
print(ret)
#快递公司编码:
常用    顺丰速运    SF
    百世快递    HTKY
    中通快递    ZTO
    申通快递    STO
    圆通速递    YTO
    韵达速递    YD
    邮政快递包裹    YZPY
    EMS    EMS
    天天快递    HHTT
    京东快递    JD
    优速快递    UC
    德邦快递    DBL
    宅急送    ZJS

 本接口不完美的地方就是收费

代码解释:

快递鸟文档说明:

1请求系统级参数说明:

RequestData(必须):请求内容需进行URL(utf-8)编码。请求内容JSON格式,须和DataType一致。

解说:上面的参数大概意思是说:你要请求的内容肯定是快递单号,和快递公司,并且请求的内容必须是json格式,所以:

oerse_num = 73171960508210
ShipperCode = YTO
order_data = {
    "ShipperCode":ShipperCode,
    "LogisticCode": order_num,
}
data = {
    "RequestData":json.dumps(order_data).encode('utf-8'),
}

 

2EBusinessID(必须):商户ID

这个没啥可说的,每个账号都有一个商户ID

3RequestType(必须):请求指令类型:

本例中用的是1002:即开通账户一个月内可免费使用,一个月后关闭测试权限,快递鸟查询物流是收费的,收费的请求指令是8001或8002(此内容是在快递鸟官方对接人给的pdf文档中找到的)

4DataSign(必须):数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后 进行URL(utf-8)编码

#把(请求内容(未编码)+AppKey)进行MD5加密
md5 = hsahlib.md5()
md5.update(req_data.encode('utf-8'))
md5.update(appKey.encode('utf-8'))
然后Base64编码
base64.b64encode(md5.hexdigest())
最后进行utf-8编码
base64.b64encode(md5.hexdigest().encode('utf-8'))

5DataType请求返回数据类型(可选)

posted @ 2021-11-21 16:59  linuxTang  阅读(492)  评论(0)    收藏  举报