You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
10 KiB
307 lines
10 KiB
1 week ago
|
import requests
|
||
|
import csv
|
||
|
import random
|
||
|
import uuid
|
||
|
from datetime import datetime
|
||
|
import json
|
||
|
|
||
|
class EventSimulator:
|
||
|
def __init__(self, csv_file_path, api_url):
|
||
|
self.csv_file_path = csv_file_path
|
||
|
self.api_url = api_url
|
||
|
self.categories = self.load_categories()
|
||
|
|
||
|
def load_categories(self):
|
||
|
"""从CSV文件加载分类数据"""
|
||
|
categories = []
|
||
|
with open(self.csv_file_path, 'r', encoding='utf-8') as file:
|
||
|
reader = csv.DictReader(file)
|
||
|
for row in reader:
|
||
|
categories.append({
|
||
|
'category_id': row['category_id'],
|
||
|
'category_name': row['name']
|
||
|
})
|
||
|
return categories
|
||
|
|
||
|
def get_random_category(self):
|
||
|
"""随机获取一个分类"""
|
||
|
return random.choice(self.categories)
|
||
|
|
||
|
def generate_timestamp(self):
|
||
|
"""生成当前时间戳"""
|
||
|
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
|
|
||
|
def generate_device_info(self):
|
||
|
"""生成设备信息"""
|
||
|
devices = ["ios", "android", "web"]
|
||
|
return {
|
||
|
"user_id": random.randint(1, 999999),
|
||
|
"device_id": random.choice(devices),
|
||
|
"version": f"{random.randint(1000000000000, 9999999999999)}-{uuid.uuid4().hex[:8]}",
|
||
|
"session_id": f"{random.randint(1000000000000, 9999999999999)}-{uuid.uuid4().hex[:8]}"
|
||
|
}
|
||
|
|
||
|
def generate_launch_event(self):
|
||
|
"""生成启动事件"""
|
||
|
return {
|
||
|
"event_name": "launch",
|
||
|
"page_name": None,
|
||
|
"event_properties": [{
|
||
|
"is_open": random.choice([0, 1]),
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_login_event(self):
|
||
|
"""生成登录事件"""
|
||
|
login_methods = ["phone", "facebook", "google", "email", "apple"]
|
||
|
return {
|
||
|
"event_name": "login",
|
||
|
"page_name": "login",
|
||
|
"event_properties": [{
|
||
|
"is_login": 1,
|
||
|
"login_method": random.choice(login_methods),
|
||
|
"user_name": f"{random.randint(1000000000, 9999999999)}",
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_register_event(self):
|
||
|
"""生成注册事件"""
|
||
|
register_methods = ["phone", "facebook", "google", "email", "apple"]
|
||
|
return {
|
||
|
"event_name": "register",
|
||
|
"page_name": "register",
|
||
|
"event_properties": [{
|
||
|
"is_register": 1,
|
||
|
"user_name": f"{random.randint(1000000000, 9999999999)}",
|
||
|
"register_method": random.choice(register_methods),
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_search_event(self):
|
||
|
"""生成搜索事件"""
|
||
|
category = self.get_random_category()
|
||
|
return {
|
||
|
"event_name": "search",
|
||
|
"page_name": "search",
|
||
|
"event_properties": [{
|
||
|
"search_keyword": category['category_name'],
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_product_event(self):
|
||
|
"""生成商品事件"""
|
||
|
category = self.get_random_category()
|
||
|
currencies = ["FCFA", "USD", "CDF", "CFA", "EUR"]
|
||
|
return {
|
||
|
"event_name": "product",
|
||
|
"page_name": "product",
|
||
|
"event_properties": [{
|
||
|
"offer_id": random.randint(100000000000, 999999999999),
|
||
|
"category_id": int(category['category_id']),
|
||
|
"price": round(random.uniform(1.0, 1000.0), 2),
|
||
|
"currency": random.choice(currencies),
|
||
|
"timestamp": self.generate_timestamp(),
|
||
|
"product_name": category['category_name'],
|
||
|
"product_img": f"https://example.com/img/{random.randint(1000, 9999)}.jpg"
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_category_event(self):
|
||
|
"""生成分类事件"""
|
||
|
category = self.get_random_category()
|
||
|
return {
|
||
|
"event_name": "category",
|
||
|
"page_name": "category",
|
||
|
"event_properties": [{
|
||
|
"category_id": category['category_id'],
|
||
|
"timestamp": self.generate_timestamp(),
|
||
|
"category_name": category['category_name'],
|
||
|
"level": random.randint(1, 3)
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_product_list_event(self):
|
||
|
"""生成商品列表事件"""
|
||
|
category = self.get_random_category()
|
||
|
return {
|
||
|
"event_name": "productList",
|
||
|
"page_name": "productList",
|
||
|
"event_properties": [{
|
||
|
"category_id": category['category_id'],
|
||
|
"category_name": category['category_name'],
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_add_to_cart_event(self):
|
||
|
"""生成添加购物车事件"""
|
||
|
category = self.get_random_category()
|
||
|
currencies = ["FCFA", "USD", "CDF", "CFA", "EUR"]
|
||
|
properties = []
|
||
|
|
||
|
# 随机生成1-3个商品
|
||
|
for _ in range(random.randint(1, 3)):
|
||
|
properties.append({
|
||
|
"offer_id": random.randint(100000000000, 999999999999),
|
||
|
"category_id": int(category['category_id']),
|
||
|
"price": round(random.uniform(1.0, 100.0), 2),
|
||
|
"quantity": random.randint(1, 5),
|
||
|
"currency": random.choice(currencies),
|
||
|
"timestamp": self.generate_timestamp(),
|
||
|
"product_name": category['category_name'],
|
||
|
"product_img": f"https://example.com/img/{random.randint(1000, 9999)}.jpg"
|
||
|
})
|
||
|
|
||
|
return {
|
||
|
"event_name": "addToCart",
|
||
|
"page_name": "addToCart",
|
||
|
"event_properties": properties
|
||
|
}
|
||
|
|
||
|
def generate_payment_event(self):
|
||
|
"""生成支付事件"""
|
||
|
payment_method = ["palpay", "mobile_money", "wave", "bank_card", "balance","Western Union"]
|
||
|
currencies = ["FCFA", "USD", "CDF", "CFA", "EUR"]
|
||
|
return {
|
||
|
"event_name": "payment",
|
||
|
"page_name": "payment",
|
||
|
"event_properties": [{
|
||
|
"payment_method": random.choice(payment_method),
|
||
|
"online": random.choice([0, 1]),
|
||
|
"all_price": round(random.uniform(10.0, 1000.0), 2),
|
||
|
"currency": random.choice(currencies),
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_order_event(self):
|
||
|
"""生成订单事件"""
|
||
|
return {
|
||
|
"event_name": "order",
|
||
|
"page_name": "order",
|
||
|
"event_properties": [{
|
||
|
"order_id": f"{random.randint(1000000000, 9999999999)}",
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_checkout_event(self):
|
||
|
"""生成结算事件"""
|
||
|
currencies = ["FCFA", "USD", "CDF", "CFA", "EUR"]
|
||
|
return {
|
||
|
"event_name": "checkout",
|
||
|
"page_name": "checkout",
|
||
|
"event_properties": [{
|
||
|
"is_suc": random.choice([0, 1]),
|
||
|
"all_price": round(random.uniform(10.0, 1000.0), 2),
|
||
|
"currency": random.choice(currencies),
|
||
|
"timestamp": self.generate_timestamp(),
|
||
|
"shipping_method": random.choice([0, 1]),
|
||
|
"shipping_price_outside": random.randint(20, 60),
|
||
|
"shipping_price_within": random.randint(10, 30)
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_purchase_event(self):
|
||
|
"""生成购买事件"""
|
||
|
return {
|
||
|
"event_name": "purchase",
|
||
|
"page_name": "purchase",
|
||
|
"event_properties": [{
|
||
|
"order_id": f"{random.randint(1000000000, 9999999999)}",
|
||
|
"is_suc": random.choice([0, 1]),
|
||
|
"timestamp": self.generate_timestamp()
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
def generate_random_events(self, count):
|
||
|
"""生成随机事件列表"""
|
||
|
event_generators = [
|
||
|
self.generate_launch_event,
|
||
|
self.generate_login_event,
|
||
|
self.generate_register_event,
|
||
|
self.generate_search_event,
|
||
|
self.generate_product_event,
|
||
|
self.generate_category_event,
|
||
|
self.generate_product_list_event,
|
||
|
self.generate_add_to_cart_event,
|
||
|
self.generate_payment_event,
|
||
|
self.generate_order_event,
|
||
|
self.generate_checkout_event,
|
||
|
self.generate_purchase_event
|
||
|
]
|
||
|
|
||
|
events = []
|
||
|
for _ in range(count):
|
||
|
generator = random.choice(event_generators)
|
||
|
events.append(generator())
|
||
|
|
||
|
return events
|
||
|
|
||
|
def create_event_data(self):
|
||
|
"""创建完整的事件数据"""
|
||
|
device_info = self.generate_device_info()
|
||
|
event_count = random.randint(1, 5) # 随机1-5个事件
|
||
|
events = self.generate_random_events(event_count)
|
||
|
|
||
|
return {
|
||
|
**device_info,
|
||
|
"event_list": events
|
||
|
}
|
||
|
|
||
|
def send_event(self):
|
||
|
"""发送事件数据到API"""
|
||
|
event_data = self.create_event_data()
|
||
|
|
||
|
try:
|
||
|
headers = {
|
||
|
'Content-Type': 'application/json'
|
||
|
}
|
||
|
|
||
|
response = requests.post(
|
||
|
self.api_url,
|
||
|
data=json.dumps(event_data),
|
||
|
headers=headers,
|
||
|
timeout=30
|
||
|
)
|
||
|
|
||
|
print(f"请求状态码: {response.status_code}")
|
||
|
print(f"事件数量: {len(event_data['event_list'])}")
|
||
|
print(f"用户ID: {event_data['user_id']}")
|
||
|
print(f"设备: {event_data['device_id']}")
|
||
|
print(f"响应: {response.text}")
|
||
|
print("-" * 50)
|
||
|
|
||
|
return response.status_code == 200
|
||
|
|
||
|
except Exception as e:
|
||
|
print(f"发送请求失败: {e}")
|
||
|
return False
|
||
|
|
||
|
def main():
|
||
|
# 配置
|
||
|
csv_file = "category_data.csv"
|
||
|
api_url = "https://mlj1sm5a3a.execute-api.ap-southeast-1.amazonaws.com/event"
|
||
|
|
||
|
# 创建模拟器
|
||
|
simulator = EventSimulator(csv_file, api_url)
|
||
|
|
||
|
# 发送多次请求进行测试
|
||
|
print("开始发送事件数据...")
|
||
|
for i in range(10): # 发送5次请求
|
||
|
print(f"\n=== 第 {i+1} 次请求 ===")
|
||
|
success = simulator.send_event()
|
||
|
if success:
|
||
|
print("✅ 请求成功")
|
||
|
else:
|
||
|
print("❌ 请求失败")
|
||
|
|
||
|
print("\n测试完成!")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|