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

    Vindicar
    @Vindicar
    RTFM!
    Ну встречный вопрос: а нужно ли? Не будет ли проще оставить рассылку отдельным ботом, а новый функционал, не связанный с сайтом, реализовать отдельно?

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

    Vindicar
    @Vindicar
    RTFM!
    Можно. Создай БД, используя id пользователя в качестве ключа.
    Смотри модуль sqlite3, а также основы SQL. Просто чтобы понимать, что делаешь.
    Ответ написан
    Комментировать
  • Как закрепить за каждым ответом переменную для дальнейшего вывода python(aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Храни в БД таблицу вида пользователь-этап.
    При получении сообщения получи текущий этап пользователя, проинтерпретируй сообщение как ответ на текущий этап, а затем увеличивай номер этапа.
    Ответ написан
    Комментировать
  • Как записать в блокнот сообщения которые юзер отправляет боту??

    Vindicar
    @Vindicar
    RTFM!
    Ставишь обработчик на получение сообщения (как - зависит от используемой библиотеки), в нём уже делаешь print или вывод в файл.

    Для пакета python-telegram-bot это будет что-то типа
    from telegram.ext import MessageHandler, Filters
    
    def on_message(update, context):
        pass #тут делаешь что хочешь с update.message.text
    
    message_handler = MessageHandler(Filters.text & (~Filters.command), on_message)
    dispatcher.add_handler(message_handler)


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

    Честно говоря, фраза "записать в блокнот" заставляет подозревать, что ботами тебе заниматься рановато. Сначала бы азы программирования подучить.
    Ответ написан
  • Ошибка при рассылке на юзеров,что может быть?

    Vindicar
    @Vindicar
    RTFM!
    result = cur.execute('SELECT `id` FROM `users`').fetchall()
    call_sp = cur.fetchall()

    Второй .fetchall() уже ничего не вернёт - первый выбрал все данные, отданные БД.
    Ответ написан
  • При запуске вылетает непонятная мне ошибка, что это?

    Vindicar
    @Vindicar
    RTFM!
    Как пакет telebot ставил? pip install telebot?
    Если да, поздравляю, ты поставил не тот пакет. Правильный пакет называется pyTelegramBotAPI, хотя после установки подключается тоже как import telebot.

    Ну и обязательное замечание: не начинай изучать питон с ботов. Набьешь уйму шишек.
    Ответ написан
    3 комментария
  • Selenium + pytelegrambotapi, куда деплоить?

    Vindicar
    @Vindicar
    RTFM!
    1. Посмотри в сторону Heroku. Там несколько муторно работать с Selenium, но жить можно.
    2. У Oracle можно получить бесплатную маломощную машинку. Пример. Если осилишь, можешь поднять там Питон, с нужными модулями.
    Ответ написан
    Комментировать
  • Как в aiogram сделать ограниченное число ввода определенной команды?

    Vindicar
    @Vindicar
    RTFM!
    В обработчике команды /test делать SELECT quantity для отправителя.
    Если ничего не найдено, сообщить о необходимости регистрации через /start.
    Если вернулось положительное значение, выполнить запрос вида UPDATE, а потом сделать что требуется.
    Если вернулся ноль, сообщить об исчерпании лимита.
    В чём конкретно проблемы?
    Ответ написан
  • Что делать если телеграмбот который показывает погоду вылетает после неправильного введённого города?

    Vindicar
    @Vindicar
    RTFM!
    Скорее всего при неправильном городе вызов
    observation = mgr.weather_at_place(message.text)
    сгенерирует исключение. Судя по докам, это будет либо ParseResponseException либо APICallException. Если бы ты озаботился привести полное сообщение об ошибке, можно было бы сказать точно.
    В любом случае, читай про обработку исключений. Тебе нужно завернуть вызов в блок try, и если возникла ошибка - сообщить пользователю.

    Это я понимаю. Я не сам писал бота это ролик из ютуба.

    Если понимаешь, учи основы питона по-старинке - учебник и упражнения. По ютубу научишься только повторять, не понимая смысла. Сначала - основы, потом уже бросайся писать ботов.
    Ответ написан
    Комментировать
  • Как правильно настроить многопоточность у бота telegram?

    Vindicar
    @Vindicar
    RTFM!
    Если коротко: пусть бот работает в главном потоке. ФЗ, синхронно или асинхронно, зависит от используемой библиотеки. Судя по приведённому коду, синхронно.
    А вот все длительные операции запускайте в отдельных потоках или даже процессах.
    Для общения между потоком бота и рабочими потоками/процессами организуйте две очереди. Из одной потоки обработки данных будут принимать задания. В другую они будут складывать сообщения для отправки (текст + id пользователя, например). Тогда основной бот должен по готовности запроса положить объект с описанием задания в первую очередь, а также периодически проверять наличие сообщений во второй. При наличии - извлекать и отправлять по назначению.
    Ответ написан
  • Почему то ошибки в консоле нету, но и сообщение (123), не отправляться (aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    test = False
    Ниже
    if test == True:
    async def prdfg(message: types.Message):
    У тебя prdfg не будет объявлено, так как на момент выполнения этой строки test всё ещё False.
    Ответ написан
  • Возможно ли сделать стрим в видео звонок телеграм?

    Vindicar
    @Vindicar
    RTFM!
    Гипотетически - да. Но не факт, что есть готовые решения, и тем более конкретно для ноды. Нужно смотреть используемую вами библиотеку для телеги, поддерживает ли она видео-звонки, и если да, что в каком виде она принимает видеопоток. Если это что-то абстрактное, то возможно, удастся завернуть видео из стрима в этот формат и скармливать телеге понемножку. Если же требуется доступ именно к вебкамере, то тогда искать реализацию виртуальной вебкамеры.
    Ответ написан
    1 комментарий
  • Как из базы данных получить все значения столбца в список?

    Vindicar
    @Vindicar
    RTFM!
    Если используешь для работы с базой движок sqlite3, то будет как-то так
    con = sqlite3.connect("mydb.sqlite") #подразумеваю, что таблицу ты уже создал
    cur = con.cursor()
    cur.execute("SELECT id FROM users")
    ids = [row['id'] for row in cur]

    Только если данных много, такой запрос может съесть много памяти.
    Так что встречный вопрос: а тебе зачем выбирать всю таблицу? Может, всё-таки нужно отфильтровать часть записей?
    Ответ написан
    Комментировать
  • Как отправлять по очереди данные заказа по команде "Дальше" из БД Sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Ответ очевиден. Тебе нужно для пользователя хранить, на какой позиции он остановился, и продолжать оттуда.
    Простой способ - использовать модификаторы OFFSET и LIMIT в SQL запросе. Тогда достаточно будет хранить просто число, которое будет использоваться в OFFSET. При начальном запросе это число ставить в 0, а по нажатию дальше - увеличивать на значение LIMIT.

    Технически это можно оформить таблицей БД с парами "id пользователя - число".
    Ответ написан
    1 комментарий
  • Как сделать, чтобы телеграм-бот отвечал уже вычисленным числом?

    Vindicar
    @Vindicar
    RTFM!
    1. Поставь обработчик "входящее сообщение".
    2. Прогони текст сообщения через float(), а для надёжности можно попробовать использовать locale.atof() - оно понимает региональное форматирование. Например, в США сумма "5,000.00" а у нас "5 000,00", причем и там и там могут написать просто "5000". Выцепить все варианты будет непросто, но atof() для начала сойдёт.
    3. Рассчитай проценты.
    4. Ответь на сообщение рассчитанной суммой процентов.

    Вот и всё. Если хочешь код - изволь предоставить то, что написал сам (и оформить кнопкой </>).
    Ответ написан
    5 комментариев
  • Как для тг бота сделать одновременно слушатель сообщений и выполнение чего-то в цикле?

    Vindicar
    @Vindicar
    RTFM!
    Советую почитать про основы работы асинхронных программ.

    Но если на пальцах, считай, что из bot.polling() программа не выйдет до своего завершения. Она там будет крутиться, ждать события, и дёргать обработчики.

    Поэтому всё, что ты хочешь научить бота делать, нужно делать
    • ИЛИ в рамках фреймворка (какого кстати? pyTelegramBotAPI? Он это не умеет)
    • ИЛИ в рамках отдельного потока, который запускать до вызова bot.polling()
    • ИЛИ вообще в рамках отдельного скрипта, который вызывать по крону.

    Если в рамках потока, нужно будет посмотреть, позволяет ли телебот вызывать методы из другого потока.
    Ответ написан
    2 комментария
  • Как разобрать запрос на несколько переменных в боте телеграм?

    Vindicar
    @Vindicar
    RTFM!
    Пример запроса? Он должен следовать какой-то специфической форме, я надеюсь?
    Если запрос просто состоит из некольких слов, разделённых пробелами (опционально, строка в кавычках считается одним словом), то посмотри в сторону shlex. Но кроме как "разбить строку по пробелами и экранировать кавычки" shlex мало что умеет.
    Если нужно подобие командной строки (с фишками типа --ключей и необязательных параметров), посмотри в сторону argparse. Тут тебе и преобразование типов данных (т.е. "вот этот параметр должен быть числом"), и справка об использовании, и ещё много чего.
    Если что-то ещё более заковыристое, то посмотри в сторону регулярных выражений. Они позволяют распознавать довольно заковыристые паттерны, но многое придётся делать вручную.
    Если нужен анализ естественной речи... это дело муторное.

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

    Vindicar
    @Vindicar
    RTFM!
    > operator = "4609....71" and "109....307"
    Извините мой французский, но что это за фигня? Вы применяете логические операторы к строкам, неужели ничего неладного не заподозрили?
    Вам нужна коллекция idшников, и нужно проверять вхождение в эту коллекцию!
    Например, множество (так как я не думаю, что оператор должен входить в список дважды, верно?):
    operators = {"4609....71",  "109....307"}
    for op in operators: #перебираем элементы множества
        await bot.forward_message(op, message.from_user.id, message.message_id)

    Тогда добавить нового оператора будет легко и просто:
    operators.add("1234....890")
    При этом при попытке повторного добавления просто ничего не произойдёт.
    Аналогично можно удалить:
    operators.remove("1234....890")
    При попытке удаления отсутствующего оператора будет выброшено KeyError.
    Ну и если надо проверить, является ли id оператором:
    if "1234...890" in operators:
    Ответ написан
    Комментировать
  • Нужно как-то остановить цикл и после проверки модератора продолжить его. Бот телеграм(Telebot). Как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Нет, нельзя. Нужно архитектуру бота менять, так ты результата не добьёшься.

    1. Поступающие запросы складываешь в очередь (а лучше в БД).
    2. Бот периодически проверяет наличие непроверенных запросов и выкидывает их менеджеру. Так как менеджер - существо неторопливое, это можно делать раз в пару минут или даже реже.
    3. По реакции от менеджера запрос помечается как проверенный (одобренный/отклонённый).
    4. Бот периодически проверяет, есть ли проверенные, но не обработанные запросы. Если есть, обрабатывает их, и помечает их как обработанные.
    5. Опционально: периодически запросы, отмеченные как обработанные, удаляются из БД.
    Ответ написан
    Комментировать
  • Почему await con.commit() вызывает ошибку ValueError?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри базовый пример, может, лучше переделать по его образу и подобию?

    pool = await aiomysql.create_pool(host='127.0.0.1', port=3306,
                                          user='root', password='',
                                          db='mysql', loop=loop)
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 42;")
                print(cur.description)
                (r,) = await cur.fetchone()
                assert r == 42
        pool.close()
        await pool.wait_closed()
    Ответ написан