Dink0 commited on
Commit
f0d4215
·
verified ·
1 Parent(s): e3d5b93

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -58
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import streamlit as st
2
  import asyncio
3
  import nest_asyncio
4
- nest_asyncio.apply() # Позволяет переиспользовать один event loop
5
 
6
  import re
7
  import os
@@ -53,32 +53,52 @@ def process_telegram_link(link: str) -> tuple[str, int]:
53
  link = link.strip()
54
  if not link:
55
  return "", 0
56
- # Распознаем ссылки вида t.me и telegram.me (без учета регистра)
 
57
  match = re.match(r'https?://(?:t(?:elegram)?\.me)/([^/]+)/(\d+)', link, re.IGNORECASE)
58
  if not match:
59
  return f"**Ошибка (TG)**: не распознал ссылку — {link}", 0
 
60
  channel_username = match.group(1)
61
  message_id = int(match.group(2))
 
62
  try:
63
  msg = tg_loop.run_until_complete(tg_client.get_messages(channel_username, ids=message_id))
64
- if msg is None:
65
- return f"**Ошибка (TG)**: сообщение не найдено — {link}", 0
 
 
 
 
 
 
 
 
 
66
  channel_entity = tg_loop.run_until_complete(tg_client.get_entity(channel_username))
67
- channel_title = channel_entity.title
68
- views = msg.views or 0
69
- result = f"- [{channel_title}]({link}) — {human_format_views(views)}"
70
- return result, views
71
- except Exception as e:
72
- return f"**Ошибка (TG)** при обработке [{link}]({link}): {e}", 0
 
 
 
 
 
 
73
 
74
  # ------------- Парсер VK -------------
75
  def process_vk_link(link: str) -> tuple[str, int]:
76
  link = link.strip()
77
  if not link:
78
  return "", 0
 
79
  match = re.search(r'vk\.com/wall(-?\d+)_(\d+)', link)
80
  if not match:
81
  return f"**Ошибка (VK)**: не распознал ссылку — {link}", 0
 
82
  owner_id = int(match.group(1))
83
  post_id = match.group(2)
84
  posts_param = f"{owner_id}_{post_id}"
@@ -135,33 +155,6 @@ def detect_platform(link: str) -> str:
135
  return "vk"
136
  return ""
137
 
138
- # ----------- Кастомные стили (CSS) -----------
139
- st.markdown(
140
- """
141
- <style>
142
- .section-header {
143
- font-size: 1.4rem;
144
- color: #333;
145
- margin-bottom: 5px;
146
- }
147
- .total-views {
148
- font-size: 1.1rem;
149
- font-weight: bold;
150
- color: #444;
151
- margin-bottom: 10px;
152
- }
153
- .post-item {
154
- margin-left: 20px;
155
- margin-bottom: 4px;
156
- }
157
- .result-title {
158
- font-size: 1.6rem;
159
- color: #222;
160
- margin-top: 20px;
161
- }
162
- </style>
163
- """, unsafe_allow_html=True)
164
-
165
  # ---------- Интерфейс Streamlit ----------
166
  st.title("PR Tool made by @Dina")
167
  st.write("Вставьте ссылки (каждая на новой строке) — как Telegram, так и ВКонтакте. Пример:")
@@ -171,12 +164,10 @@ https://vk.com/wall-12256840_3220312
171
  https://telegram.me/za_traktor/27423
172
  https://vk.com/wall-237426_1643234
173
  """)
174
-
175
  links_input = st.text_area("Ссылки:", height=200)
176
 
177
  if st.button("Обработать"):
178
  lines = links_input.strip().split('\n')
179
-
180
  tg_results = []
181
  tg_total_views = 0
182
  vk_results = []
@@ -198,31 +189,31 @@ if st.button("Обработать"):
198
  tg_results.sort(key=lambda x: x[1], reverse=True)
199
  vk_results.sort(key=lambda x: x[1], reverse=True)
200
 
201
- # Формируем разделы в два столбца
202
- st.markdown("### Результат:")
203
- col1, col2 = st.columns(2)
204
- with col1:
205
- st.markdown("<div class='section-header'>Telegram</div>", unsafe_allow_html=True)
206
- st.markdown(f"<div class='total-views'>Суммарный охват постов — {human_format_views(tg_total_views)} просмотров</div>", unsafe_allow_html=True)
207
- for r_line, _ in tg_results:
208
- st.markdown(f"<div class='post-item'>{r_line}</div>", unsafe_allow_html=True)
209
- with col2:
210
- st.markdown("<div class='section-header'>ВКонтакте</div>", unsafe_allow_html=True)
211
- st.markdown(f"<div class='total-views'>Суммарный охват постов — {human_format_views(vk_total_views)} просмотров</div>", unsafe_allow_html=True)
212
- for r_line, _ in vk_results:
213
- st.markdown(f"<div class='post-item'>{r_line}</div>", unsafe_allow_html=True)
214
-
215
- # Формируем итоговый Markdown-код для копирования
216
  md_lines = []
 
217
  md_lines.append("## Telegram")
218
  md_lines.append(f"**Суммарный охват постов — {human_format_views(tg_total_views)} просмотров**")
219
- for r_line, _ in tg_results:
220
- md_lines.append(r_line)
 
 
 
221
  md_lines.append("")
 
222
  md_lines.append("## ВКонтакте")
223
  md_lines.append(f"**Суммарный охват постов — {human_format_views(vk_total_views)} просмотров**")
224
- for r_line, _ in vk_results:
225
- md_lines.append(r_line)
 
 
 
 
 
 
 
 
 
226
  markdown_result = "\n".join(md_lines)
227
 
228
  # HTML/JS-компонент для копирования в буфер обмена с изменением текста кнопки
 
1
  import streamlit as st
2
  import asyncio
3
  import nest_asyncio
4
+ nest_asyncio.apply()
5
 
6
  import re
7
  import os
 
53
  link = link.strip()
54
  if not link:
55
  return "", 0
56
+
57
+ # Поддержка ссылок вида t.me, telegram.me (без учета регистра)
58
  match = re.match(r'https?://(?:t(?:elegram)?\.me)/([^/]+)/(\d+)', link, re.IGNORECASE)
59
  if not match:
60
  return f"**Ошибка (TG)**: не распознал ссылку — {link}", 0
61
+
62
  channel_username = match.group(1)
63
  message_id = int(match.group(2))
64
+ global tg_client, tg_loop
65
  try:
66
  msg = tg_loop.run_until_complete(tg_client.get_messages(channel_username, ids=message_id))
67
+ except RuntimeError as e:
68
+ if "Event loop is closed" in str(e):
69
+ tg_client, tg_loop = init_telethon()
70
+ st.session_state["telethon_client"] = tg_client
71
+ st.session_state["telethon_loop"] = tg_loop
72
+ msg = tg_loop.run_until_complete(tg_client.get_messages(channel_username, ids=message_id))
73
+ else:
74
+ return f"**Ошибка (TG)** при обработке [{link}]({link}): {e}", 0
75
+ if msg is None:
76
+ return f"**Ошибка (TG)**: сообщение не найдено — {link}", 0
77
+ try:
78
  channel_entity = tg_loop.run_until_complete(tg_client.get_entity(channel_username))
79
+ except RuntimeError as e:
80
+ if "Event loop is closed" in str(e):
81
+ tg_client, tg_loop = init_telethon()
82
+ st.session_state["telethon_client"] = tg_client
83
+ st.session_state["telethon_loop"] = tg_loop
84
+ channel_entity = tg_loop.run_until_complete(tg_client.get_entity(channel_username))
85
+ else:
86
+ return f"**Ошибка (TG)** при обработке [{link}]({link}): {e}", 0
87
+ channel_title = channel_entity.title
88
+ views = msg.views or 0
89
+ result = f"- [{channel_title}]({link}) — {human_format_views(views)}"
90
+ return result, views
91
 
92
  # ------------- Парсер VK -------------
93
  def process_vk_link(link: str) -> tuple[str, int]:
94
  link = link.strip()
95
  if not link:
96
  return "", 0
97
+
98
  match = re.search(r'vk\.com/wall(-?\d+)_(\d+)', link)
99
  if not match:
100
  return f"**Ошибка (VK)**: не распознал ссылку — {link}", 0
101
+
102
  owner_id = int(match.group(1))
103
  post_id = match.group(2)
104
  posts_param = f"{owner_id}_{post_id}"
 
155
  return "vk"
156
  return ""
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  # ---------- Интерфейс Streamlit ----------
159
  st.title("PR Tool made by @Dina")
160
  st.write("Вставьте ссылки (каждая на новой строке) — как Telegram, так и ВКонтакте. Пример:")
 
164
  https://telegram.me/za_traktor/27423
165
  https://vk.com/wall-237426_1643234
166
  """)
 
167
  links_input = st.text_area("Ссылки:", height=200)
168
 
169
  if st.button("Обработать"):
170
  lines = links_input.strip().split('\n')
 
171
  tg_results = []
172
  tg_total_views = 0
173
  vk_results = []
 
189
  tg_results.sort(key=lambda x: x[1], reverse=True)
190
  vk_results.sort(key=lambda x: x[1], reverse=True)
191
 
192
+ # Формирование итогового Markdown-вывода
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  md_lines = []
194
+
195
  md_lines.append("## Telegram")
196
  md_lines.append(f"**Суммарный охват постов — {human_format_views(tg_total_views)} просмотров**")
197
+ if tg_results:
198
+ for r_line, _ in tg_results:
199
+ md_lines.append(r_line)
200
+ else:
201
+ md_lines.append("_Нет ссылок на Telegram_")
202
  md_lines.append("")
203
+
204
  md_lines.append("## ВКонтакте")
205
  md_lines.append(f"**Суммарный охват постов — {human_format_views(vk_total_views)} просмотров**")
206
+ if vk_results:
207
+ for r_line, _ in vk_results:
208
+ md_lines.append(r_line)
209
+ else:
210
+ md_lines.append("_Нет ссылок на ВКонтакте_")
211
+ md_lines.append("")
212
+
213
+ st.markdown("### Результат:")
214
+ for line in md_lines:
215
+ st.markdown(line, unsafe_allow_html=True)
216
+
217
  markdown_result = "\n".join(md_lines)
218
 
219
  # HTML/JS-компонент для копирования в буфер обмена с изменением текста кнопки