第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何僅在 Telethon 對話中處理 NewMessage

如何僅在 Telethon 對話中處理 NewMessage

臨摹微笑 2023-10-11 20:05:36
我的機器人代碼中有兩個處理程序:my_conversation - 捕獲“/start”消息并開始新對話,其中等待來自用戶的消息數(shù)字 - 按模式捕獲消息 - 僅數(shù)字    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())我的期望:我發(fā)送“/start”機器人開始對話并回復(fù)“我正在等待消息”我發(fā)送“123”機器人發(fā)送消息“對話:123”,因為對話已開始。其他處理程序必須忽略消息,因為對話已經(jīng)開始。我有什么:機器人發(fā)送消息“捕獲數(shù)字:123”機器人發(fā)送消息“對話:123”所以 Bot 也在對話之外捕獲了處理程序的消息,太出乎意料了。我必須在腳本中更改哪些內(nèi)容才能使其正常工作?
查看完整描述

1 回答

?
慕標(biāo)5832272

TA貢獻1966條經(jīng)驗 獲得超4個贊

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


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')

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


查看完整回答
反對 回復(fù) 2023-10-11
  • 1 回答
  • 0 關(guān)注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號