<samp id="wckti"></samp>
<var id="wckti"></var>
  • <rt id="wckti"></rt>

    <rt id="wckti"><bdo id="wckti"></bdo></rt><strong id="wckti"><noscript id="wckti"></noscript></strong>
  • 當前位置:聯(lián)升科技 > 技術(shù)資訊 > 開(kāi)發(fā)技術(shù) >

    Python-Wechaty: 面向IM軟件的聊天機器人框架

    2020-12-14    作者:青燈教育Python學(xué)院    來(lái)源:今日頭條    閱讀: 次

    Python-wechaty能夠使用少量代碼即可完成一個(gè)機器人,使用起來(lái)非常簡(jiǎn)單,基于OOP的設計思路能夠很好監聽(tīng)和處理微信內部大量的事件,比如:自動(dòng)回復消息,定時(shí)發(fā)送消息,拉人入群,好友申請同意等等。此外,目前的插件系統里面有很多拿來(lái)即用的工具,比如拉人入群等。當然開(kāi)發(fā)一個(gè)自己的插件也是非常簡(jiǎn)單,無(wú)需很高深的概念,只需要你能夠理解事件和OOP即可。
    python-wechaty項目源于wechaty,甚至說(shuō)很大程度上代碼是直接從其翻譯過(guò)來(lái)的,然后加上一些python的特性,讓其更加pythonic。作為一個(gè)IM的入口工具,未來(lái)我們也將添加更多的Chatbot元素進(jìn)去,讓其能夠成為一個(gè)真正的聊天機器人。
    在介紹python-wechaty之前,還是簡(jiǎn)要介紹一下wechaty。
    wechaty
    或許有很多人會(huì )把wechaty和wechat聯(lián)系起來(lái),畢竟在名稱(chēng)上面只是一字之差。這個(gè)得從wechaty的起源開(kāi)始說(shuō)起,起初,此項目只是作為微信的一個(gè)工具庫,能夠進(jìn)行一些簡(jiǎn)單的自動(dòng)化操作過(guò)程,比如:定時(shí)發(fā)送消息,入群消息發(fā)送,好友申請接受等。
    可隨著(zhù)項目的逐步更新,wechaty已支持主流的IM軟件,比如:微信,釘釘,Telegram。
    這個(gè)項目從2016年開(kāi)始,到現在已經(jīng)獲取8k star,是一個(gè)非常穩定且用戶(hù)量非常龐大的項目。官方對其給出的介紹是:
    A Conversational AI RPA SDK for Chatbot
    所以wechaty作為IM ChatBot的入口工具,是很多聊天機器人的基礎架構組件,也將會(huì )逐步支持主流聊天機器人的功能。
    python-wchaty的誕生
    與Wechaty的結緣是在2019年底的一次技術(shù)沙龍會(huì )上,認識到了原來(lái)6行代碼就能夠開(kāi)發(fā)出一款足夠靈活的機器人,當時(shí)給我一個(gè)很大的震撼。微信作為我們日常聊天工具之一,如果能夠對其做一些自動(dòng)化的過(guò)程,能夠很大程度上減少繁瑣過(guò)程的工作量,比如說(shuō):辦活動(dòng)時(shí)的拉人入群,定時(shí)提醒用戶(hù)打卡,提醒女朋友姨媽快來(lái)了等等。而wechaty能夠很好的支持以上所有功能,只需要簡(jiǎn)單的幾行代碼即可完成?;厝ブ缶土ⅠR著(zhù)手相關(guān)資料的查閱,然后逐步進(jìn)入wechaty的社區。
    一個(gè)很巧的機會(huì )群里面說(shuō)可以開(kāi)發(fā)一款go-wechaty的開(kāi)發(fā),當時(shí)我就在想,為什么不能夠有一款python-wechaty呢,然后就毛遂自薦,成為了python-wechaty的聯(lián)合作者之一。由于對開(kāi)源軟件和DevOps不是很熟悉,起步階段遇到了很多的問(wèn)題,不過(guò)經(jīng)過(guò)社區大佬的耐心指導,目前已能夠完成對issue和feature的開(kāi)發(fā)和管理。親身經(jīng)歷,建議大家有機會(huì )一定要參加開(kāi)源項目,能夠讓你學(xué)習到很多知識點(diǎn)。
    最簡(jiǎn)單的Bot
    使用python-wechaty能夠很簡(jiǎn)單的開(kāi)發(fā)一款Bot,特別是使用了一個(gè)插件系統之后,如下所示:
    以上代碼中實(shí)現了兩個(gè)主要的功能:
    當Bot接受到一個(gè)#ding信號,就立馬回復一個(gè)dong消息,這就是一個(gè)基本的ding-dong-bot。
    當接受到查閱天氣的文本語(yǔ)句時(shí),則返回對應的天氣查詢(xún)結果,比如:今天天氣如何?
    以上兩個(gè)插件是系統內置的,后續也會(huì )增加更多的拿來(lái)即用的實(shí)用插件,當然用戶(hù)也可創(chuàng )建自己的插件,方式很簡(jiǎn)單。
    如何開(kāi)發(fā)插件系統
    在了解如何開(kāi)發(fā)插件系統之前,可先移駕Plug-in`,插件系統支持對插件的安裝,卸載,自定義配置等內容 ,至于具體的實(shí)現形式我相信也是需要面對具體的應用場(chǎng)景。而在Wechaty這個(gè)面相事件型且交互邏輯非常簡(jiǎn)單的場(chǎng)景下,插件的設計與開(kāi)發(fā)就非常簡(jiǎn)單。
    我們現在直接來(lái)看看,系統內置的叮咚插件是如何實(shí)現的。
    """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
    此類(lèi)為一個(gè)抽象類(lèi),所有的插件必須要繼承此基類(lèi),并重寫(xiě)其中的函數。
    name 屬性函數為抽象函數,必須重寫(xiě)。主要是為了標識插件的名稱(chēng),作為插件唯一性身份認證。
    init_plugin 初始化函數能夠支持插件的初始化過(guò)程,比如初始化定時(shí)器對象,數據庫延遲連接對象等。
    on_[event_name]此類(lèi)函數主要是為了監聽(tīng)系統中的不同事件,比如:on_message, on_login, on_friendship等事件的監聽(tīng)都只需要重寫(xiě)一下函數即可完成。不同插件之間以及不同事件之間都是獨立的,能夠很好的專(zhuān)注于不同業(yè)務(wù)場(chǎng)景下的開(kāi)發(fā)。
    event_name
    python-wechaty很大程度上是由事件驅動(dòng),畢竟很多操作都是基于消息接受觸發(fā),由此事件的監聽(tīng)是其基礎特性,可能第一感覺(jué)就是實(shí)用EventEmitter這種模式來(lái)監聽(tīng)事件,這樣每個(gè)事件我都可以注冊不同的函數來(lái)監聽(tīng),每個(gè)函數中會(huì )有不同的邏輯處理。這也是傳統的事件監聽(tīng)方法,可這至少會(huì )給開(kāi)發(fā)上帶來(lái)一些不方便:函數的參數需要查閱文檔才能夠獲知,標準的函數式編程。
    我不是說(shuō)函數式編程不好,只是在這種場(chǎng)景下對系統性能并不能提升多少,且python-wechaty 也并不能太注重性能。
    由此將其擴展了OOP的方式,用戶(hù)可繼承Wechaty或WechatyPlugin來(lái)監聽(tīng)不同的事件,且在常規的代碼編輯器里面重寫(xiě)函數時(shí)就可以自動(dòng)填充函數參數,從而減少查閱事件函數參數的問(wèn)題。
    監聽(tīng)事件的類(lèi)型有:error, friendship, heartbeat, login, logout, message, ready, room_invite, room_join, room_leave, room_topic, scan。
    在上面已經(jīng)展示了WechatyPlugin如何開(kāi)發(fā),需要注意的地方,那接下來(lái)我將給大家詳細介紹一下最基礎的每日一說(shuō)的機器人如何開(kāi)發(fā)。
    每日一說(shuō)機器人
    每日一說(shuō),顧名思義每天每個(gè)固定時(shí)間段發(fā)送一個(gè)祝?;蛱嵝?,具體內容可自定義。這其中需要注意幾點(diǎn):
    機器人內部有一個(gè)調度器,用于調度時(shí)間事件的觸發(fā)。
    機器人可給制定的人和群發(fā)送對應的內容。
    以上的功能我封裝成一個(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()) 
    是不是超級簡(jiǎn)單,插件系統幫你隔離所有的業(yè)務(wù)場(chǎng)景,讓代碼非常易于開(kāi)發(fā)和維護。
    python-wechaty還可以做更多
    現在python-wechaty只完成了基本的Chatbot入口工具,離真正的聊天機器人還距離很遠,所以未來(lái)還有很多工作量可以做。


    相關(guān)文章

    我們很樂(lè )意傾聽(tīng)您的聲音!
    即刻與我們取得聯(lián)絡(luò )
    成為日后肩并肩合作的伙伴。

    行業(yè)資訊

    聯(lián)系我們

    13387904606

    地址:新余市仙女湖區仙女湖大道萬(wàn)商紅A2棟

    手機:13755589003
    QQ:122322500
    微信號:13755589003

    江西新余網(wǎng)站設計_小程序制作_OA系統開(kāi)發(fā)_企業(yè)ERP管理系統_app開(kāi)發(fā)-新余聯(lián)升網(wǎng)絡(luò )科技有限公司 贛ICP備19013599號-1   贛公網(wǎng)安備 36050202000267號   

    微信二維碼
    五月天婷婷在线观看历史|国产欧美日韩免费一区二区|亚洲成a∨人片在无码|欧美日韩不卡一区二区三区中文字|每日更新国产精品视频|成年人在线观看视频免费|亚洲A片一区二区三区在线观看

    
    

    <samp id="wckti"></samp>
    <var id="wckti"></var>
  • <rt id="wckti"></rt>

    <rt id="wckti"><bdo id="wckti"></bdo></rt><strong id="wckti"><noscript id="wckti"></noscript></strong>