import asyncio
import logging
import os
import random
import hashlib
from tkinter import Tk, Label, Button, filedialog, simpledialog
import pandas as pd
from telethon import TelegramClient, functions, types
from telethon.errors import UsernameNotOccupiedError, RPCError
# Настройка логирования
log_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ‘call_logs.txt’)
logging.basicConfig(
filename=log_file_path,
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# Замените эти значения на свои API ID и API Hash
api_id = ‘26549401’
api_hash = ‘0c541cee86f1f9bf9a53a0e1705994a4’
phone_number = ‘+375336401618’ # Ваш номер телефона
client = TelegramClient('session_name', api_id, api_hash)
class App:
def __init__(self, root):
self.root = root
self.root.title(“Telegram Caller”)
self.label = Label(root, text=“Выберите файл с юзернеймами:”)
self.label.pack(pady=10)
self.button = Button(root, text=“Выбрать файл”, command=self.load_file)
self.button.pack(pady=5)
self.call_button = Button(root, text=“Начать звонки”, command=self.start_calls, state=“disabled”)
self.call_button.pack(pady=5)
self.file_path = None
self.call_duration = 30 # Время дозвона в секундах
self.delay_between_calls = 5 # Задержка между звонками в секундах
self.pause_after_answer = 5 # Пауза после ответа (в секундах)
# Создаем папку для записи звонков
if not os.path.exists('call_records'):
os.mkdir('call_records')
def load_file(self):
self.file_path = filedialog.askopenfilename(
filetypes=
)
if self.file_path:
self.label.config(text=f“Файл выбран: {self.file_path}”)
self.call_button.config(state=“normal”)
def start_calls(self):
if self.file_path:
self.root.destroy()
asyncio.run(self.make_calls())
async def make_calls(self):
try:
await client.start()
if not await client.is_user_authorized():
code = simpledialog.askstring(“Авторизация”, “Введите код, полученный по SMS:”)
await client.sign_in(phone_number, code)
logging.info(“Авторизация успешна. Начало чтения файла…”)
df = pd.read_excel(self.file_path)
# Проверяем наличие столбца ‘username’
if ‘username’ not in df.columns:
logging.error(“Файл не содержит столбца ‘username’”)
return
usernames = df.tolist()
logging.info(f“Количество юзернеймов для обзвона: {len(usernames)}”)
for username in usernames:
if not client.is_connected():
logging.warning(“Переподключение к Telegram…”)
await client.connect()
logging.info(f“Попытка звонка: {username}”)
call_status = “failed”
try:
user = await client.get_input_entity(username)
# Генерация g_a_hash
g_a_hash = hashlib.sha256(os.urandom(16)).digest()
# Отправка запроса на звонок
await client(functions.phone.RequestCallRequest(
user_id=user,
random_id=random.randint(0, 0x7fffffff),
g_a_hash=g_a_hash,
protocol=types.PhoneCallProtocol(
udp_p2p=True,
udp_reflector=True,
min_layer=170,
max_layer=170,
library_versions=
),
video=False # Можно установить True для видеозвонка
))
logging.info(f'Звонок совершен {username}')
call_status = “initiated”
# Удержание соединения на заданное время
await asyncio.sleep(self.call_duration)
except UsernameNotOccupiedError as e:
logging.error(f'Некорректный username: {username} ({e})')
except RPCError as e:
logging.error(f'Ошибка при звонке {username}: {e}')
except Exception as e:
logging.error(f'Не удалось позвонить {username}: {e}')
finally:
logging.info(f'Звонок завершен {username}')
await asyncio.sleep(self.delay_between_calls)
logging.info(“Все звонки завершены.”)
except Exception as e:
logging.error(f“Ошибка при выполнении звонков: {e}”)
finally:
if client.is_connected():
await client.disconnect()
logging.info(“Отключение от Telegram…”)
logging.info(“Приложение завершено.”)
if __name__ == “__main__”:
logging.info(“Запуск приложения…”)
root = Tk()
app = App(root)
root.mainloop()
вот мой код, когда я его запускаю и выбираю таблицу со столбиком username то код совершает поочереди звонок каждому пользователю, это работает хорошо. Но вот как только челоек поднимает трубку на мой звонок - он сразу же сбрасывается