elasko-aim commited on
Commit
0ce76d6
·
verified ·
1 Parent(s): e9eae8b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -31
app.py CHANGED
@@ -3,28 +3,39 @@ import requests
3
  import time
4
  import random
5
  import uuid
 
 
6
 
7
- # Список User-Agent для імітації різних пристроїв
8
  USER_AGENTS = [
9
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
10
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15",
11
  "Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36",
12
  "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
13
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0"
 
 
 
14
  ]
15
 
16
- # Функція для відправки унікального кліку з різних "IP"
 
 
 
 
 
 
17
  def send_click_to_url(url):
18
  try:
19
  unique_id = str(uuid.uuid4()) # Унікальний ID для кожного кліку
20
  timestamp = int(time.time())
21
- user_agent = random.choice(USER_AGENTS) # Випадковий User-Agent для імітації різних користувачів
 
22
 
23
  headers = {
24
  "User-Agent": user_agent
25
  }
26
 
27
- # Дані для відправки (можна налаштувати під ваші потреби)
28
  payload = {
29
  "data": [
30
  f"test_input_{unique_id}",
@@ -32,22 +43,19 @@ def send_click_to_url(url):
32
  ]
33
  }
34
 
35
- # Відправка POST-запиту з заголовками
36
  response = requests.post(url, json=payload, headers=headers)
37
 
38
  if response.status_code == 200:
39
- return {"status": "Успішно", "user_agent": user_agent, "ip": f"192.168.{random.randint(0,255)}.{random.randint(0,255)}"}
40
  else:
41
- return {"status": f"Помилка {response.status_code}", "user_agent": user_agent, "ip": f"192.168.{random.randint(0,255)}.{random.randint(0,255)}"}
42
 
43
  except requests.exceptions.RequestException:
44
- return {"status": "Помилка з'єднання", "user_agent": user_agent, "ip": f"192.168.{random.randint(0,255)}.{random.randint(0,255)}"}
45
 
46
  # Функція для симуляції трафіку
47
  def simulate_traffic(url, interval=1, clicks=5):
48
- successful_clicks = 0
49
- failed_clicks = 0
50
- details = []
51
  start_time = time.time()
52
 
53
  if not url.startswith("http"):
@@ -55,38 +63,68 @@ def simulate_traffic(url, interval=1, clicks=5):
55
 
56
  for i in range(clicks):
57
  result = send_click_to_url(url)
58
- if result["status"] == "Успішно":
59
- successful_clicks += 1
60
- else:
61
- failed_clicks += 1
62
-
63
- details.append(f"Клік #{i + 1}: {result['status']} | IP: {result['ip']} | User-Agent: {result['user_agent']}")
64
  time.sleep(random.uniform(0, interval))
65
 
66
  total_time = round(time.time() - start_time, 2)
 
 
 
 
 
67
  summary = (
68
  f"Симуляція завершена!\n"
69
  f"Загальна кількість кліків: {clicks}\n"
70
- f"Успішні кліки: {successful_clicks}\n"
71
- f"Неуспішні кліки: {failed_clicks}\n"
72
  f"Загальний час симуляції: {total_time} секунд\n"
73
  )
74
 
75
- return summary + "\n\nДеталі кліків:\n" + "\n".join(details)
76
 
77
- # Інтерфейс Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  def process_url(url, interval, clicks):
79
  return simulate_traffic(url, interval, clicks)
80
 
81
- interface = gr.Interface(
82
- fn=process_url,
83
- inputs=[
84
- gr.Textbox(label="Введіть URL"),
85
- gr.Slider(0.5, 5, step=0.5, label="Інтервал між кліками (секунди)"),
86
- gr.Slider(1, 20, step=1, label="Кількість кліків")
87
- ],
88
- outputs=gr.Textbox(label="Результати симуляції")
89
- )
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  if __name__ == "__main__":
92
  interface.launch()
 
3
  import time
4
  import random
5
  import uuid
6
+ import matplotlib.pyplot as plt
7
+ import pandas as pd
8
 
9
+ # Розширений список User-Agent для більш реалістичної імітації трафіку
10
  USER_AGENTS = [
11
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
12
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15",
13
  "Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36",
14
  "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
15
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0",
16
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
17
+ "Mozilla/5.0 (iPad; CPU OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
18
+ "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36"
19
  ]
20
 
21
+ # Генерація випадкових IP-адрес для симуляції трафіку
22
+ def generate_random_ip():
23
+ # Симуляція IP з різних геолокацій (прикладова модель)
24
+ first_octet = random.choice([23, 45, 67, 89, 123, 156, 189, 210])
25
+ return f"{first_octet}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(0,255)}"
26
+
27
+ # Функція для відправки унікального кліку
28
  def send_click_to_url(url):
29
  try:
30
  unique_id = str(uuid.uuid4()) # Унікальний ID для кожного кліку
31
  timestamp = int(time.time())
32
+ user_agent = random.choice(USER_AGENTS)
33
+ ip_address = generate_random_ip()
34
 
35
  headers = {
36
  "User-Agent": user_agent
37
  }
38
 
 
39
  payload = {
40
  "data": [
41
  f"test_input_{unique_id}",
 
43
  ]
44
  }
45
 
 
46
  response = requests.post(url, json=payload, headers=headers)
47
 
48
  if response.status_code == 200:
49
+ return {"status": "Успішно", "user_agent": user_agent, "ip": ip_address, "timestamp": timestamp}
50
  else:
51
+ return {"status": f"Помилка {response.status_code}", "user_agent": user_agent, "ip": ip_address, "timestamp": timestamp}
52
 
53
  except requests.exceptions.RequestException:
54
+ return {"status": "Помилка з'єднання", "user_agent": user_agent, "ip": ip_address, "timestamp": timestamp}
55
 
56
  # Функція для симуляції трафіку
57
  def simulate_traffic(url, interval=1, clicks=5):
58
+ results = []
 
 
59
  start_time = time.time()
60
 
61
  if not url.startswith("http"):
 
63
 
64
  for i in range(clicks):
65
  result = send_click_to_url(url)
66
+ results.append(result)
 
 
 
 
 
67
  time.sleep(random.uniform(0, interval))
68
 
69
  total_time = round(time.time() - start_time, 2)
70
+
71
+ # Логування результатів у CSV-файл
72
+ df = pd.DataFrame(results)
73
+ df.to_csv('traffic_log.csv', index=False)
74
+
75
  summary = (
76
  f"Симуляція завершена!\n"
77
  f"Загальна кількість кліків: {clicks}\n"
78
+ f"Успішні кліки: {len(df[df['status'] == 'Успішно'])}\n"
79
+ f"Неуспішні кліки: {len(df[df['status'] != 'Успішно'])}\n"
80
  f"Загальний час симуляції: {total_time} секунд\n"
81
  )
82
 
83
+ return summary + "\n\nДля перегляду детальної статистики перегляньте файл 'traffic_log.csv'."
84
 
85
+ # Візуалізація статистики
86
+ def visualize_traffic():
87
+ try:
88
+ df = pd.read_csv('traffic_log.csv')
89
+
90
+ # Графік успішних і неуспішних кліків
91
+ status_counts = df['status'].value_counts()
92
+ plt.figure(figsize=(8, 5))
93
+ plt.bar(status_counts.index, status_counts.values, color=['green', 'red'])
94
+ plt.title('Статистика кліків')
95
+ plt.xlabel('Статус')
96
+ plt.ylabel('Кількість кліків')
97
+ plt.tight_layout()
98
+ plt.savefig('traffic_stats.png')
99
+ return 'traffic_stats.png'
100
+ except FileNotFoundError:
101
+ return "Файл з логами не знайдено. Виконайте симуляцію спочатку."
102
+
103
+ # Інтерфейс Gradio для симуляції і візуалізації
104
  def process_url(url, interval, clicks):
105
  return simulate_traffic(url, interval, clicks)
106
 
107
+ def show_visualization():
108
+ return visualize_traffic()
109
+
110
+ interface = gr.Blocks()
111
+
112
+ with interface:
113
+ gr.Markdown("### Симуляція трафіку та аналіз статистики")
114
+ url_input = gr.Textbox(label="Введіть URL")
115
+ interval_slider = gr.Slider(0.5, 5, step=0.5, label="Інтервал між кліками (секунди)")
116
+ clicks_slider = gr.Slider(1, 50, step=1, label="Кількість кліків")
117
+
118
+ simulate_button = gr.Button("Запустити симуляцію")
119
+ output_text = gr.Textbox(label="Результати симуляції")
120
+
121
+ simulate_button.click(process_url, inputs=[url_input, interval_slider, clicks_slider], outputs=output_text)
122
+
123
+ gr.Markdown("### Візуалізація статистики")
124
+ visualize_button = gr.Button("Показати графік")
125
+ image_output = gr.Image(label="Графік трафіку")
126
+
127
+ visualize_button.click(show_visualization, outputs=image_output)
128
 
129
  if __name__ == "__main__":
130
  interface.launch()