Задать вопрос
  • Если в чате ввести символ @ - появится список ботов, как запретить пользоваться ними не отключая "стикеры и GIF"?

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

    @bot.message_handler(content_types=['text'])
    def keep_chat_clean(message):
        msg = message.text
        if "via_bot" in message.json and message.json["via_bot"]["username"] in BLACKLISTED_BOTS:
        try:
            bot.delete_message(message.chat.id, message.message_id)
        except telebot.apihelper.ApiException:
            # обрабатываем ситуацию, когда удаление не удалось
            pass
    Ответ написан
    Комментировать
  • Как правильно сделать структуру базы данных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Обычная задача, делаем промежуточную таблицу grapes_for_wine (wine_id, grape_id).
    Ответ написан
    Комментировать
  • Как отловить удалённое сообщение в Telebot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Telegram Bot API не поддерживает сообщение о фактах удаления сообщений. Также через API нельзя читать историю сообщений. Поэтому эта задача не имеет решения с помощью ботов.

    Это можно сделать только с помощью клиентского API (MTProto), имитирующего реального пользователя ("юзербот").
    Ответ написан
  • Как сделать await purge(limit=1) в disnake?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Обработчик on_message принимает в качестве параметра сообщение (тип Message), а не interaction context. А у сообщения есть метод delete. Так что использование purge тут совершенно не к месту. Открою секрет: удалять вообще что бы то ни было единичное с помощью purge - плохая идея. Пока бот обрабатывает событие, в канале могут появиться новые сообщения. Purge нужно только для масштабной очистки.

    @client.event
    async def on_message(message):
        await message.delete()
        temporary_message = message.reply(...)
        await asyncio.sleep(30)
        await temporary_message.delete()
    Ответ написан
    7 комментариев
  • Как получить смс без связи?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно взять модем типа знаменитого Huawei E3372, к которому можно подключить выносную направленную антенну. Это позволит принимать сообщения за много километров от вышки. Плюс антенну можно поднять повыше, если рельеф и деревья мешают. Обычно это вариант для мобильного Internet на дачу, но и для приёма SMS подойдёт.

    Ещё у некоторых операторов бывают услуги типа "Мультифон" от Мегафона, с которой можно получить дополнительный номер с программным доступом. Но нужно учесть, что на такой номер часто невозможно получать SMS от всяких банков и прочих сервисов - они просто не доходят.

    Также можно разместить модем где-то не у себя, а в зоне уверенного приёма нужного оператора, и ходить этот комп по RDP/VNC/RustDesk/ssh для чтения SMS. К примеру, если находишься на даче, можно оставить этот модем у себя в городской квартире.

    И ещё один вариант: бывают приложения для Android, которые позволяют настроить пересылку SMS, например, на почту. Можно оставить в зоне приёма телефон (разумеется, на зарядке) и пущай пересылает.
    Ответ написан
    Комментировать
  • Как пробросить 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. Там описано как экранировать всякие спецсимволы.
    Ответ написан