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.
306 lines
10 KiB
306 lines
10 KiB
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()
|
|
|