【问题标题】:Telegram bot run_repeating with python-telegram-bot libraryTelegram bot run_repeating 与 python-telegram-bot 库
【发布时间】:2021-09-29 19:41:58
【问题描述】:

我刚刚开始探索如何使用 python 构建机器人。 我正在尝试在特定时间发送消息。似乎 callback_minute 函数不会接受多个参数。我阅读了很多示例,我阅读了有关 run_repeating 函数的文档,但我无法解决此问题...

我的目标是动态地获取 chat_id。有人可以帮助我吗?

import logging
import sys
import requests
import random
import datetime

import telegram.ext
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove, Update
from telegram.ext import Updater, Filters, CommandHandler, MessageHandler, CallbackQueryHandler, ConversationHandler, CallbackContext

from lib import utils


class MonoBot:
    def __init__(self):
        logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)

    # define a command callback function
    def start(self, update, context):
        #a = utils.search(self, update.message.from_user)
        #context.bot.send_message(chat_id=update.message.chat_id, text=update.message.text + a)
        update.message.reply_text("write /lista top know what u can do...")

    def echo(self, update, context):
        context.bot.send_message(chat_id=update.message.chat_id, text=update.message.text + " stuff")

    def option(self, update, context):
        button = [
            [InlineKeyboardButton("text 1", callback_data="1")],
            [InlineKeyboardButton("text 2", callback_data="2")],
            [InlineKeyboardButton("text 3", callback_data="3")],
        ]
        reply_markup = InlineKeyboardMarkup(button)
        context.bot.send_message(chat_id=update.message.chat_id, text="scegli..", reply_markup=reply_markup)

    def button(self, update, context):
        query = update.callback_query
        # context.bot.send_message(chat_id=query.message.chat_id, text="vitto " + query.data)
        # use this below in order to hide option
        context.bot.edit_message_text(chat_id=query.message.chat_id, text="vitto " + query.data,
                                      message_id=query.message.message_id)

    def get_location(self, update, context):
        button = [[KeyboardButton("share location", request_location=True)]]
        reply_markup = ReplyKeyboardMarkup(button)
        context.bot.send_message(chat_id=update.message.chat_id, text="share location?", reply_markup=reply_markup)

    def location(self, update, context):
        lat = update.message.location.latitude
        lon = update.message.location.longitude
        context.bot.send_message(chat_id=update.message.chat_id, text="lat:" + str(lat) + " lon:" + str(lon),
                                 reply_markup=ReplyKeyboardRemove())
    #conversazione
    def cancel(self, update: Update, context: CallbackContext) -> int:
        print(update.message.from_user)
        update.message.reply_text("by by :)", reply_markup=ReplyKeyboardRemove())
        return ConversationHandler.END

    def cerca(self, update: Update, context: CallbackContext) -> int:
        print("-"*40)
        print(update.message.text)
        word = update.message.text.split(" ")[1]
        print("-"*40)
        update.message.reply_text('https://www.google.com/search?q='+ word)
        #return ConversationHandler.END

    def lista(self, update: Update, context: CallbackContext) -> int:
        update.message.reply_text("qua metto l\'elenco dei comandi che espongo...tipo\n- /cercaGOOGLE\n- /altrocomando")
        print("-" * 40)
        print(update.message)
        print("-" * 40)
        return CERCA

    def reply(self, update: Update, context: CallbackContext) -> int:
        user_input = update.message.text
        update.message.reply_text(utils.search(self, user_input))
        #return ConversationHandler.END

    # i'm trying to send a message at certain time...
    def callback_minute(self, update, context):
        #-1001198785547
        context.bot.send_message(chat_id=update.effective_chat.id, text="tempoooooo")


if __name__ == "__main__":
    bot = MonoBot()
    # first of all take token in order to authenticate
    # check new messages --> polling
    updater = Updater(token=sys.argv[1])
    # allows to register handler --> command, text, video, audio, ...
    dispatcher = updater.dispatcher
    # CORE <<-----------
    # create a command headler and command heandler to dispatcher ###ORDER LIST IS IMPORTANT!!
    updater.dispatcher.add_handler(CommandHandler('start', bot.start))
    updater.dispatcher.add_handler(CommandHandler('option', bot.option))
    updater.dispatcher.add_handler(CommandHandler('location', bot.get_location))
    updater.dispatcher.add_handler(MessageHandler(Filters.location, bot.location))
    updater.dispatcher.add_handler(CallbackQueryHandler(bot.button))

    #updater.dispatcher.add_handler(MessageHandler(Filters.text, bot.reply))

    # Add conversation handler with the states GENDER, PHOTO, LOCATION and BIO
    word, cmd, LOCATION, CERCA = range(4)
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('lista', bot.lista)],
        states={
            CERCA: [MessageHandler(filters=Filters.text, callback=bot.reply)],
        },
        fallbacks=[CommandHandler('exit', bot.cancel)],
    )

    dispatcher.add_handler(conv_handler)


    # from here time issue..
    j = updater.job_queue

    j.run_repeating(bot.callback_minute, interval=60, first=10)
    #t = datetime.time(6, 15, 00, 000000)
    #j.run_daily(bot.timer, t, days=(0, 1, 2, 3, 4, 5, 6), context=None, name=None)

    #updater.dispatcher.add_handler(MessageHandler(Filters.text, bot.echo))
    # start polling
    updater.start_polling()
    #updater.idle()  # ???

我得到以下错误:

2021-02-15 22:21:04,527 - telegram.ext.dispatcher - DEBUG - Setting singleton dispatcher as <telegram.ext.dispatcher.Dispatcher object at 0x7f8719922040>
Traceback (most recent call last):
  File "/home/vitto/PycharmProjects/monopattino/mono_bot.py", line 118, in <module>
    j.run_repeating(bot.callback_minute, interval=60, first=10)
  File "/home/vitto/PycharmProjects/monopattino/mono_env/lib/python3.8/site-packages/telegram/ext/jobqueue.py", line 291, in run_repeating
    j = self.scheduler.add_job(
  File "/home/vitto/PycharmProjects/monopattino/mono_env/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 434, in add_job
    job = Job(self, **job_kwargs)
  File "/home/vitto/PycharmProjects/monopattino/mono_env/lib/python3.8/site-packages/apscheduler/job.py", line 49, in __init__
    self._modify(id=id or uuid4().hex, **kwargs)
  File "/home/vitto/PycharmProjects/monopattino/mono_env/lib/python3.8/site-packages/apscheduler/job.py", line 180, in _modify
    check_callable_args(func, args, kwargs)
  File "/home/vitto/PycharmProjects/monopattino/mono_env/lib/python3.8/site-packages/apscheduler/util.py", line 401, in check_callable_args
    raise ValueError('The following arguments have not been supplied: %s' %
ValueError: The following arguments have not been supplied: context

【问题讨论】:

    标签: python datetime telegram-bot


    【解决方案1】:

    尝试像这样从callback_minute() 中删除update

    def callback_minute(self, context):
        #-1001198785547
        context.bot.send_message(
            chat_id=update.effective_chat.id,
            text='tempoooooo'
        )
    

    执行作业时没有update传递。

    【讨论】:

    • 请使用正确的大写字母改进您的答案,并在第 80 个字符处中断您的代码行
    猜你喜欢
    • 2017-11-21
    • 2019-08-07
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2020-11-05
    • 2018-04-07
    • 2015-11-26
    相关资源
    最近更新 更多