溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架

發(fā)布時(shí)間:2021-10-21 16:32:56 來(lái)源:億速云 閱讀:134 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架”吧!

Python-wechaty能夠使用少量代碼即可完成一個(gè)機(jī)器人,使用起來(lái)非常簡(jiǎn)單,基于OOP的設(shè)計(jì)思路能夠很好監(jiān)聽(tīng)和處理微信內(nèi)部大量的事件,比如:自動(dòng)回復(fù)消息,定時(shí)發(fā)送消息,拉人入群,好友申請(qǐng)同意等等。此外,目前的插件系統(tǒng)里面有很多拿來(lái)即用的工具,比如拉人入群等。當(dāng)然開(kāi)發(fā)一個(gè)自己的插件也是非常簡(jiǎn)單,無(wú)需很高深的概念,只需要你能夠理解事件和OOP即可。

python-wechaty項(xiàng)目源于wechaty,甚至說(shuō)很大程度上代碼是直接從其翻譯過(guò)來(lái)的,然后加上一些python的特性,讓其更加pythonic。作為一個(gè)IM的入口工具,未來(lái)我們也將添加更多的Chatbot元素進(jìn)去,讓其能夠成為一個(gè)真正的聊天機(jī)器人。

在介紹python-wechaty之前,還是簡(jiǎn)要介紹一下wechaty。

wechaty

或許有很多人會(huì)把wechaty和wechat聯(lián)系起來(lái),畢竟在名稱上面只是一字之差。這個(gè)得從wechaty的起源開(kāi)始說(shuō)起,起初,此項(xiàng)目只是作為微信的一個(gè)工具庫(kù),能夠進(jìn)行一些簡(jiǎn)單的自動(dòng)化操作過(guò)程,比如:定時(shí)發(fā)送消息,入群消息發(fā)送,好友申請(qǐng)接受等。

可隨著項(xiàng)目的逐步更新,wechaty已支持主流的IM軟件,比如:微信,釘釘,Telegram。

這個(gè)項(xiàng)目從2016年開(kāi)始,到現(xiàn)在已經(jīng)獲取8k star,是一個(gè)非常穩(wěn)定且用戶量非常龐大的項(xiàng)目。官方對(duì)其給出的介紹是:

  • A Conversational AI RPA SDK for Chatbot

所以wechaty作為IM ChatBot的入口工具,是很多聊天機(jī)器人的基礎(chǔ)架構(gòu)組件,也將會(huì)逐步支持主流聊天機(jī)器人的功能。

python-wchaty的誕生

與Wechaty的結(jié)緣是在2019年底的一次技術(shù)沙龍會(huì)上,認(rèn)識(shí)到了原來(lái)6行代碼就能夠開(kāi)發(fā)出一款足夠靈活的機(jī)器人,當(dāng)時(shí)給我一個(gè)很大的震撼。微信作為我們?nèi)粘A奶旃ぞ咧?,如果能夠?qū)ζ渥鲆恍┳詣?dòng)化的過(guò)程,能夠很大程度上減少繁瑣過(guò)程的工作量,比如說(shuō):辦活動(dòng)時(shí)的拉人入群,定時(shí)提醒用戶打卡,提醒女朋友姨媽快來(lái)了等等。而wechaty能夠很好的支持以上所有功能,只需要簡(jiǎn)單的幾行代碼即可完成?;厝ブ缶土ⅠR著手相關(guān)資料的查閱,然后逐步進(jìn)入wechaty的社區(qū)。

一個(gè)很巧的機(jī)會(huì)群里面說(shuō)可以開(kāi)發(fā)一款go-wechaty的開(kāi)發(fā),當(dāng)時(shí)我就在想,為什么不能夠有一款python-wechaty呢,然后就毛遂自薦,成為了python-wechaty的聯(lián)合作者之一。由于對(duì)開(kāi)源軟件和DevOps不是很熟悉,起步階段遇到了很多的問(wèn)題,不過(guò)經(jīng)過(guò)社區(qū)大佬的耐心指導(dǎo),目前已能夠完成對(duì)issue和feature的開(kāi)發(fā)和管理。親身經(jīng)歷,建議大家有機(jī)會(huì)一定要參加開(kāi)源項(xiàng)目,能夠讓你學(xué)習(xí)到很多知識(shí)點(diǎn)。

最簡(jiǎn)單的Bot

使用python-wechaty能夠很簡(jiǎn)單的開(kāi)發(fā)一款Bot,特別是使用了一個(gè)插件系統(tǒng)之后,如下所示:

如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架

以上代碼中實(shí)現(xiàn)了兩個(gè)主要的功能:

  • 當(dāng)Bot接受到一個(gè)#ding信號(hào),就立馬回復(fù)一個(gè)dong消息,這就是一個(gè)基本的ding-dong-bot。

  • 當(dāng)接受到查閱天氣的文本語(yǔ)句時(shí),則返回對(duì)應(yīng)的天氣查詢結(jié)果,比如:今天天氣如何?

以上兩個(gè)插件是系統(tǒng)內(nèi)置的,后續(xù)也會(huì)增加更多的拿來(lái)即用的實(shí)用插件,當(dāng)然用戶也可創(chuàng)建自己的插件,方式很簡(jiǎn)單。

如何開(kāi)發(fā)插件系統(tǒng)

在了解如何開(kāi)發(fā)插件系統(tǒng)之前,可先移駕Plug-in`,插件系統(tǒng)支持對(duì)插件的安裝,卸載,自定義配置等內(nèi)容  ,至于具體的實(shí)現(xiàn)形式我相信也是需要面對(duì)具體的應(yīng)用場(chǎng)景。而在Wechaty這個(gè)面相事件型且交互邏輯非常簡(jiǎn)單的場(chǎng)景下,插件的設(shè)計(jì)與開(kāi)發(fā)就非常簡(jiǎn)單。

我們現(xiàn)在直接來(lái)看看,系統(tǒng)內(nèi)置的叮咚插件是如何實(shí)現(xiàn)的。

"""basic ding-dong bot for the wechaty plugin""" from typing import Union  from wechaty import Message, Contact, Room, FileBox from wechaty.plugin import WechatyPlugin   class DingDongPlugin(WechatyPlugin):     """basic ding-dong plugin"""     @property     def name(self):         """name of the plugin"""         return 'ding-dong'      async def on_message(self, msg: Message):         """listen message event"""         from_contact = msg.talker()         text = msg.text()         room = msg.room()         if text == '#ding':             conversation: Union[                 Room, Contact] = from_contact if room is None else room             await conversation.ready()             await conversation.say('dong')

代碼很簡(jiǎn)單,不過(guò)也是需要氛圍一下幾個(gè)層面來(lái)介紹。

  • WechatyPlugin

  • on_[event_name]

  • init_plugin

WechatyPlugin

此類為一個(gè)抽象類,所有的插件必須要繼承此基類,并重寫(xiě)其中的函數(shù)。

  • name 屬性函數(shù)為抽象函數(shù),必須重寫(xiě)。主要是為了標(biāo)識(shí)插件的名稱,作為插件唯一性身份認(rèn)證。

  • init_plugin 初始化函數(shù)能夠支持插件的初始化過(guò)程,比如初始化定時(shí)器對(duì)象,數(shù)據(jù)庫(kù)延遲連接對(duì)象等。

  • on_[event_name]此類函數(shù)主要是為了監(jiān)聽(tīng)系統(tǒng)中的不同事件,比如:on_message, on_login,  on_friendship等事件的監(jiān)聽(tīng)都只需要重寫(xiě)一下函數(shù)即可完成。不同插件之間以及不同事件之間都是獨(dú)立的,能夠很好的專注于不同業(yè)務(wù)場(chǎng)景下的開(kāi)發(fā)。

event_name

python-wechaty很大程度上是由事件驅(qū)動(dòng),畢竟很多操作都是基于消息接受觸發(fā),由此事件的監(jiān)聽(tīng)是其基礎(chǔ)特性,可能第一感覺(jué)就是實(shí)用EventEmitter這種模式來(lái)監(jiān)聽(tīng)事件,這樣每個(gè)事件我都可以注冊(cè)不同的函數(shù)來(lái)監(jiān)聽(tīng),每個(gè)函數(shù)中會(huì)有不同的邏輯處理。這也是傳統(tǒng)的事件監(jiān)聽(tīng)方法,可這至少會(huì)給開(kāi)發(fā)上帶來(lái)一些不方便:函數(shù)的參數(shù)需要查閱文檔才能夠獲知,標(biāo)準(zhǔn)的函數(shù)式編程。

  • 我不是說(shuō)函數(shù)式編程不好,只是在這種場(chǎng)景下對(duì)系統(tǒng)性能并不能提升多少,且python-wechaty 也并不能太注重性能。

由此將其擴(kuò)展了OOP的方式,用戶可繼承Wechaty或WechatyPlugin來(lái)監(jiān)聽(tīng)不同的事件,且在常規(guī)的代碼編輯器里面重寫(xiě)函數(shù)時(shí)就可以自動(dòng)填充函數(shù)參數(shù),從而減少查閱事件函數(shù)參數(shù)的問(wèn)題。

監(jiān)聽(tīng)事件的類型有:error, friendship, heartbeat, login, logout, message, ready,  room_invite, room_join, room_leave, room_topic, scan。

在上面已經(jīng)展示了WechatyPlugin如何開(kāi)發(fā),需要注意的地方,那接下來(lái)我將給大家詳細(xì)介紹一下最基礎(chǔ)的每日一說(shuō)的機(jī)器人如何開(kāi)發(fā)。

每日一說(shuō)機(jī)器人

每日一說(shuō),顧名思義每天每個(gè)固定時(shí)間段發(fā)送一個(gè)祝?;蛱嵝眩唧w內(nèi)容可自定義。這其中需要注意幾點(diǎn):

  • 機(jī)器人內(nèi)部有一個(gè)調(diào)度器,用于調(diào)度時(shí)間事件的觸發(fā)。

  • 機(jī)器人可給制定的人和群發(fā)送對(duì)應(yīng)的內(nèi)容。

以上的功能我封裝成一個(gè)插件,然后注入到python-wechaty中即可。

"""daily word plugin""" from datetime import datetime  from apscheduler.schedulers.asyncio import AsyncIOScheduler  from wechaty import Wechaty from wechaty.plugin import WechatyPlugin   class DailyPlugin(WechatyPlugin):     """     say something everyday, like `Daily Words`     """     @property     def name(self) -> str:         """get the name of the plugin"""         return 'dayily'      async def tick(self):         """time tick for the plugin scheduler"""         room_id = get_room_id()         room = self.bot.Room.load(room_id)         await room.ready()         await room.say(f'i love you -> {datetime.now()}')      async def init_plugin(self, wechaty: Wechaty):         """init plugin"""         await super().init_plugin(wechaty)         scheduler = AsyncIOScheduler()         scheduler.add_job(self.tick, 'cron', hour=6, minute=16)         scheduler.start()

插件就開(kāi)發(fā)完了,然后將其注入到Wechaty中即可跑起來(lái)。

async def main():     bot = Wechaty().use(DailyPlugin())     await bot.start() asyncio.run(main())

是不是超級(jí)簡(jiǎn)單,插件系統(tǒng)幫你隔離所有的業(yè)務(wù)場(chǎng)景,讓代碼非常易于開(kāi)發(fā)和維護(hù)。

python-wechaty還可以做更多

現(xiàn)在python-wechaty只完成了基本的Chatbot入口工具,離真正的聊天機(jī)器人還距離很遠(yuǎn),所以未來(lái)還有很多工作量可以做。

感謝各位的閱讀,以上就是“如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何理解Python-Wechaty: 面向IM軟件的聊天機(jī)器人框架這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI