一、媒介
之前已经实现了常用 跨境物流船司 根本信息查询功能,如下所示
- 实现各大跨境船公司[COSCO/ZIM/MSK/MSC/ONE/PIL]的物流信息查询:
- https://blog.csdn.net/Makasa/article/details/145484999?spm=1001.2014.3001.5501
<hr> 然后本章在其根本上做了一些优化,以及新增之前未实现的功能
1)实现【提单号】单个主动分配查询船司信息
- 方法:assign_shipper(bill_number)
2)实现【提单号】批量查询
- 方法:search_tracking_info_by_list(bl_list)
3)获取最新【ETA(预计到港时间)】时间并主动写入excel
- 方法:get_latest_eta_time_and_insert_excel()
会在原有excel文件中原【ETA】列后添加一行,再将新的【ETA】填写进去
不直接更换缘故起因便于对比;
4)主动将船司查询到的信息按规定表头写入excel表格【单条】
- insert_ship_detail_to_excel(“NGZN50041300”)
- 留意:表头格式我这边按现实需求限定死了,可以按你们自己需求举行更改
5)批量将船司查询到的信息按规定表头写入excel表格【list】
- insert_ship_detail_list_to_excel(bl_list) # 批量插入数excel数据
<hr> 将来需优化:
- 1)PIL船司返回的前端,分析如今还存在一点题目,须要兼容各种返回环境的产生;
如今默认只分析拿到第一个集装箱的数据;
- 2)ZIM接口不稳固,需排盘题目
- 3)OOCL / CMA /HPL 加密 实验找方法破解
<hr> <hr> 二、代码实现
- 上篇blog已经实现了根本查询功能,按船司分开写的,这里我就差别一分开了,直接贴整个代码
- # -*- codeing = utf-8 -*-
- # @time: 2025/2/12 14:26
- # @Author : Mikasa
- import json
- import time
- from datetime import datetime
- import pandas as pd
- import requests
- from bs4 import BeautifulSoup
- from pathlib import Path
- 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']
- target_terminal = "APAPA PORT"
- index = 0
- for i, location in enumerate(location_list):
- if location["terminal"] == target_terminal:
- index = i # 拿到目的地为apapa PORT的数据的index
- break
- # todo : 246217454 这个已经到港并且已经完结的提单没有expected_time属性
- # todo :248440101 未到港,就存在expected_time属性
- ship_info = location_list[index]['events'][0]
- event_time_type = ship_info['event_time_type']
- if event_time_type == "EXPECTED":
- # 提单还未到港
- ETA = ship_info['expected_time']
- elif event_time_type == "ACTUAL":
- # 提单已到港,拿真实时间
- ETA = ship_info['actual_time']
- new_ETA_fomat = deal_MSK_eta_time_format(ETA)
- print("------------------------------------------")
- print(f"提单号【{
-
- tracking_number}】船期信息如下:")
- print(f"预计到港时间:{
-
- new_ETA_fomat}")
- return 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
- 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(f"预期到港时间:", track_info['eventDt'])
- elif actual_pod in statusNm:
- print(f"实际抵达卸货港时间:", track_info['eventDt'])
- elif discharge_cargo in statusNm:
- print(f"实际卸货时间:", track_info['eventDt'])
- return track_info['eventDt'] # 直接返回的最新一套信息的时间
- def get_PIL_cookie():
- """
- 获取PIL的cookie
- :return:
- """
- # 生成北京当前时间戳 单位为ms
- timestamp_ms = int(time.time() * 1000)
- url = "https://www.pilship.com/wp-content/themes/hello-theme-child-master/pil-api/common/get-n.php?timestamp=" + str(
- timestamp_ms)
- 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",
- "Referer": "https://www.pilship.com/digital-solutions/?tab=customer&id=track-trace&label=containerTandT&module=TrackTraceBL&refNo=NGRI50097000"
- }
- response = requests.get(url, headers=headers)
- return response
- def get_PIL_tracking_info_by_bill_number(bill_number):
- """
- 根据提单号查询PIL物流信息
- :param bill_number:
- :return:
- """
- response = get_PIL_cookie() # 拿到n
- n = response.json()['n']
- timestamp = str(int(time.time() * 1000))
- referer = "https://www.pilship.com/digital-solutions/?tab=customer&id=track-trace&label=containerTandT&module=TrackTraceBL&refNo=" + bill_number
- 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",
- 'referer': referer,
- 'X-Requested-With': "XMLHttpRequest",
- 'cookie': "CookieConsent={stamp:%27LUQ2eOuWASANePCHNSXS2yeSAiOmJoQhXm7pEbeVpMEr7kRRRhczfw==%27%2Cnecessary:true%2Cpreferences:true%2Cstatistics:true%2Cmarketing:true%2Cmethod:%27explicit%27%2Cver:1%2Cutc:1734771385816%2Cregion:%27ng%27}; _ga=GA1.1.1137581632.1734770854; pil_session_cookie=!WFtN5njOPpQS1hf8xTD27kmUREcR4A5xQFGbSdeZWh6xne7uf6cynXyQzICRX7DAVtXpZHsVQFbXaA==; wp-wpml_current_language=en; TSPD_101=08c4718e7dab2800c57f82cee5e846814246783a4ea9308f585af084e53e57c851f4d7af7507b6ba01b43d68d07a6fc9084f292334051800b0bdc60b7433c56f989c7ca0dcd64b787093688cd95badc6; TS00000000076=08c4718e7dab28007707032a2a3c087717436b105e0ea27086f21be845e6238e426c659eed97e9faac24d9498ea8e2f90825bede2809d000f4ff876b60b5d60819d6e9be3e6f3d6f2d0ad9cc544d6ba809938284a1f852c824efa411a4094ef683ea56f2d383a67379539aa5b28a9a52823dde83af710cc1065a8cb738359c2102062f1f41799313cc887fe2f7f84015edf73a4443f90343838461044c8dbccae6660ca3322e787bb229d3ae25557ce32af1669c3ddeb451eb967fe99ac32cc0ef550af1567da52efbed7d17b811159ef5b40416eb7178abca86b4f273868b80aee1cd0ab7a38515f98e7b91baf133b22894982a220077e68b7c314d8ca5c0f89a4bbc55a09b538e; TSPD_101_DID=08c4718e7dab28007707032a2a3c087717436b105e0ea27086f21be845e6238e426c659eed97e9faac24d9498ea8e2f90825bede28063800dd525af8f96ac9cff1388ccc906e36023328029cfae4893759356223de54c62e94a0c306a33859e46108198cac5061a89c8fa7c14267e4fc; TS7ff733e9077=08c4718e7dab280085f60f04ba264a2e0ac0875b36b59c53defab055f5fea0c7c7ce7b40ed9afcf756781ecc450e1b470807626b7517200050d650fcfa6773405f5a17954cff4628d908f416f4234200dbaa3cc3ec46b52a; _ga_M39J8YZNDE=GS1.1.1738786704.56.0.1738786704.0.0.0; TS015cd57e=011698f8e78ca3bc42cad4dd0e721fdcb048e98d12c3529eecbcc961ce0855aa8b6eef2788cf1b3cc8bbe190c65fcf3d0666de4efd377ed9d22d0f951ed126bf67a554e95c; TS7ff733e9029=08c4718e7dab2800e6a5d0f6faeca1dc19685dfff567b4dd1369f1b4b696f84893905e24cb58bc50ffb1a716a0e029fa; TS97a2723b027=08c4718e7dab2000fd4b11416d6e7e1c3da097165f9bd7b084e973e022fa2ec9d671050f9f2f2966081a278b7c1130004fb6fbf91b1d6cb4cd98e6bcb7bd8410d5bed0a0f4b4e1e764e4f4d75f4d5666b6a1bb124f33758104b457ee4acaf2c2"
- }
- # 否则根据提单号查询
- url = f"https://www.pilship.com/wp-content/themes/hello-theme-child-master/pil-api/trackntrace-containertnt.php?" \
- f"module=TrackTraceBL" \
- f"&refNo={
-
- bill_number}" \
- f"&n={
-
- n}" \
- f"×tamp={
-
- timestamp}"
- response = requests.get(url, headers=headers)
- print("url:", response.url) # 查看最终请求的 URL
- if response.status_code == 200:
- response_json = json.loads(response.text)
- result_json = analysis_PIL_response_by_bill_number(response_json) # 解析
- return result_json
- else:
- print("通过【提单号】查询PIL船司信息失败")
- def get_PIL_tracking_info(bill_number):
- """
- 查询PIL船公司物流信息(完整工作流)
- - 包含动态Token获取和Cookie管理
- - 必传校验:n | 经过多次测试,发现cookie只穿
- """
- response = get_PIL_cookie() # 拿到n
- n = response.json
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |