elasko-aim commited on
Commit
3d0bec1
·
verified ·
1 Parent(s): 4050dd7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -121
app.py CHANGED
@@ -1,130 +1,45 @@
1
  import gradio as gr
2
  import requests
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}",
42
- timestamp
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"):
62
- return "Помилка: URL має починатися з 'http://' або 'https://'."
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()
 
1
  import gradio as gr
2
  import requests
3
+ from bs4 import BeautifulSoup
 
 
 
 
4
 
5
+ def process_url(url, method):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  try:
7
+ if method == "Обычный запрос":
8
+ response = requests.get(url)
9
+ elif method == "Через прокси":
10
+ proxies = {
11
+ "http": "http://your_proxy:port",
12
+ "https": "http://your_proxy:port"
13
+ }
14
+ response = requests.get(url, proxies=proxies)
15
+ elif method == "Только заголовки":
16
+ response = requests.head(url)
17
+ return f"Заголовки:\n{response.headers}"
18
+
19
+ response.raise_for_status()
20
+
21
+ if method != "Только заголовки":
22
+ soup = BeautifulSoup(response.content, 'html.parser')
23
+ page_title = soup.title.string if soup.title else "Нет заголовка"
24
+ page_preview = soup.prettify()[:500] # Ограничиваем вывод до 500 символов
25
+ return f"Заголовок страницы: {page_title}\n\nПредварительный просмотр кода:\n{page_preview}"
26
 
27
+ except requests.exceptions.RequestException as e:
28
+ return f"Ошибка при обработке URL: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
+ # Создаем интерфейс
31
+ with gr.Blocks() as demo:
32
+ gr.Markdown("## Введите ссылку для просмотра исходного кода сайта")
 
 
 
 
 
 
 
33
 
34
+ url_input = gr.Textbox(label="Введите URL", placeholder="http://example.com")
35
+ method_selector = gr.Dropdown(choices=["Обычный запрос", "Через прокси", "Только заголовки"],
36
+ label="Метод обработки", value="Обычный запрос")
37
+
38
+ submit_button = gr.Button("Отправить")
39
+ output_text = gr.Textbox(label="Результат", lines=20)
 
 
40
 
41
+ # Обработка нажатия кнопки
42
+ submit_button.click(process_url, inputs=[url_input, method_selector], outputs=output_text)
43
 
44
+ # Запуск приложения
45
+ demo.launch(server_name="0.0.0.0", server_port=7860)