Ответы пользователя по тегу Telegram
  • Как работает телеграм бот скачивания видео с ютуба?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Скачивание видео с ютуба - обычная операция. Её реализует, например, проект youtube-dl (который фактически уже загнулся) и его форк yt-dlp (живее всех живых). Они могут работать как отдельный скрипт, так и как модуль к python.

    А так как ботов часто пишут именно на python, то это ещё и достаточно просто реализовать. Получив ссылку, бот вызывает функцию модуля yt_dlp, затем скачанное видео отправляет запросившему.

    Бот также может помнить, какие видео у него уже есть, и отправлять их сразу по file_id. Если у бота большая аудитория, то популярные видео он может отправлять довольно быстро, если их уже хоть кто-то запрашивал.

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

    Также следует отметить, что у хостинга бота может быть доступ в интернет гораздо лучше, чем у обычного пользователя дома.
    Ответ написан
    Комментировать
  • Как отловить callback_data от настраиваемой клавиатуры Телеграм-бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так и должно быть: не-inline клавиатура - это просто помощник по отправке текстовых сообщений с текстом, написанным на кнопке. У них нет и никогда не было никаких callback_data.
    Ответ написан
    Комментировать
  • Возможно ли создать скрип, который после бронирования клиентом будет отписывать ему в telegram(WP)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Telegram невозможно писать по номеру телефона. Ну, точнее, можно с помощью клиентского API найти пользователя по номеру (если не запрещено его настройками приватности) и от пользовательского же аккаунта ему написать. Но это будет нарушением правил Телеграма, и при сколько-нибудь заметной активности в поиске юзеров по номеру Телеграм банит. Я рекомендую отказаться от этой затеи. Телеграм для этого не предназначен.

    Возможность отправки по номеру телефона для бизнесов есть в Viber, WhatsApp, VK/OK, но это платно и бизнесу нужно будет пройти верификацию. Или использовать SMS, которые по определению работают по номеру телефона.

    Из других идей: можно предлагать пользователю подписаться на специального бота, получить у него некий код, который ввести в поле при бронировании, тогда бронирующий сайт сможет запомнить user_id клиента в Телеграме и сможет посылать ему через бота сообщения (пока тот от бота не отпишется). Тоже не шибко удобное решение.

    Большинство небольших сайтов ограничиваются электронной почтой, это проще всего.
    Ответ написан
  • Телеграм бот не корректно отправляет результаты парсинга страницы, как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А как иначе? На каждой итерации цикла содержимое n2 перезатирается очередной строкой, в итоге в конце цикла остаётся последняя. Вероятно, предполагалось, что в n2 нужно добавлять очередную строку.

    Ну и скрипт, вероятно, парсит страницу один раз, при своём запуске, а затем показывает одинаковый неизменный результат (но так как начала скрипта не видно, непонятно, когда запускается этот парсинг).
    Ответ написан
  • Защита от спама Телеграм бота в telebot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-как, так же как и всегда: посмотреть, какое исключение возникает, отловить его и корректно обработать.

    Например, пусть бот упал из-за ZeroDivisionError (ошибка деления на 0), тогда оборачиваем нужную часть бота или даже главный цикл бота в try ... except и как-то это разруливаем:

    while True:
        try:
            bot.infinite_polling()
        except ZeroDivisionError:
            # чуть подождём, чтобы не было проблем, если падает слишком часто и быстро
            time.sleep(5)


    Разумеется, не всегда имеет смысл так делать прям вокруг главной функции, иногда лучше обработать исключение непосредственно в обработчике, где оно возникло, можно даже предпринять какие-то действия, например, добавить вызвавшего сбой пользователя во временнй чёрный список, чтобы игнорировать сообщения от него.
    Ответ написан
    2 комментария
  • From или chat? Где хранятся данные о пользователе telegram api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В текущей реализации Bot API в привате с ботом from.id всегда равно chat.id. Но это не распространяется на всякие групповые чаты.

    Я всегда рекомендую исходить из того, с чем мы имеем дело. Если нужно указать chat_id при отправке сообщения, то нам нужен именно чат, а не пользователь, и следует брать chat.id. Если мы хотим сохранить информацию о пользователе, то правильнее брать from.id. Это, в том числе, повысит шансы на корректную работу бота без доработок в том случае, если Telegram вдруг когда-нибудь откажется от идентичности chat.id и from.id в привате с ботом.
    Ответ написан
    Комментировать
  • Можно ли отправлять в телеграмм вместе разные клавиатуры?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Одновременно нельзя, только в разных сообщениях.
    Ответ написан
    Комментировать
  • Можно ли создать сообщение с инлайн кнопкой, как ответ на другую инлайн кнопку?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно. В обработчике inline-кнопки вызываем стандартный метод API sendMessage, содержащий новую inline-клавиатуру, и пользователь получит ещё одно сообщение с другими кнопками.

    Как вариант, можно отредактировать (editMessage) исходное сообщение (его идентификатор прилетает в inline-обработчик), так тоже часто делают.
    Ответ написан
    Комментировать
  • Бот не реагирует на команды ранее все работало поменял токен не помогло Поможете?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше увеличить интервал, 1 секунда это мало, и при любой ошибке ты скорее всего очень быстро сделаешь второй запрос, который и вызовет подобное поведение. Дефолтные 30 секунд это норма, не надо их менять без очень веских причин.

    Long polling так и работает: запрос длится 30 секунд, если приходит событие - запрос завершается досрочно. Это позволяет и события получать быстро, и сервер слишком часто не дёргать.
    Ответ написан
    Комментировать
  • Telegram: как передать текст в callback?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Общий принцип - нужно запомнить, что для данного конкретного chat_id изменилось состояние, и следующее событие именно в этом chat_id надо обработать иначе, не по умолчанию.

    Во многих библиотеках для этого есть поддержка FSM (FSM - Finite State Machine - конечный автомат). В php-библиотеках я не очень разбираюсь, но можно поискать в сторону "название библиотеки FSM", либо в библиотеке уже есть своё решение этой задачи, либо кто-то уже наверняка над этим задумывался раньше, так что можно найти примеры подобного. В конце концов, написать самому под свои задачи.
    Ответ написан
  • Почему падает бот aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так он пишет в чём проблема: одновременно делаются несколько вызовов getUpdates. Обычно это означает, что с одним токеном запущено больше одного бота.

    Хотя если судить по предыдущим ошибкам, возможно проблема сетевого доступа до Telegram.
    Ответ написан
  • Почему тг бот обрезает сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ответ, который уже помечен галочкой, конечно же поможет решить данную конкретную проблему, но его яркий недостаток в том, что автор вопроса так и не поймёт, в чём же именно проблема состояла. А это очень важно понимать, так как с такой же проблемой можно столкнуться и в других ситуациях.

    Проблема заключается в том, что & является разделителем аргументов GET-запроса. На первом же & в тексте будет считаться, что значение параметра text закончилось, а дальше идёт следующий параметр.

    Чтобы этого не происходило, надо заменять & на %26. Пробел надо менять на +, + менять на %2B, и это далеко не всё, с чем можно столкнуться. В частности, символ # в некоторых применениях является ссылкой на якорь на странице, и http-клиент (например, браузер) не будет передавать в запросе ничего, начиная с этого символа, если его не заменить на %23.

    Чтобы это решить в данном случае, наиболее удобный способ - это передать параметры отдельным аргументом params метода requests.get, чтобы библиотека requests сама грамотно разрулила все необходимые замены. Но если это недоступно для решения какой-то другой задачи - искать как выполнить соответствующее преобразование надо по ключевым словам urlencode/urldecode.
    Ответ написан
    Комментировать
  • Что сделать, чтобы bot ловил handler в отдельном файле?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем импортировать dp из всех файлов без разбору? В реальности будет импортирован последний, остальные будут импортированы впустую. Потому что следующий from импортирует другой dp и по имени dp будет доступен уже другой объект из другого модуля.

    Объект dp надо создать один раз в одном месте. В принципе, можно потом его потенциально импортировать куда угодно.

    Если хочется некоторой модульной структуры, то можно сделать в каждом модуле функцию навроде register_all_handlers(dp) и в ней делать https://docs.aiogram.dev/en/latest/dispatcher/inde.... Соответственно, после импорта всех модулей с хендлерами можно вызвать эту функцию от всех модулей:

    Примерно так
    import menu_commands
    import admin_commands
    import message_handlers
    
    dp = создаём_свой_Dispatcher
    
    menu_commands.register_all_handlers(dp)
    admin_commands.register_all_handlers(dp)
    message_handlers.register_all_handlers(dp)
    Ответ написан
    Комментировать
  • Можно ли получить значение callback_data при реплае?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По-моему, тут типичная попытка решить простую задачу дурацким способом.

    Пользователь получает сообшение с inline-кнопкой. Вот пусть он эту кнопку и нажмёт, а бот получит в callback_query_handler событие с callback_data и обработает. Зачем ещё какое-то цитирование?

    Или тут попытка в кнопке хранить данные, которые при цитировании ещё и якобы можно будет достать? Сама идея дурацкая. Если надо к сообщениям хранить какие-то данные, то их надо хранить в самом боте: в базе данных, в хранилище FSM, да хотя бы in memory в переменных.
    Ответ написан
    Комментировать
  • Можно ли получать ид юзера зная его юзернейм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Средствами Bot API невозможно по username получить id. Серьёзни, никак. Я недавно отвечал на похожий вопрос https://qna.habr.com/q/1224466

    Но в указанном узком сценарии возможно сделать такое, но с оговорками.

    Во-первых, придётся явно сохранять связку username-id для всех пользователей, пишущих боту.

    Во-вторых, не у всех пользователей есть username.

    В-третьих, пользователь может в любой момент сменить свой username, и бот об этом не узнает.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Изначально бот мог писать только тем пользователям, которые по своей инициативе первыми написали боту. После одного из обновлений появилось дополнительное правило: бот может писать пользователям, которые подписаны на канал, в котором данный бот числится админом. А также если пользователь перешёл по ссылке-инвайту и оставил заявку на вступление. Если же пользователь покинул канал, то ни одно из этих условий выполняться не будет, и отправка сообщений таким пользователям невозможна никак.
    Ответ написан
  • Не отправляются фотографии пользователю в библеотеке telebot, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо выкладывать такую длинную простыню, в которой трудно что-либо найти...

    Ссылка https://photos.app.goo.gl/6LckVsFKRfKy9ANu6 не является прямой ссылкой на фотографию, да и страница, на которую эта ссылка делает редирект, не является фотографией.
    Ответ написан
  • Состояния в FSM срабатывают со второго раза. Как это исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как написано - так и работает. Делаем /start - получаем стейт choice и кнопки. Нажимаем "добавить задачу" - получаем стейт add_task и больше в этом обработчике ничего не делается! И только после второго нажатия срабатывает обработчик "добавить задачу" из стейта add_task.

    Правильно убрать вообще обработчик для choice и вместо этого указать условия вида state=choice непосредственно у всех обработчиков.
    Ответ написан
    1 комментарий
  • Как получить ид пользователя по его упоминанию?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Bot API невомзожно получить id пользователя по его имени. Возможно только через получение события, с этим пользователем связанное (например, пользователь написал сообщение, пользователь вступил в группу где есть бот, итд). В полученной информации будет и id пользователя, и его username (только если он у пользователя есть).

    Это можно обойти использованием клиентского API (библиотеки telethon, pyrogram). Но этот API выполняет запросы от реального пользователя Telegram, поэтому если злоупотреблять запросами, можно получить бан не бота, а прям своего живого аккаунта.

    От себя рекомендую этой фигнёй не страдать, у Bot API есть свои понятные сценарии работы, и в рамках них id пользователя можно получить вполне легально именно тогда, когда это имеет смысл в рамках функциональности бота.
    Ответ написан
    Комментировать
  • Как обслуживать юзеров по очереди телебот?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У тебя глобальные urls_list, price_list. Перемести их в функцию sender, они всё равно при каждом её вызове должны инициализироваться заново. Именно это и вызывает сейчас проблемы.
    Ответ написан
    Комментировать