前言
基于个人需求,因为公司客户常用的【船公司】为
- 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']
        if eta in statusNm:
            print(
 
                   
                   
                   
                   最低0.47元/天 解锁文章
最低0.47元/天 解锁文章
                           
                       
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
                     
              
             
                   1175
					1175
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
					 
					 
					


 
            