亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何僅在 Telethon 對話中處理 NewMessage

如何僅在 Telethon 對話中處理 NewMessage

臨摹微笑 2023-10-11 20:05:36
我的機器人代碼中有兩個處理程序:my_conversation - 捕獲“/start”消息并開始新對話,其中等待來自用戶的消息數字 - 按模式捕獲消息 - 僅數字    import asyncio    import logging    import re        from telethon import TelegramClient    from telethon.events import StopPropagation, NewMessage    me = TelegramClient('bot', 'API_ID_BOT', 'API_HASH_BOT').start(bot_token='BOT_TOKEN')            async def my_conversation(event):        async with me.conversation(event.sender_id) as conv:            await conv.send_message('I\'m waiting for message')            response = conv.get_response()            response = await response            await conv.send_message(f'conversation: {response.text}')        raise StopPropagation            async def digits(event):        await me.send_message(event.sender_id, f'catches digits: {event.text}')        raise StopPropagation            async def main():        me.add_event_handler(my_conversation, NewMessage(incoming=True, pattern=r'^\/start$'))        me.add_event_handler(digits, NewMessage(incoming=True, pattern=re.compile(r'[0-9]+')))        await me.run_until_disconnected()            if __name__ == '__main__':        logging.basicConfig(level=logging.INFO)        loop = asyncio.get_event_loop()        loop.run_until_complete(main())我的期望:我發送“/start”機器人開始對話并回復“我正在等待消息”我發送“123”機器人發送消息“對話:123”,因為對話已開始。其他處理程序必須忽略消息,因為對話已經開始。我有什么:機器人發送消息“捕獲數字:123”機器人發送消息“對話:123”所以 Bot 也在對話之外捕獲了處理程序的消息,太出乎意料了。我必須在腳本中更改哪些內容才能使其正常工作?
查看完整描述

1 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

我計劃conversation在該庫的未來版本中刪除該方法,因為正如您所看到的,很快就會遇到很大的限制,因為將基于回調的事件方法與命令式對話風格混合起來很困難。我建議您改用FSM 風格的對話。您應該能夠輕松地調整該答案的代碼以“等待數字”:


from enum import Enum, auto


class State(Enum):

? ? WAIT_DIGITS = auto()


conversation_state = {}


@client.on(events.NewMessage)

async def handler(event):

? ? who = event.sender_id

? ? state = conversation_state.get(who)

? ??

? ? if state is None:

? ? ? ? await event.respond('Please send digits!')

? ? ? ? conversation_state[who] = State.WAIT_DIGITS


? ? elif state == State.WAIT_DIGITS:

? ? ? ? if event.text.isdigit():

? ? ? ? ? ? digits = event.text

? ? ? ? ? ? await event.respond(f'Thanks for your digits! {digits}')

? ? ? ? ? ? del conversation_state[who]

? ? ? ? else:

? ? ? ? ? ? await event.respond('Please only send digits, not letters')

您可以輕松地為此添加更多抽象(根據狀態為其他函數構建自己的裝飾器,或者只是將每個狀態的代碼分離到另一個函數,使用它們的返回值作為下一個狀態等)。


查看完整回答
反對 回復 2023-10-11
  • 1 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號