嘿,鱼油!你这代码要找规律不容易,但正如咱们平时寄快递,每个包裹都有独特编码是一回事。我们需要解锁这个查物流信息的套路,看到`KDQUERY`字段后面那块字符,不一定是从网页源代码解析出来,而可能是某种动态生成规则。我们来尝试推测一下规律。
从你提供的几个 `query_id` 样例中发现:
1. 都以 `KDQUERY`开头。
2. 后面跟着一串数字。
3. 这些数字似乎是时间和随机数的结合。
从以下样本数据:KDQUERY1720167631718 查询时间 2024/07/05 16:20
KDQUERY1720167694333 查询时间 2024/07/05 16:21
KDQUERY1720167806456 查询时间 2024/07/05 16:23
KDQUERY1720167856116 查询时间 2024/07/05 16:24
KDQUERY1720167857068 查询时间 2024/07/05 16:24
KDQUERY1720167899105 查询时间 2024/07/05 16:24
我们可以推测出 `query_id` 的生成可能涉及如下几部分:
- 固定前缀 `KDQUERY`
- 时间戳的一部分
- 一些随机数
让我们基于这个来改进 `generate_query_id` 函数。我们假设后面的数字使用当前时间戳,并附加一段随机数,用来模仿这个生成模式:
import logging
import time
import random
from fake_useragent import UserAgent
import json
import requests
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
def generate_query_id():
# 获取当前时间戳
timestamp = int(time.time() * 1000) # 以毫秒为单位获取当前时间戳
# 转换成字符串并截取一部分作为时间编码(模拟原有模式)
custom_time_code = str(timestamp)[-10:] # 取时间戳的最后10位
# 生成随机序列号
sequence_number = str(random.randint(1000, 9999)) # 生成4位数的随机序列号
# 拼接查询编号
query_id = f"KDQUERY{custom_time_code}{sequence_number}"
return query_id
def get_express_type(exp_name):
exp_dic = {
"申通": "shentong",
"圆通": "yuantong",
"韵达": "yunda",
"百世": "huitongkuaidi",
"优速": "youshuwuliu",
"中通": "zhongtong",
"EMS": "ems",
"顺丰": "shunfeng",
"天天": "tiantian",
"宅急送": "zhaijisong",
"中国邮政": "youzhengguonei",
"全峰": "quanfengkuaidi",
"速尔": "suer",
"国通": "guotongkuaidi"
}
return exp_dic[exp_name]
# 快递查询
def express_query(exp_name, exp_number):
headers = {
"User-Agent": UserAgent().random,
"Referer": "https://www.kuaidi.com/"
}
# 生成查询 URL
query_id = generate_query_id()
query_url = f"https://www.kuaidi.com/index-ajaxselectcourierinfo-{exp_number}-{get_express_type(exp_name)}-{query_id}.html"
print(query_url)
response = requests.post(query_url, headers=headers)
j_text = json.loads(response.text)
if j_text and 'data' in j_text:
tracking_records = j_text['data']
for record in tracking_records:
print(f"{record['time']}: {record['context']}")
else:
print('未找到物流信息')
if __name__ == "__main__":
exp_name = "圆通"
exp_number = 'YT1870762630265'
express_query(exp_name, exp_number)
**解释代码:**
1. `generate_query_id`:获取毫秒级时间戳,取其最后10位数字,再拼接一个4位的随机数,组成新的 `query_id`。
2. `get_express_type`:从名称返回对应的快递公司类型。
3. `express_query`:新的 URL 模板和请求逻辑。
希望对你有所帮助,伙计!试试看新的 `generate_query_id` 函数是否能生成有效的查询 ID,如果还有疑惑,咱再一起研究!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |