• Как пробросить webhook Telegram бота на домашний компьютер через виртуальный сервер с OpenVPN и Docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Первое и очень простое решение - можно вообще не использовать вебхуки для тестового бота. Например, пусть у нас будет в конфиге опция, по которой мы запускаем либо сервер для вебхуков, либо поллинг:

    import config
    
    if __name__ == '__main__':
        if config.POLLING:
            ... start_polling
        else:
            start_webhook(...


    Всё-таки основная часть бота - его бизнес-логика. Каждый раз проверять работу его вебхуков необязательно.

    Если всё же хочется вебхуков, то организуем VPN по любой инструкции, коих тысячи, получаем туннель с парой IP. Например, 10.10.10.1 на сервере и 10.10.10.2 локально. На сервере поднимаем nginx, в котором настраиваем что-то типа
    location /path/to/api_test {
      proxy_pass http://10.10.10.2:порт/path/to/api_test
    }


    Обязательно настраиваем https, можно с Let's Encrypt, но можно и с самоподписанным сертификатом. В последнем случае надо будет загрузить этот сертификат в Telegram через API при настройке вебхука.

    Локально у себя пробросить в докере тот самый порт в нужный контейнер с ботом.

    Возможны разные вариации, не изменяющие общий принцип. Например, можно не настраивать https на сервере, пробросить весь порт "как есть" через nginx stream, haproxy, двойной нат или нат с policy routing, а сам https настраивать у себя локально.
    Ответ написан
    Комментировать
  • Как узнать User_id в inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У объекта query, который передаётся в inline query handler, есть поле from_user, содержащее объект пользователя. Там есть и его id. Например:

    @bot.inline_handler(lambda query: len(query.query) > 0)
    def query_text(inline_query):
        print (inline_query.from_user.id)


    (это для телебота, другие библиотеки могут иметь некоторые отличия)

    Надо понимать, что inline mode - это лишь средство помощи в написании сообщения от имени пользователя, а не полноценное средство взаимодействия с пользователем. Результат ответа от бота может кэшироваться на серверах Телеграма и не перезапрашиваться при каждом запросе пользователя. А самое главное, что бот не может узнать, в какой чат отправляется сообщение, да и оно может не отправиться вообще. Единственный вариант - это если бот присутствует в нужном чате и имеет доступ к сообщениям, тогда он может ссылку via_bot с информацией о боте.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, бот не имеет никакой возможности лезть в избранное пользователя.
    Ответ написан
    Комментировать
  • Возможно ли ботом отвечать на коментарий в Telegram канала?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, конечно можно. Комментарии реализованы через специальную группу, связанную с этим каналом. Посты канала дублируются в группе, а цитирования этого поста попадают в комментарии канала.

    Соответственно, бота надо добавить в эту группу и посылать сообщение с цитированием сообщения канала.
    Ответ написан
    3 комментария
  • Могу ли я размещать авторские материалы на своем сайте?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого необходимо поднять Local Bot API Server, затем вместо серверов Телеграм (api.telegram.org) обращаться к этому серверу. Чтобы это сделать, у конструктора класса TelegramBot есть параметр baseApiUrl.
    Ответ написан
  • Как получить Текущую карту на сервере CS:GO с помощью python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    С помощью протокола a2s, и вот похожий вопрос https://qna.habr.com/q/1154466
    Ответ написан
  • Как добавить поддержку кириллицы в ConTeXt?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А шрифт-то такой есть? У меня в Ubuntu он нашёлся в пакете texlive-fonts-extra-links как ссылка на шрифт в другом пакете:

    $ ls -l /usr/share/texlive/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif.ttf 
    lrwxrwxrwx 1 root root 55 фев 18  2020 /usr/share/texlive/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif.ttf -> ../../../../../../fonts/truetype/dejavu/DejaVuSerif.ttf


    С кириллицей в конечном документе проблем не возникло.
    Ответ написан
    2 комментария
  • Как сделать на одном устройстве чтобы я мог получать сообщения SMS без sim-карток(если у меня 10 sim-карток настоящих), кто знает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, нельзя, ну кроме случаев если это eSIM. Сим-карта - это микрокомпьютер с процессором и секретным ключом внутри. Невозможно её не подключать для использования.

    Много лет назад можно было подобрать секретный ключ симкарты брутфорсом и сделать копию. Сейчас это невозможно, число попыток сильно ограничено, после чего симкарта перестаёт работать. Поэтому сим-карта может работать только при физическом подключении к устройству и это не обойти.

    Но можно подумать на тему того, чтобы оптимизировать работу с таким количеством сим-карточек. Китайцы делают SIM bank, но там обычно всё нацелено на отправку сообщений (спам), а не на приём, в том числе и прилагающийся софт. Можно также самому купить ндцать модемов (вполне достаточно б/у 3G-модемов). Но придётся найти или написать софт для управления этим хозяйством.

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

    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
    Сисадмин, просто сисадмин...
    В письмах нельзя выполнять javascript.

    Ссылка из письма в почтовом клиенте в любом случае откроет браузер,
    Ответ написан
  • Как можно получить ключ доступа к api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по всему, их API теперь переехал сюда developers.pho.to
    На это намекает, что вызов API https://photolab.me/api/feed/best перенаправляет на https://photolabsocialapi.pho.to/api/v1/feed/best
    Ответ написан
    Комментировать
  • Как сделать такой вывод в Bash?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Открываем man bash, раздел QUOTING. Там описано как экранировать всякие спецсимволы.
    Ответ написан
  • Как отдавать страницу с серыми ip в IFrame (vpn)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Отдавать ссылки на эту сеть напрямую нельзя, ведь эти адреса конечному пользователю недоступны. Надо проксировать их, можно прям на том же vps через nginx, например.
    Ответ написан
    9 комментариев
  • Телеграм бот не корректно отправляет результаты парсинга страницы, как исправить?

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

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

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

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

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


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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно при установленном Viber открыть такую ссылку: viber://pa?chatURI=код_бота_из_ссылки

    Тогда в контактах появится этот бот, а на вебхук бота улетит callback с типом subscribe и идентификатором пользователя (имеет вид base64-строки). Важно понимать, что один и тот же пользователь в разных ботах будет иметь разный идентификатор, а определить номер телефона пользователя бот вообще не может.
    Ответ написан
    Комментировать
  • From или chat? Где хранятся данные о пользователе telegram api?

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

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