微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在电报机器人的作业执行中捕获异常

如何解决在电报机器人的作业执行中捕获异常

我正在编写一个将消息发送到电报用户列表的方法
我正在将其创建为每天早上 8:30 运行并发送“早上好消息”的作业。

@catch_exceptions(cancel_on_failure=True)
async def send_message():

    message = 'Good Morning'
    
    list_of_user_to_send_message = bot_team_data() # method to fetch data from DB

    if type(list_of_user_to_send_message) is not list:
        return

    for telegramId in list_of_user_to_send_message:
        if type(telegramId) is not int:
            user = int(telegramId)
            logger.info('Good morning message sent to {user}'.format(user=telegramId))
            try:
                await bot.send_message(user,message)
            except ValueError as e:
                logger.exception(
                    'User with telegramId {id} is not interacted with the bot,{e}'.format(id=telegramId,e=e),stack_info=True)
                continue
            except Exception as e:
                logger.exception(
                    'Error occurred for the telegramId {id} and the error is {e}'.format(id=telegramId,stack_info=True)
                continue

我正在使用 aioschedule 包将该方法作为作业运行。 我还创建了一个方法来捕获任何未知异常并取消作业。
但它无法工作。 下面的代码是我如何实现捕获异常。

import functools
import aioschedule as schedule
import asyncio


def catch_exceptions(cancel_on_failure=False):
    def catch_exceptions_decorator(job_func):
        @functools.wraps(job_func)
        def wrapper(*args,**kwargs):
            try:
                return job_func(*args,**kwargs)
            except:
                import traceback
                if cancel_on_failure:
                    return schedule.CancelJob

        return wrapper

    return catch_exceptions_decorator


def main():
    bot.start()
    schedule.every().day.at("10:00").do(send_message)
    loop = asyncio.get_event_loop()
    while True:
        loop.run_until_complete(schedule.run_pending())
    bot.run_until_disconnected()


if __name__ == '__main__':
    main()

我正在尝试使用此代码生成错误

import configparser
import functools
import aioschedule as schedule
import asyncio

from telethon import TelegramClient

parser = configparser.ConfigParser()
parser.read("../application.yml")

api_id = parser.get("telegram-config","api_id")
api_hash = parser.get("telegram-config","api_hash")
bot_token = parser.get("telegram-config","bot_token")


bot = TelegramClient('session',api_id,api_hash).start(bot_token=bot_token)


def catch_exceptions(cancel_on_failure=False):
    print('try 1')

    def catch_exceptions_decorator(job_func):
        print('try 2')

        @functools.wraps(job_func)
        def wrapper(*args,**kwargs):
            try:
                print('try 3')
                return job_func(*args,**kwargs)
            except Exception as e:
                print('exception')
                import traceback
                if cancel_on_failure:
                    return schedule.CancelJob

        return wrapper

    return catch_exceptions_decorator


@catch_exceptions(cancel_on_failure=True)
async def send_message():
    message = 'Good Morning'
    print('send message')
    await bot.send_message('1234',message)


def main():
    bot.start()

    schedule.every().day.at("10:00").do(send_message)
    loop = asyncio.get_event_loop()
    while True:
        loop.run_until_complete(schedule.run_pending())
    bot.run_until_disconnected()


if __name__ == '__main__':
    main()

输出

try 1
try 2
try 3
send message
Task exception was never retrieved
future: <Task finished name='Task-115736' coro=<Job.run() done,defined at D:\Project\telegram_bot\venv\lib\site-packages\aioschedule\__init__.py:455> exception=ValueError('Cannot get entity by phone number as a bot (try using integer IDs,not strings)')>
Traceback (most recent call last):
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 501,in _get_entity_from_string
    for user in (await self(
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 30,in __call__
    return await self._call(self._sender,request,ordered=ordered)
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 77,in _call
    result = await future
telethon.errors.rpcerrorlist.BotMethodInvalidError: The API access for bot users is restricted. The method you tried to invoke cannot be executed as a bot (caused by GetContactsRequest)

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "D:\Project\telegram_bot\venv\lib\site-packages\aioschedule\__init__.py",line 462,in run
    ret = await self.job_func()
  File "D:/Project/telegram_bot/src/try_exception_catch.py",line 64,in send_message
    await bot.send_message('1234',message)
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\messages.py",line 697,in send_message
    entity = await self.get_input_entity(entity)
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 413,in get_input_entity
    await self._get_entity_from_string(peer))
  File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 506,in _get_entity_from_string
    raise ValueError('Cannot get entity by phone number as a '
ValueError: Cannot get entity by phone number as a bot (try using integer IDs,not strings)
try 3
send message
Task exception was never retrieved
future: <Task finished name='Task-115738' coro=<Job.run() done,in _get_entity_from_string
    for user in (await self(
  File "D:\Project\telegram_botvenv\lib\site-packages\telethon\client\users.py",not strings)

终端中不断出现值错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。