125 lines
6.9 KiB
Python
125 lines
6.9 KiB
Python
#!/bin/python
|
||
#coding: utf-8
|
||
# +-------------------------------------------------------------------
|
||
# | system: django-vue-lyadmin
|
||
# +-------------------------------------------------------------------
|
||
# | Author: lybbn
|
||
# +-------------------------------------------------------------------
|
||
# | QQ: 1042594286
|
||
# +-------------------------------------------------------------------
|
||
# | Email: 1042594286@qq.com
|
||
# +-------------------------------------------------------------------
|
||
# | Version: 1.1
|
||
# +-------------------------------------------------------------------
|
||
# | Date: 2023-12-15
|
||
# +-------------------------------------------------------------------
|
||
|
||
# ------------------------------
|
||
# 快递100快递API接口
|
||
# ------------------------------
|
||
# 官网文档地址:https://api.kuaidi100.com/document/shishichaxunchanpinjieshao
|
||
# ------------------------------
|
||
|
||
import hashlib
|
||
import json
|
||
import requests
|
||
import time
|
||
from config import KUAIDI100_KEY,KUAIDI100_CUSTOMER,KUAIDI100_SECRET
|
||
|
||
class KuaiDi100:
|
||
def __init__(self):
|
||
self.key = KUAIDI100_KEY # TODO 客户授权key
|
||
self.customer = KUAIDI100_CUSTOMER #customer
|
||
self.secret = KUAIDI100_SECRET #secret
|
||
|
||
#公共请求
|
||
def do_request(self,url="", key=None, secret=None, method="", t="", param={}):
|
||
if not key:
|
||
key = self.key
|
||
if not secret:
|
||
secret = self.secret
|
||
md = hashlib.md5()
|
||
md.update((param + t + key + secret).encode())
|
||
sign = md.hexdigest().upper()
|
||
payload = {
|
||
'key': key,
|
||
'method': method,
|
||
't': t,
|
||
'param': param,
|
||
'sign': sign
|
||
}
|
||
return requests.post(url, payload).text
|
||
|
||
def track(self, com="", num="",phone="",ship_from="",ship_to="",resultv2='0',show = '0',order = 'desc'):
|
||
"""
|
||
物流轨迹实时查询
|
||
:param com: 查询的快递公司的编码,一律用小写字母
|
||
:param num: 查询的快递单号,单号的最大长度是32个字符
|
||
:param phone: 收件人或寄件人的手机号或固话(也可以填写后四位,如果是固话,请不要上传分机号)
|
||
:param ship_from: 出发地城市,省-市-区,非必填,填了有助于提升签收状态的判断的准确率,请尽量提供
|
||
:param ship_to: 目的地城市,省-市-区,非必填,填了有助于提升签收状态的判断的准确率,且到达目的地后会加大监控频率,请尽量提供
|
||
:return: requests.Response.text
|
||
https://api.kuaidi100.com/document/5f0ffb5ebc8da837cbd8aefc
|
||
"""
|
||
url = 'https://poll.kuaidi100.com/poll/query.do' # 请求地址
|
||
param = {
|
||
'com': com,
|
||
'num': num,
|
||
'phone': phone,
|
||
'from': ship_from,
|
||
'to': ship_to,
|
||
'resultv2': resultv2, # 添加此字段表示开通行政区域解析功能。0:关闭(默认),1:开通行政区域解析功能,2:开通行政解析功能并且返回出发、目的及当前城市信息
|
||
'show': show, # 返回数据格式。0:json(默认),1:xml,2:html,3:text
|
||
'order': order # 返回结果排序方式。desc:降序(默认),asc:升序
|
||
}
|
||
param_str = json.dumps(param) # 转json字符串
|
||
|
||
# 签名加密, 用于验证身份, 按param + key + customer 的顺序进行MD5加密(注意加密后字符串要转大写), 不需要“+”号
|
||
temp_sign = param_str + self.key + self.customer
|
||
md = hashlib.md5()
|
||
md.update(temp_sign.encode())
|
||
sign = md.hexdigest().upper()
|
||
request_data = {'customer': self.customer, 'param': param_str, 'sign': sign}
|
||
return requests.post(url, request_data).text # 发送请求
|
||
|
||
def eorder_create(self,printType='NON',tempId="",kuaidicom="",cargo="文件",count=1,recMan={},sendMan={},siid="",remark="",needChild=0,partnerId="",partnerKey="",partnerSecret="",partnerName="",net=""):
|
||
"""
|
||
电子面单下单接口V2
|
||
partnerId:电子面单客户账户或月结账号,需贵司向当地快递公司网点申请(参考电子面单申请指南); 是否必填该属性,请查看https://api.kuaidi100.com/document/5f0ff6e82977d50a94e10237.html
|
||
partnerKey:电子面单密码,需贵司向当地快递公司网点申请; 是否必填该属性,请查看如上链接
|
||
printType:打印类型,NON:只下单不打印(默认); IMAGE:生成图片短链;HTML:生成html短链; CLOUD:使用快递100云打印机打印,使用CLOUD时siid必填
|
||
tempId:主单模板,通过快递100管理后台的[快递公司模板V2]信息获取
|
||
kuaidicom:快递公司的编码,一律用小写字母,请查看https://api.kuaidi100.com/document/5f0ff6e82977d50a94e10237.html
|
||
cargo:物品名称,例:文件
|
||
needChild:是否需要子单: 1:需要 0:不需要(默认) 如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号); needChild = 1、count 需要大于1,如count = 2 一个主单 一个子单,count = 3 一个主单 二个子单,返回的子单号码见返回结果的childNum字段
|
||
count:包裹总数量。该属性与子单有关,如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号),needChild = 1、count 需要大于1,如count = 2 则一个主单 一个子单,count = 3则一个主单 二个子单;返回的子单号码见返回结果的childNum字段
|
||
recMan:收件人信息{"name": "张三","mobile": "13888888888","printAddr": "广东深圳市南山区金蝶软件园","company": ""}
|
||
sendMan:寄件人信息{"name": "李四","mobile": "13888888888","printAddr": "广东深圳市南山区金蝶软件园","company": ""}
|
||
siid:打印设备,通过打印机输出的设备码进行获取,printType为CLOUD时必填
|
||
remark:备注
|
||
https://api.kuaidi100.com/document/dianzimiandanV2
|
||
"""
|
||
url = 'https://api.kuaidi100.com/label/order' # 请求地址
|
||
method = 'order'#业务类型(默认:order)
|
||
|
||
param = {
|
||
"partnerId": partnerId,
|
||
"partnerKey": partnerKey,
|
||
"code": "",
|
||
"printType":printType,
|
||
"tempId":tempId,
|
||
"kuaidicom":kuaidicom,
|
||
"count":count,
|
||
"cargo":cargo,
|
||
"recMan":recMan,
|
||
"sendMan":sendMan,
|
||
"siid":siid,
|
||
"remark":remark
|
||
}
|
||
t = str(int(round(time.time() * 1000)))
|
||
result = self.do_request(url=url, method = method, t = t, param=json.dumps(param))
|
||
return result
|
||
|
||
#查询示例
|
||
# result = KuaiDi100().track(com = 'yuantong', num = 'YT9693083639795')
|
||
# print(result) |