Python(十八)实现各大跨境船公司[COSCO/ZIM/MSK/MSC/ONE/PIL]的物流信息查询

前言

基于个人需求,因为公司客户常用的【船公司】为

  • 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']
       
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M1kasal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值