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

    Vindicar
    @Vindicar
    RTFM!
    Что мешает засунуть with внутрь ChangeNick()?
    Ответ написан
    Комментировать
  • Как реализовать порядок выполнения и зависимость при создании ТГ бота?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужна реализация state machine (автомат состояний).
    Упрощённо, для каждого пользователя, событие от которого мы обрабатываем, нужно хранить, в каком состоянии он находится (например, в твоём случае "начальное" или "была послана команда /send_id"). Тогда при обработке событий проверяешь, находится ли пользователь в нужном состоянии.

    Хранить состояния можно по разному. В простейшем случае, если состояния не обязаны переживать перезапуск бота и не имею дополнительных данных, может хватить словаря вида "ID пользователя - код состояния".
    Ответ написан
    Комментировать
  • Как остановить цикл по нажатию инлайн кнопки в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    У тебя бот многопоточный? Потому что иначе единственный главный поток будет занят циклом, и боту будет не до общения с сервером телеги.
    Ответ написан
    Комментировать
  • Как правильно настроить бот на python?

    Vindicar
    @Vindicar
    RTFM!
    Быстрый гуглинг показывает, что content_types для появления юзера может быть new_chat_members, а не new_chat_member. Проверь, работает ли.
    Ответ написан
  • Как сделать рассылку через Pyrogram?

    Vindicar
    @Vindicar
    RTFM!
    Вставь сообщение об ошибке в Google Translate и поймешь.
    Спамить надо меньше. Ну или хотя бы делать задержку между сообщениями.
    Ответ написан
  • Как сделать что бы в боте сообщения отправлялись по айди указанному в базе данных sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Если работаешь с aiogram, то вроде там есть await bot.send_message(chat_id, message_text)
    Ответ написан
  • Телебот.Как выполнить в основном файле .py команды из другого .py файла?

    Vindicar
    @Vindicar
    RTFM!
    Твоя проблема в том, что ты в каждом файле определил объект bot, и в итоге каждый файл подписывается на своего бота... но работает только бот из main.py, так как он определяется ПОСЛЕДНИМ и переписывает имя bot на себя. Так что bot.infinity_polling() в итоге запускает только бота из main.py, а остальные боты остаются незапущенными.
    Можно схитрить и заставить все файлы использовать один объект бота. Например, переписав вспомогательные файлы таким образом:
    # commands.py
    def register_commands(bot):
      # функция register_commands должна присутствовать в каждом файле,
      # и содержать вложенные объявления обработчиков событий.
      # bot - объект бота, на котором регаются обработчики. 
      # таким же способом можно пробросить другие глобальные объекты программы.
      # очень важно, чтобы функция вызывалась РОВНО один раз в программе!
      # дальше пошли обработчики...
      @bot.message_handler(commands=['version'])
      def version_message(message):
          bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
          bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

    Тогда в main.py будет что-то вроде...
    import commands
    import weather
    
    bot = telebot.TeleBot(.................)
    
    # заставляем модули объявить и зарегистрировать свои обработчики
    commands.register_commands(bot)
    weather.register_commands(bot)
    
    # дальше идут местные обработчики
    @bot.message_handler(content_types=['text'])
    def send_text(message):
        if message.text.lower() in a:
            bot.send_message(message.chat.id, 'Привет, создатель')
        elif message.text.lower() =='ghbdtn':
             bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
        elif message.text.lower() in b:
            bot.send_message(message.chat.id, 'Прощай, создатель ')
    
    # ну и запускаем бота
    bot.infinity_polling()
    Ответ написан
    Комментировать
  • Актуально ли сейчас делать и продавать телеграмм ботов, написанных на Python?

    Vindicar
    @Vindicar
    RTFM!
    Конструкторов ботов полно, в т..ч. бесплатных. Хочешь монетизировать знания - погуляй по фриланс-сайтам.
    Ответ написан
    Комментировать
  • Как остановить зацикленную функцию телеграм бота(telebot)?

    Vindicar
    @Vindicar
    RTFM!
    В указанном виде - никак, бот, насколько я могу судить, однопоточный, и этот один поток будет занят циклом while True.
    Ответ написан
    Комментировать
  • Питон не видит таблицу Sqlite, что делать?

    Vindicar
    @Vindicar
    RTFM!
    по видеоуроку ХаудиХо

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

    А вообще galaxy выше прав. Вы указываете базу данных вот так: sqlite3.connect("Database.db")
    Если не помните, это то, что называется "относительный путь", который отсчитывается относительно текущего рабочего каталога. Проблема в том, что текущий рабочий каталог при запуске скрипта может быть разным - это совершенно необязательно каталог, где лежит скрипт (хотя часто может им быть). Факторов, влияющих на текущий рабочий каталог, очень много, и лучше на него не полагаться.
    Надежнее узнать полный путь до каталога скрипта, и использовать его для построения пути до рабочих файлов скрипта. Например, так:
    import sys
    import pathlib
    script_path = pathlib.Path(sys.argv[0]).parent  # абсолютный путь до каталога, где лежит скрипт
    conn = sqlite3.connect(script_path / "Database.db")  # формируем абсолютный путь до файла базы

    Вот после этого можно быть уверенным, к какой базе обращается бот.
    Ответ написан
  • Как отследить пользователей телеграм бота, написанного на python и где взять их Id?

    Vindicar
    @Vindicar
    RTFM!
    Выше уже ответили, что нужно регистрировать пользователей самостоятельно. Я опишу один из способов, как это сделать.
    Я предполагаю, что используется СУБД Sqlite, хотя это можно адаптировать и к другим.
    Нам потребуется таблица пользователей примерно такого вида:
    import time
    import sqlite
    
    connection = sqlite3.connect('bot.db')
    cursor = connection.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS users ( -- всё что после -- комментарий SQL
        id TEXT PRIMARY KEY, -- идентификатор пользователя, он же первичный ключ таблицы
        first_use REAL, -- метка времени, когда пользователь впервые обратился к боту
        last_use REAL -- метка времени, когда пользователь последний раз обратился к боту
    )""")
    cursor.close()

    То, что мы сделали id первичным ключом, гарантирует, что одному пользователю будет соответствовать только одна строка таблицы.
    Тогда перед выполнением каждой команды нужно обновить эту таблицу - добавить строку, если её нет, или обновить поле last_use, если она есть. К счастью, существует синтаксис, позволяющий сделать это за один запрос.
    def ensure_user_stats(user_id):
        "Эта функция обновляет таблицу users, и должна вызываться в начале обработки каждой команды."
        global connection
        cursor = connection.cursor()
        now = time.time()
        # пытаемся добавить строку с указанным id, и фиксируем текущее время в полях first_use и last_use 
        # если возникает конфликт в поле id (такое id уже есть),
        # то мы обновляем в этой записи поле last_use на текущее время, а остальное не трогаем
        cursor.execute("""INSERT INTO users (id, first_use, last_use) VALUES (?, ?, ?)
        ON CONFLICT (id) DO UPDATE SET last_use = excluded.last_use""", (user_id, now, now))
        cursor.close()
    Ответ написан
    Комментировать
  • Как изменить название кнопки с командой shell?

    Vindicar
    @Vindicar
    RTFM!
    smokedevil666, сделай глобальный словарь вида
    commands = { "Нажми": "python3 /foor/bar/baz" }
    И ищи в нём полученное сообщение. Если такого ключа нет, ругаешься на пользователя.
    Ответ написан
    8 комментариев
  • Как перенаправлять уведомления из группы Discord в Telegram?

    Vindicar
    @Vindicar
    RTFM!
    Используй комбинацию discord.py и aiogram. Придётся вчитаться в документацию, чтобы понять как запустить их вместе. Как поймешь - дальше просто, прописываешь обработчик сообщений от дискорда, проверяешь сообщение на предмет уведомление ли это, если да - переотправляешь в aiogram.

    А вообще, будет намного проще выделить в сервере отдельный канал для уведомлений, куда нельзя писать юзерам. Кому интересно - подпишутся на этот канал и поставят оповещения, кому не интересно - замутят.
    Ответ написан
    Комментировать
  • Как реализовать поиск в sqlite на python?

    Vindicar
    @Vindicar
    RTFM!
    Это называется "нечеткий поиск", и это непростая тема. Как говорится в одном анекдоте, "длина, ширина, высота и глубина - это совсем не то же, что длинка, ширинка, высотка и глубинка".
    Ответ написан
    6 комментариев
  • Value for header {} must be of type str or bytes, not Ошибка полностью ниже.?

    Vindicar
    @Vindicar
    RTFM!
    session_id = requests.post(
            "https://yug-krdr-itv04.svc.iptv.rt.ru/api/v2/user/sessions",
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "session_id": sess_id},
            json={"login": email, "login_type": "email", "password": "1234567"},
        ).json() # значение session_id может быть не только строкой, но и целым числом, словарём, списком или None
        return {"san": san, "session_id": session_id, "uid": ud} #в словарь оно пишется как есть
    
    
    def requestBuilderWink(url, data=None, params=None, json=None, method=None):
        register = regAccount()
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
            "session_id": register["session_id"], # а потом используется как заголовок - тоже как есть
            "x-rt-uid": register["uid"],
            "x-rt-san": register["san"],
        }
    Ответ написан
    Комментировать
  • Как реализовать мульти-поточность в боте Telegram (Aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Мешать многопоточность с асинхронностью - плохая идея.
    А вообще зависит от реализации server.status(). Если оно делает синхронный сетевой запрос, то конечно бот встанет на время его выполнения.
    Если нет асинхронной реализации, я бы запустил новый таск, который в цикле раз в минуту-две опрашивает сервер и запоминает текущий онлайн. А по команде отдавал бы только последнее запомненное значение.
    В принципе можно использовать loop.run_in_executor() для выполнения потока как асинхронной задачи. Это более-менее безопасно.
    Ответ написан
    Комментировать
  • Как задать время мута, бана в команде?

    Vindicar
    @Vindicar
    RTFM!
    get_args() → Optional[str]
    Судя по документации, get_args() возвращает строку, идущую после команды, или None. Разбор этой строки - уже твоя забота. Например, так:
    1. присвоить результат .get_args() переменной и убедиться, что это не None.
    2. ободрать пробелы с помощью .strip()
    3. превратить в int()/ float() и поймать исключение, если в строке не число
    4. использовать полученное значение.
    Ответ написан
    2 комментария
  • Как сделать телеграм бота многоязычным?

    Vindicar
    @Vindicar
    RTFM!
    1. Храни таблицу языков вида "ID пользователя - ID языка". Если записи для пользователя в таблице нет, то предлагаешь выбрать, или задаёшь какое-то значение по умолчанию.
    2. Храни все постоянные строки, которые отправляет бот, в некотором хранилище. Хранилище должно иметь вид "ID строки - ID языка - содержимое строки". Соответственно при отправке сообщения узнаёшь ID языка пользователя, с которым идёт обмен, и выбираешь нужную строку по ID строки.
    Ответ написан
    2 комментария
  • Как Удалить надпись, Бот заблокировал в чате?

    Vindicar
    @Vindicar
    RTFM!
    Смотришь метод Bot.send_message(), которым ты пользуешься.
    Там и впрямь есть параметр disable_notification, который можно передать.
    Так что просто передаёшь этот параметр по имени, как disable_notification=True.
    Ответ написан
    Комментировать