1. 如何用Python開發(fā)QQ機(jī)器人

        共 5552字,需瀏覽 12分鐘

         ·

        2021-06-08 01:40

        點(diǎn)擊上方Python知識(shí)圈,設(shè)為星標(biāo)

        回復(fù)100獲取100題PDF

        閱讀文本大概需要 5 分鐘


        來源:tanleiDD

        https://blog.csdn.net/TL18382950497/article/details/112321956

        前言

        • 雖然該文最終是達(dá)到以python開發(fā)mirai機(jī)器人的目的,但起步教程,尤其是環(huán)境配置上仍然有大量的相同操作,對(duì)其他編程語言仍有借鑒之處
        • 假設(shè)你已經(jīng)安裝好了 Java、Python等運(yùn)行必須的環(huán)境

        mirai生態(tài)

        • mirai官方生態(tài)文檔[1]
        • 要使用mirai開發(fā)QQ機(jī)器人,首先要對(duì)其生態(tài)有一定的了解,因?yàn)樗珡?fù)雜了,坑特別多,所以多了解一點(diǎn),遇到問題之后解決起來也會(huì)更快
        • mirai生態(tài)匯總圖
        • 簡(jiǎn)單來說,mirai生態(tài)的核心是Mirai框架,其中包含了mirai-coremirai-core-api兩部分。
        • 其中,前者負(fù)責(zé)協(xié)議相關(guān)的內(nèi)容,而后者負(fù)責(zé)對(duì)外提供操作前者的接口。因此與程序員直接打交道的是mirai-core-api,而mirai-core,對(duì)我們是不可見的。
        • 使用mirai-core-api就已經(jīng)可以開發(fā)QQ機(jī)器人了,但對(duì)萌新來說難度還是太大,于是mirai官方開發(fā)組編寫了一個(gè)QQ機(jī)器人程序,mirai-console,它在 mirai 框架提供的基礎(chǔ)功能的基礎(chǔ)上進(jìn)行了封裝并進(jìn)一步提供了更方便的開放接口。
        • 有了mirai-console,我們就不用直接去開發(fā)mirai的QQ機(jī)器人了,而是去開發(fā)mirai-console的插件,如下面的模式:
        • 尷尬的是,開發(fā)mirai-console的插件,又需要使用java或者kotlin。如果你跟我一樣,對(duì)他們都不熟悉,那么官方的另一個(gè)插件mirai-api-http,則可以解決這個(gè)問題。
        • 于是借助mirai-api-http開發(fā)QQ機(jī)器人,就成了下面這種模式:
        • 可以看到,當(dāng)我們使用了mirai-api-http后,我們就有了更多的開發(fā)語言選擇。此處我選擇python。

        起步

        使用 mirai-console-loader 啟動(dòng) mirai-console

        • 根據(jù)上面的介紹,要開發(fā)一個(gè)mirai的QQ機(jī)器人,我們首先需要將mirai-console給運(yùn)行起來,而要做到這一步,可難。例如你需要準(zhǔn)備mirai-core,mirai-console 和 mirai-console-terminal,然后還需要通過一大串指令來啟動(dòng)它。

        • 而官方顯然考慮到這一點(diǎn),為了挽回被這一高難度操作勸退的萌新,官方又推出了mirai-console-loader(簡(jiǎn)稱mcl) —— mirai-console 的官方一鍵啟動(dòng)器。因此你僅需要下載它即可(第一步說的都不用管0.0)。github倉庫位置:mirai-console-loader[2]

        • 下載完成mcl之后,解壓、打開cmd、切換到mcl所在目錄、運(yùn)行mcl。如下圖:

        • 不出意外的話,mirai-console就成功啟動(dòng)了,如下圖:

        • 然而,咱從官方下載的項(xiàng)目,運(yùn)行時(shí)卻出錯(cuò)了0.0 ( 如果你沒有出錯(cuò),忽略此步驟 )。原因是配置文件出錯(cuò) (太倒霉了 - -)。修改方式如圖:

        • 然后再重新運(yùn)行一下,mcl,不出意料的話,能成功運(yùn)行。

        • 第一個(gè)大坎就邁過了…接下來是另一個(gè)大坎

        使用 mirai-login-solver-selenium 處理滑塊驗(yàn)證輔助登錄

        • 在成功啟動(dòng)的mcl窗口,運(yùn)行命令登錄qq:login 賬號(hào) 密碼
        • 應(yīng)該是會(huì)出錯(cuò)的,因?yàn)閙irai-console在登錄時(shí),不能處理滑塊驗(yàn)證:
        • 于是我們需要mirai的另一個(gè)項(xiàng)目 mirai-login-solver-selenium[3] 來輔助登錄
        • mirai-login-solver-selenium安裝步驟 (需要先安裝 Chrome 瀏覽器)
        • 先結(jié)束掉之前運(yùn)行的 mirai-console, 然后在命令行運(yùn)行如下命令,添加該包
        mcl --update-package net.mamoe:mirai-login-solver-selenium --channel nightly --type plugin
        • 然后再重新運(yùn)行mcl,這樣mcl就會(huì)去嘗試下載mirai-login-solver-selenium。

        • 然而,我這一步也出現(xiàn)問題了(如果你沒有問題,也請(qǐng)?zhí)^)。因?yàn)樗玫搅藄elenium,所以就要用chromedriver。但是chromedriver總是下載失敗,所以這一步需要手動(dòng)下載chromedriver,然后替換到對(duì)應(yīng)目錄。步驟如下:

          1. 查看cmd窗口,找到mcl正在下載的chromedriver是什么版本
          2. 然后去chromedriver的另一個(gè)鏡像源下載,推薦:chromedriver[4]
          3. 找到一個(gè)版本號(hào)相近的即可,例如我就下載 86.0.4240.22
          4. 將下載好的文件解壓,再重命名成chromedriver-86.0.4240.198.exe,也就是剛剛我們?cè)诿钚写翱诓榭吹奈募?,一定要跟它想下載的文件名一致
          5. 結(jié)束之前運(yùn)行的mcl命令行程序,然后將準(zhǔn)備好的chromedriver-86.0.4240.198.exe, 替換到以下目錄
          6. 重新運(yùn)行mcl程序,如果一切順利,就可以繼續(xù)之前的步驟,輸入命令:login 賬號(hào) 密碼 嘗試登錄。接下來會(huì)彈出一個(gè)瀏覽器窗口,你只需要傻瓜式的完成登錄驗(yàn)證即可。如果登錄成功,以后的每次登錄,應(yīng)該都是不需要再次驗(yàn)證的。
        • 又跨過一個(gè)坎…接下來就到了另外一個(gè)坎

        使用 mirai-api-http 增加語言拓展性 (為了能用其他語言來開發(fā))

        • 前面一直在說 mirai-api-http,但是到目前為止,我們都還沒有用上它。前面的工作就做了兩個(gè)事情

          1. 使用mcl運(yùn)行mirai-console
          2. 使用 mirai-login-solver-selenium 輔助通過滑塊驗(yàn)證碼,完成登錄
        • 那么接下來就開始用mirai-api-http,首先在mirai-api-http項(xiàng)目地址,下載mirai-api-http[5]

        • 然后將下載到的jar包,放在plugin文件夾下,如圖

        • 然后再重啟mcl,重新進(jìn)行登錄。這樣準(zhǔn)備工作就完成了,但是我出現(xiàn)了一些錯(cuò)誤,看意思應(yīng)該是簽名驗(yàn)證的問題,錯(cuò)誤如下:

        • 四處咨詢后了解到,是oracle JDK的問題,因此只需要將orcaleJDK 替換成為 open JDK即可,步驟如下:

        1. 下載 open JDK[6],例如我下載如圖所示的版本:

        2. 解壓open JDK, 并放在你認(rèn)為合適的位置,例如我放在如下圖所示的位置:

        3. 添加 jdk 所在路徑到環(huán)境變量:此電腦 ->右鍵屬性 -> 高級(jí)系統(tǒng)設(shè)置 -> 高級(jí) -> 環(huán)境變量, 再按下圖操作

        通過 graia-application-mirai 使用 python 開發(fā) mirai 機(jī)器人

        • 前面的操作,直到該步為止,基本對(duì)所有使用除java/kotlin語言的程序員,都是通用的。而后面的操作,僅寫給使用python的程序員
        • graia-application-mirai官方文檔[7]
        • 首先對(duì)mirai-api-http進(jìn)行配置,如圖:

          以下是參考,自己看著配就行
        # file: mcl-1.0.3/config/net.mamoe.mirai.api.http/setting.yml
        authKey: graia-mirai-api-http-authkey # 你可以自己設(shè)定, 這里作為示范

        # 可選,緩存大小,默認(rèn)4096.緩存過小會(huì)導(dǎo)致引用回復(fù)與撤回消息失敗
        cacheSize4096

        enableWebsockettrue # 是否啟用 websocket 方式, 若使用 websocket 方式交互會(huì)得到更好的性能
        host'0.0.0.0' # httpapi 服務(wù)監(jiān)聽的地址, 錯(cuò)誤的設(shè)置會(huì)造成 Graia Application 無法與其交互
        port8080 # httpapi 服務(wù)監(jiān)聽的端口, 錯(cuò)誤的設(shè)置會(huì)造成 Graia Application 無法與其交互
        • 重啟mcl, 更新配置

        • 接著,安裝 python 操作 mirai-api-http 接口的模塊:graia-application-mirai

          pip install graia-application-mirai
        • 將以下代碼復(fù)制到bot.py,按注釋提示,再結(jié)合剛剛對(duì)mirai-api-http的配置,稍作修改。然后運(yùn)行

        from graia.broadcast import Broadcast
        from graia.application import GraiaMiraiApplication, Session
        from graia.application.message.chain import MessageChain
        import asyncio

        from graia.application.message.elements.internal import Plain
        from graia.application.friend import Friend

        loop = asyncio.get_event_loop()

        bcc = Broadcast(loop=loop)
        app = GraiaMiraiApplication(
            broadcast=bcc,
            connect_info=Session(
                host="http://localhost:8080", # 填入 httpapi 服務(wù)運(yùn)行的地址
                authKey="graia-mirai-api-http-authkey", # 填入 authKey
                account=5234120587, # 你的機(jī)器人的 qq 號(hào)
                websocket=True # Graia 已經(jīng)可以根據(jù)所配置的消息接收的方式來保證消息接收部分的正常運(yùn)作.
            )
        )

        @bcc.receiver("FriendMessage")
        async def friend_message_listener(app: GraiaMiraiApplication, friend: Friend):
            await app.sendFriendMessage(friend, MessageChain.create([
                Plain("Hello, World!")
            ]))

        app.launch_blocking()
        • 然后向你的QQ機(jī)器人,隨便發(fā)送一條消息,如果它回復(fù)你Hello, World!,則表示運(yùn)行成功

        • 成功所示如下:

        結(jié)語

        上面的全部操作,不過是使用mirai進(jìn)行開發(fā)QQ機(jī)器人的起步教程而已,需要了解更多,還是去閱讀官方文檔,以學(xué)習(xí)更多的api。

        PS:我自己建了一個(gè)每天可領(lǐng)外賣優(yōu)惠券的號(hào),經(jīng)常領(lǐng)到15元的無門檻券,不花冤枉錢~

        加微信送《Python知識(shí)點(diǎn)100題PDF》

        pk哥個(gè)人微信


        添加pk哥個(gè)人微信即送Python資料


        Python知識(shí)點(diǎn)100題的PDF

        Python相關(guān)的電子書10本


        記得備注:“100題”




        往期推薦
        01

        公眾號(hào)所有文章匯總導(dǎo)航(2-10更新)

        02

        永久白嫖!新發(fā)現(xiàn)的外賣漏洞??!請(qǐng)低調(diào)使用

        03

        求你了,別再用 pip 那烏龜?shù)乃俣热グ惭b庫了!


        點(diǎn)擊閱讀原文查看pk哥原創(chuàng)視頻

        我就知道你“在看”

        瀏覽 65
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产亚洲综合AV婷婷 | 欧性猛交ⅩXXX乱大交 | 国产成人精品一区二三区熟女在线 | 国产成人无码免费看片 | 一本一道久久综合狠狠躁牛牛影视 |