Как отправить сообщение от бота пользователю в определенное время или через определенные промежутки времени через python telegram бот-библиотеку? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь отправлять сообщения боту ежедневно без триггера со стороны пользователя (например, commandhadler) со второго разговора и далее.

Я создал базовое c меню для бота, чтобы взаимодействовать с пользователем

enter image description here

Но я также пытаюсь ежедневно отправлять сообщения через job_queue

Я ссылался на коды, использующие обработчики команд

dp.add_handler(CommandHandler("set", set_timer,
                              pass_args=True,
                              pass_job_queue=True,
                              pass_chat_data=True))

Это устанавливается после того, как пользователь вводит / устанавливает. Но я пытаюсь найти способ автоматически отправлять сообщения каждые 30 секунд или установить фиксированное время для ежедневной отправки сообщения. Мой код

from telegram.ext import Updater,CommandHandler 
from telegram.ext import  MessageHandler,Filters,InlineQueryHandler
import logging
import telegram

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger()

def start(bot, update):
    update.message.reply_text("Hello , Thanks for choosing us!!")

def callback_minute(context: telegram.ext.CallbackContext):
    chat_id = ?
    context.bot.send_message(chat_id=chat_id, 
                             text='Hi User, Add Fund to your account to start trading')


def main():
    updater = Updater(token,use_context=True)
    dp = updater.dispatcher
    j = updater.job_queue
    dp.add_handler(CommandHandler("start",start))
    job_minute = j.run_repeating(callback_minute, interval=10, first=0)

    updater.start_polling()

    updater.idle()

Как получить chat_id? Если я использую

def callback_minute(update, context: telegram.ext.CallbackContext):
    chat_id = update.message.chat.id

, я получаю эту ошибку

TypeError: callback_minute() missing 1 required positional argument: 'context'

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Это переработано ниже, так что run_repeating () вызывается из команды /start (как предложено Gagan TK в комментариях). В этом примере first=30, поэтому он запустится через 30 секунд.

Есть хороший пример использования очереди заданий таким образом в нижней части вики-документации для JobQueue на GitHub.

from telegram.ext import Updater,CommandHandler 
from telegram.ext import MessageHandler,Filters,InlineQueryHandler
import logging
import telegram

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger()

bot = telegram.Bot(token=token)

def start(update, context):
    context.bot.send_message(chat_id=update.message.chat_id,
                     text="Hello , Thanks for choosing us!!")

    context.job_queue.run_repeating(callback_minute, interval=10, first=30,
                                    context=update.message.chat_id)

def callback_minute(context):
    chat_id=context.job.context
    context.bot.send_message(chat_id=chat_id, 
                             text="Hi User, Add Fund to your account to start trading")

def main():
    updater = Updater(token,use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start",start, pass_job_queue=True))

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()
0 голосов
/ 06 января 2020

Вы должны использовать context.job_queue.run_repeating(), чтобы непрерывно повторять задание после указанного c интервала времени.

Если вы хотите, чтобы задание выполнялось один раз в день, вы можете использовать context.job_queue.run_daily() и указать время.

Это python-telegram-bot ссылки на документы для обоих случаев: job_queue.run_repeating () , job_queue.run_daily ()

Эти документы иметь очень хорошую информацию, которая поможет вашему запросу.

...