前言
基于个人需求,因为公司客户常用的【船公司】为
- COSCO | ZIM | MSK | MSC | ONE | PIL
- OOCL | CMA | HPL 等…
所有集装箱物流信息都可以在对应船司网站上面查询,但每次需要打开网页去查询,且无法进行批量查询,对于我来说,效率很低;为了未来能够解放双手,实现最新物流信息自动填充excel;
第一步把查询物流相关接口都封装了一遍;
- 其中已经实现查询功能的 :COSCO | ZIM | MSK | MSC | ONE | PIL
- 由于加密无法破解 or 需要跳过安全验证 暂未实现 : OOCL | CMA | HPL
- 如果有大佬能实现这部分,请分享给我;
ps:所有功能我都写在一个脚本里,所以下面描述的话,我会以船公司来划分不同代码;
另外随着deepseek的崛起,我觉得它确实是一个很好用的tool,用来进行基础代码的询问(例如:日期转换)下指令后的代码都可以直接copy;
但是涉及到复杂或者解密之类的,还是需要自己逐一test & 排查;
就这点代码花了我工作之余的2天时间… - -!
一、MSK船司物流信息查询
# -*- codeing = utf-8 -*-
# @time: 2025/2/4 16:32
# @Author : Mikasa
import json
import time
from datetime import datetime
import requests
from bs4 import BeautifulSoup
def get_MSK_tracking_info(tracking_number):
"""
查询MSK船司物流信息
:param tracking_number:提单号
:return:
"""
url = "https://api.maersk.com.cn/synergy/tracking/" + tracking_number
params = {
"operator": "MAEU"}
headers = {
"consumer-key": "UtMm6JCDcGTnMGErNGvS2B98kt1Wl25H", # 关键认证头 必传
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36"
}
try:
response = requests.get(url, params=params, headers=headers, timeout=10)
result_json = response.json()
print("===========================================")
print("MSK船信息:", result_json)
return result_json
except requests.exceptions.RequestException as e:
print(f"请求失败: {
e}")
except json.JSONDecodeError:
print("响应不是有效的 JSON 格式")
def get_MSK_related_time(tracking_number):
"""
获取MSK船期时间
:param tracking_number:
:return:
"""
result = get_MSK_tracking_info(tracking_number)
location_list = result['containers'][0]['locations']
index = len(location_list) - 1
ETA = location_list[index]['events'][0]['expected_time']
new_ETA_fomat = deal_MSK_eta_time_format(ETA)
print("------------------------------------------")
print(f"提单号【{
tracking_number}】船期信息如下:")
print(f"预计到港时间:{
new_ETA_fomat}")
def deal_MSK_eta_time_format(date):
"""
处理MSK船司预期时间格式
:param date:
:return:
"""
dt = datetime.strptime(date, "%Y-%m-%dT%H:%M:%S.%f")
formatted_str = dt.strftime("%Y/%#m/%#d %H:%M:%S")
return formatted_str
if __name__ == "__main__":
# 2、MSC船司信息查询 - 实现提单/预约号查询
bill_of_lading = "MEDUQW932543"
arrival_time = get_MSC_related_time(bill_of_lading)
二、ONE船司物流信息查询
def get_ONE_tracking_info_by_bill_number(bill_number):
"""
根据提单号查询ONE物流信息
:param bill_number:
:return:
"""
str = "ONEY"
if str in bill_number:
bill_number = bill_number.replace("ONEY", "")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
url = "https://ecomm.one-line.com/ecom/CUP_HOM_3301GS.do?" \
"sord=asc" \
"&f_cmd=121" \
"&search_type=B" \
f"&search_name={
bill_number}"
response = requests.get(url, headers=headers)
result = response.json()
print("BL_response:", result)
return result
def get_ONE_tracking_info(bill_number):
"""
查询ONE船司物流信息
:param tracking_number:
:return:
"""
result = get_ONE_tracking_info_by_bill_number(bill_number)
container_list = result['list'][0] # 默认取第一个集装箱
container_number = container_list['cntrNo']
cop_no = container_list['copNo']
bkg_no = container_list['bkgNo']
url = "https://ecomm.one-line.com/ecom/CUP_HOM_3301GS.do"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
payload = {
"f_cmd": "125",
"cntr_no": container_number,
"bkg_no": bkg_no,
"cop_no": cop_no
}
response = requests.post(url, headers=headers, data=payload)
if response.status_code == 200:
data = response.json()
print("===========================================")
print("ONE船信息:", response.json())
return data
def get_ONE_related_time(bill_number):
"""
查询ONE船期时间
:param bill_number:
:return:
"""
data = get_ONE_tracking_info(bill_number)
track_info_list = data['list']
eta = "Arrival at Port of Discharging"
actual_pod = "POD Berthing Destination"
discharge_cargo = "Port of Discharging"
print("------------------------------------------")
print(f"提单号【{
bill_number}】船期信息如下:")
for track_info in track_info_list:
statusNm = track_info['statusNm']