Ответы пользователя по тегу Telegram
  • OSError: [Errno 22] Invalid argument Как исправить ошибку?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Хм…
    Вы полагаете, кому-то будет интересно лопатить ваши 10К символов и дебажить очередного бота?
    Это задание, а не вопрос.

    Как исправить ошибку?
    Дебажить. Разбираться, как всё работает и как устроено, делить всё на блоки, обвешивать тестами…
    А как ещё?
    Ответ написан
    5 комментариев
  • Почему exe-файл бота на aiogram запускается не на всех компьютерах?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Почитайте тут. Вроде ваш случай там описан. Или очень похожий.
    Ответ написан
    Комментировать
  • Код не работает, что делать?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Поигрался со своим чатом,
    короче, вот что получилось
    import asyncio
    
    from pyrogram import Client
    import shelve
    import random
    
    from secret.config import Config
    TEXTS = ['Круто!', 'Nice!!!!', 'Oh my god']
    
    config = Config()
    api_id = config.api_id
    api_hash = config.api_hash
    phone_number = config.phone
    PUBLIC = config.title
    chat_id = config.chat_id
    name = config.name
    processed_messages = shelve.open('processed_messages.db', writeback=True)
    app = Client(name, api_id, api_hash, phone_number=phone_number)
    
    
    async def main():
        async with app:
            public = await app.get_chat(PUBLIC)
            async for msg in app.get_chat_history(chat_id, limit=100):
                if msg.from_user:  # если у нас есть параметр from_user
                    any_sender_id = msg.from_user.id  # присваеваем ID юзера
                else:  # иначе
                    any_sender_id = msg.sender_chat.id  # присваеваем ID канала или чата
                if any_sender_id == public.id:  # проверяем что это нужный паблик
                    if str(msg.id) in processed_messages:
                        print(f'Пропускаем уже обработанное message_id={msg.id}')
    
                    else:
                        processed_messages.update({str(msg.id): True})
                        print(f'Обработка message_id={msg.id}')
                        text = random.choice(TEXTS)
                        print(text)
                        result = await app.send_message(chat_id, text, reply_to_message_id=msg.id)
                        processed_messages.update({str(result.id): True})
    
                        await asyncio.sleep(1)  # пауза, чтоб не банили за флуд
    
    
    app.run(main())
    из твоего кода.
    Конечно, это всё такое... ну... прототип. Пользоваться этим "в лоб" я бы не советовал.
    Ответ написан
    Комментировать
  • Pyrogram bot: как отправить фото по айди?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Полагаю, в лоб никак. В документации Telegram сказано, что big_file_idможно использовать только для download.
    В общем, видимо, вам придется их куда-то скачивать (в память?) и затем отдавать в другой чат.
    Ответ написан
    3 комментария
  • Бот не считает формулу. Как исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как я понял, когда бот начинает работать, он обрабатывает зарегистрированные в нем хэндлеры, и ваш хэндлер lake перехватывает всё, кроме явно start и help, поэтому дальше него и не проходит. Я глубоко не вникал, возможно этот момент я неправильно понял.
    Но, в принципе, можно обойтись и этим одним хндлером, просто правильно обрабатывать то, что в него приходит. А приходить в него должно либо выбор кнопки, либо число.
    При выборе кнопки фиксируем номер кнопки и ждем число. Если пришло число - вычисляем, возвращаем, сбрасываем номер кнопки и всё сначала.

    lake_number = 0
    
    
    @dp.message_handler()
    async def lake(message: types.Message):
        global lake_number
        if message.text == 'Бассейн №1':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №1.')
            lake_number = 1
        if message.text == 'Бассейн №2':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №2.')
            lake_number = 2
        if bool(lake_number) and message.text.isdigit():
            b = int(message.text)
            if lake_number == 1:
                h = 8 - b
                v = (h / 3)
                level = v / 16000 * 100  # тут в формуле где-то ошибка, поэтому я ее просто убрал
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v) + "м3. Глубина:" + str(h) + "м. Наполнение: " + str(
                                           level) + "%"))
            if lake_number == 2:
                h2 = 5 - ((b - 1) * float(0.7))
                s2 = (90 - (b * 0.52)) * (100 - (b * 0.52)) / 2
                n = sqrt(2500 * s2)
                s1 = 1
                g = s1 + n + s2
                v2 = (h2 / 3) * g
                level2 = v2 / 17000 * 100
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v2) + "м3. Глубина:" + str(h2) +
                                           "м. Наполнение: " + str(level2) + "%"))
            lake_number = 0
            await bot.send_message(message.from_user.id, "Попробуй еще...")
    Ответ написан
    4 комментария
  • В чем проблема с обновлением переменных?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    О какой именно функции идёт речь, их там три.
    Впрочем, функция updateData вообще не вызывается, а функция rscr объявлена после функции, из которой вызывается, и не доступна из той функции. Вызовет ошибку not defined. До неё просто дело не дошло. Её надо объявить до той функции, из которой вызывается.

    каждый вызов я ее личные переменные приравниваю к общим, изменяю так же

    Этого не происходит нигде. Функция updateData не вызывается в принципе.

    Что касается собственно ошибки, тут есть тонкость.
    С одной стороны, вроде бы функция должна видеть переменную isLogin, объявленную в глобальном пространстве имён.
    isLogin = 0
    r = 1
    def testf():
        print(isLogin)
        
        if isLogin == 0:
            print(1)
    testf()

    Но ты вроде как объявляешь в области видимости функции другую переменную с тем же именем. И она формально перекрывает глобальную внутри функции.
    Но фокус в том, что ты объявляешь локальную переменную после того, как обращаешься к ней. Об этом и ошибка сообщает.

    Не, даже не так. Ты объявляешь наличие локальной переменной, но ветка с этим объявлением не выполняется; поэтому она вроде есть; но дело до неё не дошло. Глобальная перекрыта, а до локальной не дошло.
    .
    isLogin = 0
    r = 1
    def testf():
        if r == 0:
            isLogin = 1  # тут ты объявляешь внутреннюю переменную, которая перекрывает глобальную. 
        if isLogin == 0:
            print(1)
    testf()

    Надо так:
    r = 1
    def testf():
        isLogin = 0
        if r == 0:
            isLogin = 1 
        if isLogin == 0:
            print(1)
    testf()

    или хотя бы так:
    isLogin = 0
    r = 1
    def testf():
        global isLogin
        if r == 0:
            isLogin = 1
        if isLogin == 0:
            print(1)
    testf()
    Ответ написан
  • Как проверить слово, которое пользователь написал в сообщении в телеграме, на наличие его в базе данных?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Что касается анаграмм. Положим, у вас есть целевое слово и словарь. Надо из словаря выбрать все слова, которые можно составить из букв целевого слова.
    Если решать «в лоб», как у вас, то надо получить множество вариантов перестановок букв целевого слова, а затем произвести логическое умножение множества полученного и множества подходящих слов из словаря.
    Проблема тут в том, что это будут большие множества и всё это будет тормозить.

    Надо сделать по-другому:
    словарь надо индексировать, а именно - получить для каждого слова индекс его на алфавите, отображающий количество каждой буквы алфавита в слове.
    Затем берёте целевое слово, считаете для него индекс и затем из словаря выбираете слова с аналогичным индексом. Создание первичного индекса займёт время, зато потом всё будет почти мгновенно.
    Ответ написан
  • Как разделить код телеграм бота на несколько файлов?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Коротко говоря, надо разделить код на осмысленные блоки по темам, создать для каждой темы свой модуль и разнести по модулям выбранные блоки. Затем в основной модуль импортировать остальные модули, либо отдельные функции из тех модулей.

    Сначала попробуйте на какой-либо простой модели из трех-четырех функций.
    Ответ написан
    Комментировать
  • Как отправить сообщение зная id пользователя в Telegram?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Простой гуглинг позволил быстро найти на stackowerflow следующее:

    from telethon import utils
    real_id, peer_type = utils.resolve_id(-1001234567891)
    
    print(real_id)  # 1234567891
    print(peer_type)  # <class 'telethon.tl.types.PeerChannel'>
    
    peer = peer_type(real_id)
    print(peer)  # PeerChannel(channel_id=1234567891)


    Но вам лучше изучить этот вопрос подробнее, там есть продолжение, т.к. есть нюансы.
    Ответ написан
  • В чем причина ошибки TypeError?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Сам автор telethon на github пишет примерно
    следующее
    Ohh. Now I read the original issue more carefully (sorry!). Indeed that documentation line is wrong. .get_input_entity is intended when you're going to use the input version of something, not to just get the ID. If you just want the ID of yourself you should use client.get_me(input_peer=True).user_id instead. It should not be changed though because the method is fine, it returns an InputPeer (which might not have the ID).

    Думаю, вам надо копать в этом направлении. Не всегда официальная документация таких проектов корректна.
    Ответ написан
    1 комментарий
  • Как передать результат функции в следующий шаг в телеграм боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    if​ ​bool(res​):
        step_2 = ​res​[​0]
    else​:
        ​bot​.​send_message​(​message​.​chat​.​id​, ​'Проверьте адрес'​)
    bot.register_next_step_handler(message, step_2)
    Ответ написан
  • [Aiogram] При одновременном запросе или флуде в базу данных выдает ошибку.?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    тут почитайте, может поможет.
    Ответ написан
    Комментировать
  • Как сохранять фото от пользователя в Телеграм боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Так прочти deprecation warning. Это не ошибка, а предупреждение, что данный параметр в будущих версиях будет исключен, а вместо него будут введены другие параметры, и сказано, какие именно.
    Работает - и отлично.
    Ответ написан
    3 комментария
  • Как сделать выполнение функции после app.start()?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Надо, чтобы какой-то механизм из app вызвал hi по какому-нибудь событию.
    К примеру, как-то так:
    class Client:
        def start(self):
            print('client started')
            hi()
            print('client finished')
    
    
    def hi():
        print("Привет")
    
    
    app = Client()
    
    app.start()
    Ответ написан
    2 комментария
  • Как получить user_id из базы данный sqlite, проверить наличие подписки и отправить этому человеку сообщение в переписку с ботом?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Не понял, в чём проблема? В БД хранить для каждого userid поле «дата и время окончания подписки». Надо сделать рассылку - перебираешь все userid и тем, у кого это поле больше текущего datetime, отправляешь послание; остальным не отправляешь.
    Ответ написан
    Комментировать
  • Как реализовать очередь сообщений?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Храните в БД все заявки вообще, сразу заносите их. Просто добавьте булево поле «рассмотрено» и булево поле «одобрено» (по-умолчанию оба поля false). Когда админ добирается до рассмотрения заявок, он получает заявки, где «рассмотрено» == false, и после рассмотрения оно становится true, а «одобрено» либо останется false, либо станет true.
    Ответ написан
  • Как сделать торговую площадку-бота на python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Надо правильно сформулировать задачу, и нанять специалиста для подготовки по вашему описанию техзадания. Также тут неплохо бы привлечь специалиста по UI/UX для проектирования внятных человекомашинных интерфейсов.
    Утвердить техзадание, затем нанять специалистов для написания программного комплекса по техзаданию. Также нанять тестировщиков для тестирования кода, а также нанять специалиста (девопса) для развертывания комплекса.
    Не забыть нанять бухгалтера для бухучёта и налогов.
    Это не всё, но как-то так…
    Ответ написан
    Комментировать
  • Как достать несколько одинаковых значений из листа?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Судя по тому, что вы делаете, есть ощущение, что недостаточно понимания ни о структурах данных вообще, ни о типах и особенностях коллекций в Python.
    Это примерно первая половина первого тома вот этой книжки.

    Рекомендовать что-то практическое сейчас… не знаю. Кстати, совсем недавно пробегало несколько похожих вопросов. Вот, к примеру. Но сможете ли вы применить что-то к своему случаю…
    Ответ написан
    3 комментария
  • Почему Telethon выдает Traceback ValueError: too many values to unpack (expected 4)?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Точно сказать не могу, но подозреваю, что при создании экземпляра client класса TelegramClient вы передаёте в качестве параметров не то, что ожидает класс. Возможно, слишком много параметров передаётся - класс не может их все развернуть куда следует.
    Подробно надо смотреть сам класс, что и как он принимает; и, конечно, смотреть, что вы в него передаёте из своего конфига.
    Ответ написан
    Комментировать
  • Почему не приходит request?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Вы где-то что-то не то делаете. Прижмите голову к монитору, сидите не двигайтесь; штатные экстрасенсы toster-а придут на работу и считают все недостающие данные и сообщат более полный ответ.
    Ответ написан
    Комментировать