• Как получить ID юзеров телеграм бота через aiogram?

    SoreMix
    @SoreMix
    yellow
    Такой опции у ботов нет. Только по новой собирать
    Ответ написан
  • Как удалить сообщение о закрепе?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Вообще, как вариант, если бот работает вот так без лонгполлинга, то можно получить последние апдейты, там уже циклом проходим по всем апдейтам, и если в нём есть поле pinned_message + совпадают параметры, то удаляем его

    if pinResponse:
        updates = requests.get(f'https://api.telegram.org/bot{botToken}/getUpdates', params={'allowed_updates': 'message'}).json()
    
        for update in updates['result']:
            if update['message'].get('pinned_message'):
                if update['message']['pinned_message']['message_id'] == messageId and update['message']['chat']['id'] == chatId:
                    requests.post(f'https://api.telegram.org/bot{botToken}/deleteMessage', json={'chat_id': chatId, 'message_id': update['message']['message_id']})
    Ответ написан
  • Не пересылает сообщения что делать?

    SoreMix
    @SoreMix
    yellow
    1. Вы сравниваете строку и список message.text == back
    2. Функция review будет вызвана только если текст сообщения равен Оставить отзыв✨, поэтому проверка на текст К меню никогда не будет True

    Ну и не хватает приложенного класса с описанием стейтов. И как не работает, управление вообще не переходит в другую функцию?

    Если хотите обрабатывать кнопку назад, которая есть в нескольких функциях, можно воспользоваться куском из доки по aiogram:

    # You can use state '*' if you need to handle all states
    @dp.message_handler(Text(equals='К меню', ignore_case=True), state='*')
    async def cancel_handler(message: types.Message, state: FSMContext):
        """
        Allow user to cancel any action
        """
        current_state = await state.get_state()
        if current_state is None:
            return
    
        # Cancel state and inform user about it
        await state.finish()
        # And remove keyboard (just in case)
        await message.reply('Cancelled.', reply_markup=types.ReplyKeyboardRemove())


    По итогу он будет отлавливать любой стейт, в котором есть текст к меню. Ну и там уже делаете финиш или что потребуется.
    Ответ написан
    Комментировать
  • Почему не видит модуль dotenv?

    SoreMix
    @SoreMix
    yellow
    pip install python-dotenv
    Ответ написан
    Комментировать
  • Как реализовать отправку видео-сообщений через python ботом в telegram?

    SoreMix
    @SoreMix
    yellow
    Выбираете любую удобную для вас библиотеку, или вообще на реквестах
    Вызываете метод sendvideonote
    Передаете в него нужные параметры

    https://core.telegram.org/bots/api#sendvideonote
    Ответ написан
  • Не отображаются кнопки в телеграм боте (Python). Где ошибка?

    SoreMix
    @SoreMix
    yellow
    reply_markup=markup, который должен передаваться в метод send_message, передается в format()

    bot.send_message(chat_id, 'Привет, {0.first_name}:)Бла, бла, бла.\nВызовите /help для получения справки'.format(input_message.from_user), reply_markup=markup)
    Ответ написан
    1 комментарий
  • Используя Python Selenium почему не нажимается нечего в metamask?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    А в консоль ошибки не валятся разве? Метамаск протектером накрыт, он не даст из селениума ничего с собой делать. Даже если ошибка сейчас не в нём,
    spoiler
    ошибки в вопросе ведь нет
    , рано или поздно всё равно в протект упрётся
    Ответ написан
  • Как выключить хеширование инлайн результатов?

    SoreMix
    @SoreMix
    yellow
    Поставить параметр cache_time в нужное число в секундах в вызове метода answerInlineQuery

    https://core.telegram.org/bots/api#answerinlinequery
    Ответ написан
    Комментировать
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    SoreMix
    @SoreMix
    yellow
    @bot.callback_query_handler(func=lambda call: True)
    def chekCallData(call):

    и
    @bot.callback_query_handler(func=lambda call: True)
    def chekCallData2(call):


    Имеют одинаковые декораторы. Если в коде несколько одинаковых декораторов, вызывается тот, который был объявлен первым
    Ответ написан
    2 комментария
  • Не сохраняет обновленные данные, после машины состояний, как быть?

    SoreMix
    @SoreMix
    yellow
    teacher_id нужно запоминать на моменте edit_teacher_handler, так же сохранив его в FSM.

    На моменте
    Получаем идентификатор преподавателя из message.text
    в message.text ведь лежит номер класса. К тому же наверное в БД ID является числом, а не строкой. Пробовали смотреть какие данные приходят в update_teacher?
    Ответ написан
    Комментировать
  • Как обойти ошибку JSONDecodeError?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Значит не в таком формате возвращает.

    Что выводит?
    response = requests.post(url, headers=headers, json=data)
    print(response.text)
    Ответ написан
  • Как передать переменную в следующие шаблоны django?

    SoreMix
    @SoreMix
    yellow
    Почему бы не добавить еще одну view и urlpattern который будет обрабатывать URL вида enroll/<slug:service_name>.
    Либо раз уж мы находимся на странице с услугой, перенести форму сразу туда. Список услуг->Услуга->Запись на услугу как-то много кликов. Список Услуг -> Услуга + Запись на услугу

    ps. не пишу на django
    Ответ написан
    3 комментария
  • Как удалить сообщение в тг чате, если в нём присутствует определеное слово?

    SoreMix
    @SoreMix
    yellow
    Вообще всё должно работать, при условии, что этот обработчик зарегистрирован раньше всех других.
    Но работать он не будет если допустим активен какой-то FSM, тогда управление уйдет в него.

    Наверное, лучше было бы создать Middleware, и там уже обрабатывать. Для версии 2.х очень условно будет что-то вроде:
    class BadWordFilterMiddleware(BaseMiddleware):
    
        async def on_process_message(self, message: types.Message, data: dict):
    
            badwords = ['привет', 'пока']
    
            message_text = message.text if message.text else message.caption
    
            if message_text:
                message_text_words = message_text.lower().split()
                for badword in badwords:
                    if badword in message_text_words:
                        await bot.delete_message(message.chat.id, message.message_id)
                        raise CancelHandler()
                        return
    
    dp.middleware.setup(BadWordFilterMiddleware())
    Ответ написан
    Комментировать
  • Как правильно получить API Google для проверок сайта на безопасность?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    API токен должен передаваться в заголовке X-goog-api-key
    Ответ написан
    Комментировать
  • Как сделать постоянную запись с новой строки Python?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Он не меняет первую строку, а переписывает файл. Режим открытия файла w подразумевает под собой сначала очистку файла, а потом запись в него. Если хотите дозаписывать данные, есть режим a, соответственно, он и нужен
    test = open("save.txt", 'a', encoding = 'utf-8')

    копипаста режимов

    r - открывает файл только для чтения,
    w - открыт для записи (перед записью файл будет очищен),
    x - эксклюзивное создание, бросается исключение FileExistsError, если файл уже существует.
    a - открыт для добавления в конец файла (на некоторых Unix-системах пишет в конец файла вне зависимости от позиции курсора)
    + - символ обновления (чтение + запись).
    t - символ текстового режима.
    b - символ двоичного режима (для операционных систем, которые различают текстовые и двоичные файлы).
    Ответ написан
    1 комментарий
  • Почему у меня ошибка модуля discord-ui?

    SoreMix
    @SoreMix
    yellow
    Либа в архиве уже год, а последний релиз и того был полтора года назад, и зависит она от такого же трупа, давно поотваливалось всякое на последних версиях.

    Можно попробовать вырезать этот discord.StoreChannel из файлов, заменив StoreChannel на какой нибудь свой типа
    class StoreChannel(_BaseGuildChannel):
        type: Literal[13]
        bitrate: int
        user_limit: int
        rtc_region: NotRequired[Optional[str]]
        topic: NotRequired[str]

    Может схавает
    Ответ написан
    4 комментария
  • Как отправить группу фото через библиотеку aiogram?

    SoreMix
    @SoreMix
    yellow
    Когда приходит медиагруппа, она приходит как несколько ивентов. Если сообщение является частью медиагруппы, то в объекте есть поле media_group_id. Как не сложно догадаться, оно отвечает за ID медиагруппы, к которой относится аттач в текущем message.

    Если поставить брейкпоинты и посмотреть что приходит, можно увидеть следующее. В данном примере я отправил боту два фото в медиагруппе:
    (Pdb) message
    <Message {"message_id": 3722, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADcwADLwQ", "file_unique_id": "AQADWMcxG4s6SUt4", "file_size": 526, "width": 90, "height": 31}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADbQADLwQ", "file_unique_id": "AQADWMcxG4s6SUty", "file_size": 3234, "width": 320, "height": 111}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADeAADLwQ", "file_unique_id": "AQADWMcxG4s6SUt9", "file_size": 6482, "width": 720, "height": 250}]}>
    (Pdb) continue
    -> photos = message.photo
    (Pdb) message
    <Message {"message_id": 3723, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3MAAy8E", "file_unique_id": "AQADXscxG4s6SUt4", "file_size": 955, "width": 90, "height": 90}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA20AAy8E", "file_unique_id": "AQADXscxG4s6SUty", "file_size": 6024, "width": 320, "height": 320}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3gAAy8E", "file_unique_id": "AQADXscxG4s6SUt9", "file_size": 9207, "width": 512, "height": 512}]}>
    (Pdb)


    Видно, что ID файлов разное, поэтому поздравляю всех кто
    проверяли на других библиотеках, говорят, это ошибка API
    . Всё работает штатно и так есть уже несколько лет, если мне не изменяет память.
    (тем не менее мне самому не нравится подход Telegram к такому типу сообщений. У Дурова всегда неплохие API были, зачем тут так сделано мне не ясно, возможно, для этого есть умное объяснение)

    А что делать то?
    1. В обработчик приходит сообщение, содержащее медиагруппу
    2. Заносите ID файла и ID медиагруппы куда нибудь в БД / FSM / etc
    3. Как говорится tricky part: одним из способов детекта, когда же кончится чудесная волна сообщений с одинаковой медиагруппой, является проверка по времени. Т.к. это по сути одно и то же сообщение, то апдейты прилетают одинаково по времени. Соответственно, после того как у вас пришло сообщение, у которого ID медиагруппы уникально, то есть такую еще не обрабатывали до этого, ставите "таймер" допустим на 1-2 секунды. На протяжении этого времени скрипт успеет отловить все файлы от этого сообщения.
    4. Пока ловятся ваши апдейты, так же, в FSM / БД / etc. заносите ID файлов
    5. По окончании таймера, достаете все ваши file ID, делаете из них своё сообщение, отправляете юзеру, а саму группу удаляете из FSM / БД

    Есть готовые решения для обработки, не отвечаю за них, но вот:
    https://github.com/WhiteMemory99/aiogram_album_han...

    Как пример можете просто взять этот Middleware, либо просто переписать свой аналог. Могу и сюда приложить какое нибудь решение как освобожусь, но вряд ли оно будет отличаться чем-то от этого
    Ответ написан
  • Если отправитель удалил сообщение в телеграм боте - удалится ли оно у получателя [модератора, который получает обновления от бота.]?

    SoreMix
    @SoreMix
    yellow
    Если бот был выключен, то нет. Если работал то да. Другое дело будет ли кто-то вручную отсматривать кучу сообщений
    Ответ написан
    Комментировать
  • Кто может помочь с телеграм ботом на библиотеке telebot?

    SoreMix
    @SoreMix
    yellow
    Почему бы не удалить это чудо
    @bot.callback_query_handler(func=lambda call: call.data == 'reg')
            def start_registration_main(call):
                start_registration()


    И не сделать
    @bot.callback_query_handler(func=lambda call: call.data == 'reg')
    def start_registration(call):


    И вообще, нужно вынести все функции из других функций. Не объявляйте новые функции внутри других. Ради чего? Поэтому и не работает ничего
    Ответ написан
    Комментировать
  • Как создать реферальную систему в Discord боте?

    SoreMix
    @SoreMix
    yellow
    Помимо бота нужно будет создать мини сервер, который будет заниматься генерацией ссылок, их обработкой, и обновлением базы данных бота. Ну и наверное домен какой никакой нужен, чтобы по ссылкам водить. Если бот работает просто через longpolling, то это нужно будет. Если он уже крутится в каком нибудь веб приложении на вебхуках, то можно и там что нибудь приделать.

    В БД должно быть две таблицы:
    1. Дискорд бота, для хранения кол-ва переходов и тд
    2. Сервера, для хранения реф ссылок

    А так будет примерно следующее:

    1. Пользователь отправляет в чат .getref
    2. Обработчик бота получает команду. В обработчике отправляем запрос на наш API эндпоинт для генерации ссылок. В теле запроса лежит ссылка назначения
    3. API генерирует строку (допустим 8 символов), проверяет на уникальность и заносит в БД уникальную строку и ссылку назначения
    4. API возвращает уникальную строку, склеивая ее с нашим доменом. Пример: https://domain.com/url/XXX
    5. В обработчик возвращается ссылка, отправляется в чат
    6. Пользователь копирует ссылку, идёт её разбрасывать
    7. На сервер так же добавляем обработчик ссылок вида /url/url_hash
    8. В этом обработчике, при получении GET запроса, обновляем число рефералов у соответствующего юзера в БД
    9. Из БД дергаем ссылку назначения по нашему хэшу и возвращаем редирект на нёё
    10. Пользователь переадресован на нужную ссылку, рефералы записаны


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