Задать вопрос
  • Как сделать так, чтобы бот выполнял команду 1 раз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ох, ну тут всё неправильно.

    Не надо пихать ещё одну функцию send_message внутри send_message. Их надо вынести на один уровень. И вообще, назвать более адекватно их содержанию. Ведь первая обрабатывает команду /weather, а вторая - название города. Странно называть их одинаково неопределённым send_message (чтоб враги не догадались?).

    Что происходит в этом коде? Сначала мы регистрируем обработчики команд /weather и /start с помощью декоратора. При вызове /weather мы КАЖДЫЙ раз (ведь это часть функции-обработчика на следующем уровне вложенности!) заново определяем обработчик для content_type=text. Далее после первого вызова /weather этот обработчик начинает работать на все текстовые сообщения. Причём на сообщения ВСЕХ пользователей нашего бота. То есть реально, один вызывает /weather и тем самым изменяет поведение бота для всех пользователей сразу. Если в боте будет где-то ещё определяться таким же "внутренним" описанием ещё один обработчик content_type=text, то он будет всегда игнорироваться до следующего перезапуска бота, ведь один обработчик текстовых сообщений уже есть и он всегда будет применяться.

    Чего удивительного в том, что бот работает ровно так же странно, как странно написано в его коде?

    Надо понимать, что обработчик сообщения принимает ОДНО сообщение и его обрабатывает. Он не может принять сообщение и ещё сразу же следующее. Каждое обработается своим обработчиком. Чтобы обработка сообщений зависела от ряда сообщений, используют FSM (Finite State Machine), машину состояний. В telebot есть довольно простая в использовании FSM на основе вызова register_next_step_handler. Вызов register_next_step_handler переопределяет то, каким обработчиком будет обработано следующее сообщение с этим пользователем (точнее, в этом chat_id, который может быть и идентификатором группы).

    Собственно, принцип работы такой: когда пользователь вызывает /weather, мы должны с помощью вызова bot.register_next_step_handler зарегистрировать кастомный обработчик следующего сообщения. Этот обработчик будет обрабатывать только сообщения этого пользователя, подобное поведение не будет влиять на других пользователей. Для более сложных взаимодействий можно делать длинные и даже ветвящиеся цепочки обработчиков, спрашивать у пользователя разные данные, предлагать изменить ранее введённые данные итд итп.

    Официальный пример использования смотреть тут.
    Ответ написан
    1 комментарий
  • Как остановить выполнение цикла командой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно вместо while True гонять цикл по какому-то другому условию, которое рано или поздно изменится. Например, можно завести глобальную переменную, задавать ей True в команде запуска, а в команде остановки выставлять False. Да, это очень дурацкое решение, так как нельзя будет использовать команду в разных каналах одновременно. Но как бы и задача сама по себе очень дурацкая, явно попытка научиться делать ну хоть что-нибудь...

    Обычно если нужно делать какие-то регулярные задачи для бота, применяют другие решения. Например, расширение tasks или модуль aioschedule. Длинный цикл в обработчике команды - это часто не очень хорошее решение. Например, если бот будет перезапущен, цикл не будет запущен заново, а если задачи цикла хранятся в сохраняемой между перезапусками очереди - то перезапуск бота не будет влиять на этот функционал.
    Ответ написан
    3 комментария
  • Какие библиотеки использовать для парсинга текстовых файлов (Python)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Допустим, мы напряжёмся и пропарсим миллион файлов не за полтора часа, а за час, потратив три часа на разработку и отдалку кода. И зачем? Чего мы тут сэкономим? Обычно для разовых операций временем работы заботятся тогда, когда оно действительно велико. Например, если требуется месяц непрерывной работы, то я бы ещё подумал, можно ли его сократить до недели.

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

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

    Для юзербота пример есть прямо в документации: https://docs.pyrogram.org/start/examples/get_dialogs
    Ответ написан
  • Как реализовать интеграцию интернет-магазина с whatsapp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, поставщик предоставит свой API, который можно использовать. Также можно использовать готовые интеграции разных решений (CRM, чатботы итд) с этим поставщиком. Сейчас провайдеры WABA API все заинтересованы, чтобы подключались именно через них, поэтому обычно с готовностью отвечают на вопросы: что, как, сколько стоит, с кем есть готовые интеграции и всё такое.

    Чтобы слать сообщения не в ответ на сообщение пользователя, надо сначала зарегистрировать шаблоны (борьба со спамом у них такая). Если пользователь напишет первым, то открывается 24-часовое окно, когда можно отправлять любые сообщения.

    Альтернатива - это нелегальные API на имитации WhatsApp Web. Это гораздо дешевле. Но нужно понимать, что это риск бана. Если просто отвечать на входящие сообщения, а магазин небольшой, то риск бана невелик, но если инициативно первым слать сообщения, то он существенно возрастает.
    Ответ написан
  • Проверка на пользователя в бан листе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Во-первых,

    event.user_id != banned_ids

    неверно, надо

    event.user_id not in banned_ids

    Во-вторых, user_id скорее всего число, а в файле будут строки. Поэтому:

    banned_ids = [int(user_id) for user_id in BanUsers.read().splitlines()]
    Ответ написан
  • Как спарсить pdf файлы с сайта?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вообще говоря, в данном случае скачать совсем не проблема безо всяких скриптов, достаточно wget:

    wget -r -np https://codernet.ru/media/
    Ответ написан
    3 комментария
  • Активная ссылка на viber бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ответ написан
    Комментировать
  • Как реализовать приветствие подписчика на канале?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя. Сделай несколько каналов и рекламься со списком ссылок.
    Ответ написан
    Комментировать
  • Как через Viber API получить онлайн-статус моего контакта? С чего начать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У Viber есть два принципиально разных API: Viber Business Messages и Viber Bot (ранее Viber Public Accounts). Первый в основном предназначен для платных рассылок по номеру телефона и доступен только для бизнеса, второй нужен для создания телеграм-подобных ботов (пользователь должен написать первым). Ни тот, ни другой не предполагают получение статуса пользователя.
    Ответ написан
    Комментировать
  • Скрыть полностью номер мобилы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Настройки приватности позволяют скрыть свой номер:
    spoiler
    62435d177916c426454953.png
    Ответ написан
    Комментировать
  • Можно ли telegram бота подключить сразу к двум сервисам через один токен?

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

    Но потенциально можно отправлять пользователям сообщения из разных источников. Правда, придётся наладить обмен информации по пользователям между этими двумя источниками. Что само по себе немного странная задача.
    Ответ написан
    1 комментарий
  • В одинаковых файлах разный hash?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка тут:

    with open(cFile, 'w') as f3:

    Надо открывать файл как бинарный ('wb').

    А также тут:

    c = str(i)

    При приведении бинарных данных к строке они могут исказиться.
    Ответ написан
    2 комментария
  • Отправка сообщений из канала Телеграм в группу Вк?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если канал свой или есть связи с его админом, то пишем бота, добавляем его в канал, далее бот может ловить сообщения в этом канале и выполнять с ними какие-то действия.

    Если канал чужой, то придётся парсить его с помщью клиентского API, боты не могут видеть какие угодно каналы.
    Ответ написан
    Комментировать
  • Как сделать динамический перевод i18n aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Использовать _ имеет смысл, когда в пределах скрипта используется один язык. При множестве языков лучше использовать class based api.

    См. также https://qna.habr.com/q/960557
    Ответ написан
  • Как избежать ошибки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вплоть до версии 3.35 в sqlite нельзя было удалять колонки вообще https://sqlite.org/changes.html#version_3_35_0
    Ответ написан
    Комментировать
  • Телеграм-бот не обрабатывает сообщения, что не так (pytelegrambotapi)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так, как написано сейчас, работать не будет. Потому что регистрируется несколько обработчиков с одинаковым условием content_types=text, и применяется только первый. Надо как раз использовать bot.register_next_step_handler (или городить свой велосипед на замену). Смысл обработчиков именно в том, что они получают сообщение, обрабатывают его и завершаются. Ждать следующего сообщения не нужно.

    И зачем вообще внутри одной функции описывать другую? Так иногда делают, но в данном случае это не имеет смысла.
    Ответ написан
  • Как правильно отправлять запросы к Telegram API (не Bot API)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там не просто http-протокол, поэтому легко это повторить нельзя. Если интересно именно php, то советуют библиотеку https://github.com/danog/MadelineProto

    Для python - библиотека telethon или, как вариант, pyrogram. Для js - mtproto-core. Большинство ботописателей используют python и telethon.
    Ответ написан
    Комментировать
  • Как исправить ошибку при работе с inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А что делает message_text у InlineQueryResultArticle? Это параметр конструктора InputTextMessageContent. Неудивительно, что ругается.
    Ответ написан
    Комментировать
  • Что делать если не работают команды кроме bot event?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это весьма популярная проблема, и решение есть в официальном FAQ https://discordpy.readthedocs.io/en/stable/faq.htm...
    Ответ написан
    Комментировать