Ошибка вызова модуля
в данном коде получаю такую ошибку подскажите, что я делаю не так
def spam():
usernames = open('tg-usernames.txt', 'r')
username: str
for username in usernames:
try:
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
sleep(1)
except PeerFloodError:
client.flood_sleep_threshold = 0
report1.write('Слишком много запросов к телеграмме')
sleep(30)
continue
except Exception as e:
sleep(30)
report1.write('Ошибка: ', e)
report1.write("Пытаемся продолжить...")
continue
Вот сама ошибка
File "E:\Spamer\spamgraf.py", line 68, in spam
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
TypeError: 'module' object is not callable
Ниже на всякий случай предоставляю полный код программы
from tkinter import *
from telethon import TelegramClient, sync, events, client
from tkinter import simpledialog
from time import sleep
import random
import tkinter as tk
from telethon.errors import PeerFloodError
from telethon.tl.functions.messages import SendMessageRequest
class Report(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent)
scrollbar = tk.Scrollbar(self)
scrollbar.pack(side='right', fill='y')
self._text = tk.Text(self, state=tk.DISABLED, *args, **kwargs)
self._text.pack(side='left', fill='both', expand=1)
scrollbar['command'] = self._text.yview
self._text['yscrollcommand'] = scrollbar.set
def write(self, text) -> object:
self._text.configure(state=tk.NORMAL)
self._text.insert(tk.END, text)
self._text.configure(state=tk.DISABLED)
self._text.yview_moveto('1.0') # Прокрутка до конца вниз после вывода
def clear(self):
self._text.configure(state=tk.NORMAL)
self._text.delete(0.0, tk.END)
self._text.configure(state=tk.DISABLED)
def flush(self):
# Метод нужен для полного видимого соответствия классу StringIO в части вывода
pass
def login2(client, phone):
client.send_code_request(phone)
result = simpledialog.askstring("Введите полученный код", "Введите полученный код")
# Если что-то введено, посылаем команду
if result:
client.sign_in(phone, result)
def login():
api_id = (entry1.get())
api_hash = (entry2.get())
phone = (entry3.get())
client = TelegramClient('Spam-session', api_id, api_hash)
client.connect()
client.flood_sleep_threshold = 0
if not client.is_user_authorized():
login2(client, phone)
def spam():
usernames = open('tg-usernames.txt', 'r')
username: str
for username in usernames:
try:
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
sleep(1)
except PeerFloodError:
client.flood_sleep_threshold = 0
report1.write('Слишком много запросов к телеграмме')
sleep(30)
continue
except Exception as e:
sleep(30)
report1.write('Ошибка: ', e)
report1.write("Пытаемся продолжить...")
continue
root = Tk()
root.title('TG Spamer')
root.geometry('800x600')
# entry block
entry1 = Entry(root, width=15)
entry2 = Entry(root, width=32)
entry3 = Entry(root, width=15)
report1 = Report(root, height=15, width=15)
# label block
label1 = Label(root, text='Введите api id')
label2 = Label(root, text='Введите hash api')
label3 = Label(root, text='Введите номер телефона')
label4 = Label(root, text='Состояние работы')
# button block
button1 = Button(root, text=u'Вторая кнопка')
button1.config(command=login)
button2 = Button(root, text=u'Вторая кнопка')
button2.config(command=spam)
# frame block
report1.place(x=650, y=50)
# button block
button1.place(x=650, y=500)
button2.place(x=500, y=500)
# label block
label1.place(x=50, y=50)
label2.place(x=50, y=100)
label3.place(x=50, y=150)
label4.place(x=650, y=25)
# entry block
entry1.place(x=200, y=50)
entry2.place(x=200, y=100)
entry3.place(x=200, y=150)
root.mainloop()
spam()
report1.write("All OK")
Код в котором это строка работает нормально:
client = TelegramClient('Spam-session', api_id, api_hash)
client.start()
client.connect()
client.flood_sleep_threshold = 0
if not client.is_user_authorized():
client.send_code_request(phone)
client.sign_in(phone, input('Введите полученный код: '))
def spam():
usernames = open('tg-usernames.txt', 'r')
for username in usernames:
try:
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
sleep(300)
except PeerFloodError:
client.flood_sleep_threshold = 0
print("Cлишком много запросов к Телеграму.")
sleep(30)
continue
except Exception as e:
sleep(30)
print("Ошибка:", e)
print("Пытаемся продолжить...")
continue
Ответы (2 шт):
Ошибка, если перевести, говорит Вам "Объект типа module нельзя вызвать, как функцию, например". Значит Вы где-то пытаетесь вызвать объект как функцию. И в тексте ошибки у Вас написана строка, где Вы это делаете:
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
client – объект типа module, а Вы зачем-то после него ставите скобки (а с помощью скобок осуществляется вызов функции, что Вам и говорит интерпретатор). Сдаётся мне, что нужно сделать так:
client.SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines()))
ибо SendMessageRequest – метод, а использовать метод объекта нужно через точку, как Вы потом делаете с остальными методами в строках ниже.
- Нужно убрать импортирование модуля
clientв строкеfrom telethon import TelegramClient, sync, events, client. Вам нужен не этот модуль, а объектclient, который вы создаете в функцииlogin. Ошибка как раз возникает из-за того, что вы пытаетесь вызвать этот модуль как функцию. ОбъектTelegramClientподдерживает такой вызов, а модули - нет. - Нужно каким-то образом передать объект
loginмежду функциями. Это можно сделать с помощью глобальных переменных:
client = None # Задаем начальное значение, чтобы можно было проверить, заполнена переменная или нет
def login():
# Указываем, что в этой функции client - это имя глобальной переменной,
# а не локальной, и мы ее собираемся перезаписывать:
global client
api_id = (entry1.get())
api_hash = (entry2.get())
phone = (entry3.get())
client = TelegramClient('Spam-session', api_id, api_hash)
client.connect()
client.flood_sleep_threshold = 0
if not client.is_user_authorized():
login2(client, phone)
def spam():
if client is None:
# Еще не логинились - выходим, или можно сделать вывод сообщения об ошибки
return
usernames = open('tg-usernames.txt', 'r')
username: str
for username in usernames:
try:
client(SendMessageRequest(username, random.choice(open('input-text.txt', encoding='utf8').readlines())))
sleep(1)
except PeerFloodError:
client.flood_sleep_threshold = 0
report1.write('Слишком много запросов к телеграмме')
sleep(30)
continue
except Exception as e:
sleep(30)
report1.write('Ошибка: ', e)
report1.write("Пытаемся продолжить...")
continue