· 4 years ago · Jun 15, 2021, 03:26 PM
1# -*- coding: utf-8 -*-
2
3from telethon.sync import TelegramClient
4import re
5import asyncio
6import os
7import time
8import sqlite3
9import sys
10from PyQt5.QtCore import QThread, pyqtSignal
11from PyQt5 import QtWidgets, QtCore
12from PyQt5.QtWidgets import QMessageBox
13from design import Ui_MainWindow
14
15chats_info, app_id, app_hash = {}, 0, ''
16
17class sql:
18 chats = {}
19
20 def get_chats(self):
21 global app_id, app_hash
22
23 sqllite_connection = sqlite3.connect("chats.db")
24 sqllite_connection1 = sqlite3.connect("app.db")
25
26 cursor1 = sqllite_connection.cursor()
27 chats = cursor1.execute('select * from chats')
28 sqllite_connection.commit()
29 for chat in chats:
30 self.chats[chat[0]] = chat[1]
31
32 cursor1.close()
33 sqllite_connection.close()
34
35 cursor2 = sqllite_connection1.cursor()
36 app = cursor2.execute('select * from app')
37 sqllite_connection1.commit()
38 for a in app:
39 app_id = a[1]
40 app_hash = a[2]
41 print(self.chats, app_id, app_hash)
42
43 cursor2.close()
44 sqllite_connection1.close()
45
46 def connect_bd(self):
47 if not os.path.isfile("chats.db") or not os.path.isfile("app.db"):
48 self.__create_table()
49 else:
50 self.get_chats()
51
52 def __create_table(self):
53 sqllite_connection = sqlite3.connect("chats.db")
54 sqllite_connection1 = sqlite3.connect("app.db")
55
56 cursor1 = sqllite_connection.cursor()
57 sqlite_create_table_query = '''CREATE TABLE chats (
58 id_chat TEXT NOT NULL PRIMARY KEY,
59 value TEXT NOT NULL);
60 '''
61 cursor1.execute(sqlite_create_table_query)
62 sqllite_connection.commit()
63 cursor1.close()
64 sqllite_connection.close()
65
66 cursor2 = sqllite_connection1.cursor()
67 sqlite_create_table_query = '''CREATE TABLE app (
68 id INTEGER NOT NULL PRIMARY KEY,
69 app_id TEXT NOT NULL,
70 app_hash TEXT NOT NULL);
71 '''
72 cursor2.execute(sqlite_create_table_query)
73 sqllite_connection1.commit()
74 cursor2.close()
75
76 cursor2.execute('''insert into app ("id", "app_id", "app_hash") values ("1","1","1")''')
77 sqllite_connection1.commit()
78 cursor2.close()
79
80 sqllite_connection1.close()
81
82 def insert_chat(self, chat, text):
83 sqllite_connection = sqlite3.connect("chats.db")
84
85 cursor1 = sqllite_connection.cursor()
86
87 id = f"{chats_info[chat]}"
88 t = f"{text}"
89
90 cursor1.execute('''insert into chats ("id_chat", "value") values (?,?)''', (id, t))
91 self.chats[id] = text
92 sqllite_connection.commit()
93 cursor1.close()
94 sqllite_connection.close()
95
96 def update_app(self, app_id, app_hash):
97 sqllite_connection1 = sqlite3.connect("app.db")
98 cursor1 = sqllite_connection1.cursor()
99
100 id = f"{app_id}"
101 hash = f"{app_hash}"
102
103 cursor1.execute(f'''update app set app_id = ?, app_hash = ? where id = ?''', (id, hash, "1"))
104 sqllite_connection1.commit()
105 sqllite_connection1.close()
106 cursor1.close()
107
108 def update_chat(self, chat, text):
109 sqllite_connection = sqlite3.connect("chats.db")
110
111 cursor1 = sqllite_connection.cursor()
112 id = f"{chats_info[chat]}"
113 t = f"{text}"
114 cursor1.execute(f"""update chats set value="{t}" where id_chat="{id}" """)
115 self.chats[id] = text
116 sqllite_connection.commit()
117 sqllite_connection.close()
118 cursor1.close()
119
120class telethon_app(QThread):
121 get_user, me = False, None
122
123 def __init__(self, window, number=None, app_id=None, app_hash=None, password=None):
124 super().__init__()
125 self.w = window
126
127 self.id = int(app_id)
128 self.hash = app_hash
129 self.number = number
130 self.passwd = password
131 self.send_code = False
132
133 def wait_code(self):
134 while True:
135 if self.send_code:
136 self.send_code = False
137 self.w.code = None
138
139 if self.w.code != None:
140 self.send_code = True
141 return self.w.code
142
143 time.sleep(1)
144
145
146 def run(self):
147 try:
148 loop = asyncio.new_event_loop()
149 asyncio.set_event_loop(loop)
150
151 if len(str(self.id)) > 0 and len(self.hash) > 0:
152 self.w.client = TelegramClient('session', api_id=int(self.id), api_hash=self.hash, sequential_updates=False, request_retries=9999, connection_retries=9999, retry_delay=5, auto_reconnect=True)
153 self.w.client.connect()
154 if not self.w.client.is_user_authorized():
155 self.w.client.start(phone=self.number, password=self.passwd, code_callback=self.wait_code)
156
157 # self.w.s.update_app(self.w.app_id, self.w.app_hash)
158
159 with self.w.client:
160 self.me = self.w.client.get_me()
161
162 if self.get_user == False:
163 self.w.ui.progressBar.setVisible(False)
164 self.w.ui.info.setVisible(False)
165 self.w.ui.text1.setVisible(False)
166 self.w.ui.text2.setVisible(False)
167 self.w.ui.lab1.setVisible(False)
168 self.w.ui.lab2.setVisible(False)
169 self.w.ui.reg.setVisible(False)
170 self.w.ui.check_bot1.setVisible(False)
171 self.w.ui.check_bot2.setVisible(False)
172
173 self.w.ui.textEdit.setVisible(True)
174 self.w.ui.listWidget.setVisible(True)
175 self.w.ui.sendText.setVisible(True)
176 self.w.ui.saveTextButton.setVisible(True)
177 self.w.ui.label.setVisible(True)
178 self.w.ui.label_2.setVisible(True)
179 time.sleep(1)
180
181 for dialog in self.w.client.iter_dialogs():
182 try:
183 name = dialog.entity.first_name
184 except:
185 if dialog.entity.megagroup == True:
186 chats_info[dialog.name] = str(dialog.id)
187 self.w.ui.listWidget.addItem(dialog.name)
188
189 self.w.client.disconnect()
190
191 else:
192 try:
193 self.w.ui.check_bot1.setVisible(True)
194 self.w.ui.progressBar.setVisible(True)
195 self.w.ui.listWidget.setVisible(False)
196 self.w.ui.label.setVisible(False)
197 self.w.ui.saveTextButton.setText("Отмена")
198 users_list = []
199 chat_id = chats_info[self.w.chat_select]
200 self.w.message = self.w.text_send
201 self.w.ui.statusbar.showMessage("Получение списка юзеров чата...")
202 users = self.w.client.get_participants(int(chat_id), limit=None)
203 self.w.all_count_chat_users = len(users)-1
204 for u in users:
205 if u.bot:
206 self.w.bot_count += 1
207 if u.bot == False and self.me.id != u.id:
208 self.w.users_to_chat.append(u.id)
209
210 self.w.client.disconnect()
211
212 self.w.sender_client = Sender()
213 self.w.sender_client.sig.connect(self.w.client_sender)
214
215 self.w.ui.check_bot1.setText(f'Ботов отсеяно: {self.w.bot_count}')
216 self.w.ui.statusbar.showMessage("Происходит процесс отправления сообщения юзерам...")
217 self.w.check_users_for_chat = True
218 self.w.ui.check_bot2.setVisible(True)
219
220 except Exception as e:
221 print(e)
222
223
224 except Exception as e:
225 print(e)
226 self.w.error = str(e)
227
228class ProgressBar(QThread):
229 sig = QtCore.pyqtSignal(int, str)
230
231 def __init__(self, window, parent=None):
232 super().__init__(parent)
233 self.w = window
234 self.list_users = window.users_to_chat
235
236 def run(self):
237 try:
238 for id in self.list_users:
239 self.sig.emit(id, "id")
240 time.sleep(1)
241 except Exception as e:
242 print(e)
243
244 self.w.telethon.exit()
245 self.w.click_button_save()
246
247class Sender(QThread):
248 sig = QtCore.pyqtSignal(int)
249
250 client = None
251 chat, mess = None, ''
252
253 def __init__(self, parent=None):
254 super().__init__(parent)
255
256 def run(self):
257 pass
258
259class Timer_Error(QThread):
260 sig = pyqtSignal(int)
261
262 def __init__(self, window, parent=None):
263 super().__init__(parent)
264 self.w = window
265
266 def run(self):
267 while True:
268 if self.w.error != '':
269 if "Two-step verification" in self.w.error:
270 self.w.error = 'Аккаунт защищён двухфакторной авторизацией, введите пароль'
271 self.w.step -= 1
272 self.w.code = None
273 self.w.ui.lab1.setVisible(True)
274 self.w.ui.text1.setVisible(True)
275 self.w.ui.lab1.setText("Введите номер телефона:")
276 self.w.ui.lab2.setText("Введите пароль (оставить пустым, если нет):")
277
278 if "A wait of" in self.w.error:
279 self.w.error = 'У вас лимит на вход в телеграмм, подождите '+re.findall(r'[0-9]+', self.w.error)[0]+' сек.'
280 self.w.step -= 1
281 self.w.code = None
282 self.w.ui.lab1.setVisible(True)
283 self.w.ui.text1.setVisible(True)
284 self.w.ui.lab1.setText("Введите номер телефона:")
285 self.w.ui.lab2.setText("Введите пароль (оставить пустым, если нет):")
286 self.w.ui.text2.setPlaceholderText("Пароль двухэтапной аутентификации")
287
288 if "Invalid code" in self.w.error:
289 self.w.error = "Не верно введён код подтверждения, попробуйте ещё раз"
290 self.w.code = None
291
292 print(self.w.error, "errrr")
293
294 self.sig.emit(self.w.error)
295
296 time.sleep(0.5)
297
298class Application(QtWidgets.QMainWindow, Ui_MainWindow):
299 chat_select = ''
300 text_send = ''
301 step = 1
302 sender_client = None
303 client = None
304 all_count_chat_users, check_users_for_chat, u_count, bot_count, send_error, users_to_chat, message = 0, False, 0, 0, 0, [], ''
305 flag = False
306 error = ''
307 s = sql()
308 app_id = app_hash = nomer = password = code = None
309
310 def __init__(self):
311 super(Application, self).__init__()
312 self.ui = Ui_MainWindow()
313 self.ui.setupUi(self)
314
315 self.ui.textEdit.textChanged.connect(self.edit_text)
316 self.ui.listWidget.itemSelectionChanged.connect(lambda: self.select_chat())
317 self.ui.sendText.clicked.connect(self.click_button_send)
318 self.ui.saveTextButton.clicked.connect(self.click_button_save)
319
320 self.ui.reg.clicked.connect(self.registration_app)
321
322
323 if app_id != 1 and app_hash != '':
324 self.client = TelegramClient('session', api_id=app_id, api_hash=app_hash, sequential_updates=False, request_retries=9999, connection_retries=9999, retry_delay=5, auto_reconnect=True)
325 self.client.connect()
326 if not self.client.is_user_authorized():
327 self.visible_form_reg()
328 else:
329 self.app_id = app_id
330 self.app_hash = app_hash
331 self.telethon = telethon_app(self, app_id=app_id, app_hash=app_hash)
332 self.telethon.start()
333 else:
334 self.visible_form_reg()
335
336 def show_error(self):
337 error = QMessageBox()
338 error.setWindowTitle("Ошибка")
339 error.setIcon(QMessageBox.Warning)
340 error.setText(self.error)
341 self.error = ''
342 error.exec_()
343
344 def client_sender(self, chat):
345 if self.flag == False:
346 self.client = TelegramClient('session', api_id=int(app_id), api_hash=app_hash, sequential_updates=False, request_retries=9999, connection_retries=9999, retry_delay=5, auto_reconnect=True)
347 self.client.connect()
348 self.flag = True
349
350 self.client.send_message(chat, self.message)
351 # self.progress.sig.emit(0, 'send_error')
352
353
354 def signal_progress(self, id, type):
355 if type == 'id':
356 self.sender_client.sig.emit(id)
357 self.u_count += 1
358 self.ui.check_bot2.setText(f"Сообщение отправлено: {(self.u_count+self.bot_count)} из {self.all_count_chat_users} юзеров")
359 else:
360 self.send_error += 1
361 # self.ui.check_bot3.setText(f"Не удалось отправить: {self.send_error}")
362
363 self.ui.progressBar.setValue(int(100 * ((self.u_count+self.bot_count) / self.all_count_chat_users)))
364
365
366 def visible_form_reg(self):
367 self.timer = Timer_Error(self)
368 self.timer.sig.connect(self.show_error)
369 self.timer.start()
370
371 self.ui.check_bot1.setVisible(False)
372 self.ui.check_bot2.setVisible(False)
373 self.ui.textEdit.setVisible(False)
374 self.ui.listWidget.setVisible(False)
375 self.ui.sendText.setVisible(False)
376 self.ui.saveTextButton.setVisible(False)
377 self.ui.label.setVisible(False)
378 self.ui.label_2.setVisible(False)
379 self.ui.info.setText(
380 "1) Перейдите на сайт https://my.telegram.org/auth\n2) Введите номер телефона, к которому привязан телеграмм аккаунт, затем перейдите в телеграм, скопируйте код и вставьте в поле на сайте, затем нажмите \"Sign In\"\n3) Далее нажмите на \"API development tools\" и в полях \"App title\" и \"Short name\" введите любое название приложения и короткое имя, например: chat_mailing и chat mailing и потом нажмите \"Create application\"\n4) Появятся значения для полей \"App api_id\" и \"App api_hash\" - вводим их и номер телефона, после нажатия на кнопку \"Войти\" снова придёт код в телеграм. Вводим и на этом всё.")
381
382
383 def registration_app(self):
384 cl = False
385 if self.step == 1:
386 if self.ui.text1.toPlainText() != "" and self.ui.text2.toPlainText() != "":
387 if len(re.findall('[a-z]+', self.ui.text1.toPlainText(), re.IGNORECASE)) == 0:
388 cl = True
389 try:
390 self.app_id = str(self.ui.text1.toPlainText().strip())
391 self.app_hash = self.ui.text2.toPlainText().strip()
392 self.step += 1
393 self.ui.lab1.setText("Введите номер телефона:")
394 if self.nomer != "":
395 self.ui.text1.setText(self.nomer)
396 else:
397 self.ui.text1.setText("")
398 self.ui.lab2.setText("Введите пароль (оставить пустым, если нет):")
399 self.ui.text2.setPlaceholderText("Пароль двухэтапной аутентификации")
400 self.ui.text2.setText("")
401 except Exception as e:
402 print(e)
403 else:
404 self.error = "Поле \"api_id\" должно содержать только цифры, скорее всего вы перепутали и ввели значение \"api_hash\""
405 else:
406 self.error = "Не введён \"api_id\" или \"api_hash\""
407
408
409 if self.step == 2 and cl == False:
410 if self.ui.text1.toPlainText() != "":
411 if self.ui.text2.toPlainText() != "":
412 self.password = self.ui.text2.toPlainText().strip()
413 else:
414 self.password = ''
415 self.step += 1
416 cl = True
417 self.nomer = re.findall(r'[0-9]+', self.ui.text1.toPlainText())[0]
418 self.ui.lab1.setVisible(False)
419 self.ui.text1.setVisible(False)
420 self.ui.text2.setPlaceholderText("")
421 self.ui.lab2.setText("Введите код:")
422 self.ui.text2.setText("")
423
424 self.telethon = telethon_app(self, app_id=self.app_id, app_hash=self.app_hash, number=self.nomer, password=self.password)
425 self.telethon.start()
426 else:
427 self.error = "Не введён номер телефона"
428
429 if self.step == 3 and cl == False:
430 if self.ui.text2.toPlainText() != "":
431 self.code = self.ui.text2.toPlainText().strip()
432
433
434 # except Exception as e:
435 # error = QMessageBox()
436 # error.setWindowTitle("Ошибка")
437 # error.setText(str(e))
438 # error.setIcon(QMessageBox.Warning)
439 # error.exec_()
440
441 def click_button_save(self, send=False):
442 try:
443 if self.ui.saveTextButton.text() == "Сохранить":
444 if self.text_send != '' and self.chat_select != '':
445 if chats_info[self.chat_select] in self.s.chats:
446 id = chats_info[self.chat_select]
447 # if self.text_send != self.s.chats[id]:
448 # self.s.update_chat(self.chat_select, self.text_send)
449 else:
450 # self.s.insert_chat(self.chat_select, self.text_send)
451 self.ui.textEdit.setVisible(True)
452 self.ui.listWidget.setVisible(True)
453 self.ui.sendText.setVisible(True)
454 self.ui.saveTextButton.setVisible(True)
455 self.ui.label.setVisible(True)
456 self.ui.label_2.setVisible(True)
457 self.ui.text1.setVisible(False)
458 self.ui.reg.setVisible(False)
459
460 if send:
461 self.telethon.get_user = True
462 self.telethon.start()
463 if self.ui.saveTextButton.text() == "Отмена":
464 self.ui.check_bot1.setVisible(False)
465 self.ui.check_bot2.setVisible(False)
466
467 self.ui.statusbar.showMessage("")
468 self.ui.sendText.setEnabled(True)
469 self.ui.textEdit.setEnabled(True)
470 self.ui.progressBar.setVisible(False)
471 self.ui.listWidget.setEnabled(True)
472 self.ui.listWidget.setVisible(True)
473 self.ui.saveTextButton.setText("Сохранить")
474 self.telethon.exit()
475
476 self.flag, self.all_count_chat_users, self.check_users_for_chat, self.u_count, self.bot_count, self.send_error, self.users_to_chat, self.message = False, 0, False, 0, 0, 0, [], ''
477
478 except Exception as e:
479 print(e)
480
481
482 def click_button_send(self):
483 self.ui.statusbar.showMessage(f"Чат: \"{self.chat_select}\" Получаю список юзеров чата...")
484 self.ui.sendText.setEnabled(False)
485 self.ui.textEdit.setEnabled(False)
486 self.ui.listWidget.setEnabled(False)
487 self.ui.progressBar.setValue(0)
488 self.click_button_save(send=True)
489
490 while self.check_users_for_chat == False:
491 time.sleep(0.5)
492
493 self.progress = ProgressBar(self)
494 self.progress.sig.connect(self.signal_progress)
495 self.progress.start()
496
497
498 def get_all_params(self):
499 if self.text_send != '' and self.chat_select != '':
500 self.ui.sendText.setEnabled(True)
501 self.ui.saveTextButton.setEnabled(True)
502 else:
503 self.ui.sendText.setEnabled(False)
504 self.ui.saveTextButton.setEnabled(False)
505
506
507 def edit_text(self):
508 if self.ui.textEdit.toPlainText() != '':
509 self.text_send = self.ui.textEdit.toPlainText()
510 else:
511 self.text_send = ''
512
513 self.get_all_params()
514
515 def select_chat(self):
516 selected = self.ui.listWidget.selectedItems()
517 for item in selected:
518 self.chat_select = item.text()
519 if chats_info[item.text()] in self.s.chats:
520 text_rass = self.s.chats[chats_info[item.text()]]
521 if text_rass != "":
522 self.ui.textEdit.setText(text_rass)
523 else:
524 self.ui.textEdit.setText("")
525 if item.text() in self.s.chats:
526 self.ui.textEdit.setText(self.s.chats[item.text()])
527
528 self.get_all_params()
529
530
531
532if __name__ == '__main__':
533 s = sql()
534 s.connect_bd()
535
536 app = QtWidgets.QApplication(sys.argv)
537 window = Application()
538 window.show()
539 app.exec()