Ошибка вызова модуля

в данном коде получаю такую ошибку подскажите, что я делаю не так

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 шт):

Автор решения: V-Mor

Ошибка, если перевести, говорит Вам "Объект типа 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 – метод, а использовать метод объекта нужно через точку, как Вы потом делаете с остальными методами в строках ниже.

→ Ссылка
Автор решения: insolor
  1. Нужно убрать импортирование модуля client в строке from telethon import TelegramClient, sync, events, client. Вам нужен не этот модуль, а объект client, который вы создаете в функции login. Ошибка как раз возникает из-за того, что вы пытаетесь вызвать этот модуль как функцию. Объект TelegramClient поддерживает такой вызов, а модули - нет.
  2. Нужно каким-то образом передать объект 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
→ Ссылка