最近簡直惰怠。公眾號的粉絲都開始負增長了。
其實一直沒有閒著,只不過沒寫成文字。大家可以在優酷關注我的帳號:不二小段,我會把日常一些探索錄屏給大家。
今天來簡單談談有關QQ機器人和微信機器人一些玩法。視頻已經錄過了,所以我就不寫太詳細了。
目錄的話大概是
→做個QQ機器人扔群裡和小冰炸群
→使用QQ消息控制自己電腦的網易雲音樂
→微信個人號變身機器人
關鍵詞:QQ/微信機器人;Python模擬滑鼠、鍵盤輸入;Python調用系統命令
環境:Windows、Python 3.5、網易雲音樂桌面版
庫:qqbot、itchat、wxpy、pyuserinput、subprocess
基礎:不需要什麼基礎,最好了解圖靈機器人的API接口調用
◆1 ◆
之前我們談過幾次微信公眾號的自動回復功能,其實用的都是圖靈語料庫的
API。最近我發現QQ群裡也有機器人,分別是小冰和小Q,其中小Q也是用的圖靈機器人,但是一個QQ群裡不能同時存在兩個官方機器人,那麼我們有沒有辦法把自己的QQ號打造成機器人,然後讓它在群裡和小冰尬聊呢?
自然是可以的,這也是我們今天這篇文章的開端。
我們首先來到qqbot。
具體的文檔詳見 https://github.com/pandolia/qqbot
直接 pip install qqbot 安裝後,大家可以按照官方樣例做一個最簡單的登陸和內容返回。
我這邊直接按照官方提供的樣例進行消息的註冊。之後我們通過之前做過的圖靈機器人API,將消息內容和聯繫人QQ號傳至圖靈API後,把返回內容發送回去即可。
首先是我自己寫的對圖靈機器人消息處理的函數。(talk.py)
import requests
import json
def talk(content, userid): url = 'http://www.tuling123.com/openapi/api' s = requests.session() d = {"key": "", "info": content, "userid": userid} data = json.dumps(d) r = s.post(url, data=data) text = json.loads(r.text) code = text["code"]
if code == 100000: result = text["text"]
elif code == 200000: result = text["text"] + '\n' + text["url"]
elif code == 302000: result = text["text"] + '\n' + text["list"][0]["article"] + text["list"][0]["detailurl"]
elif code == 308000: result = text["text"] + '\n' + text["list"][0]["info"] + text["list"][0]["detailurl"]
return result
然後是qqbot這邊的操作。
import talk
from qqbot import QQBotSlot as qqbotslot, RunBot@qqbotslot
def onQQMessage(bot, contact, member, content): if '@ME' in content: result = talk.talk(content, contact.qq) bot.SendTo(contact, '@' + member.name + ' ' + result)
if __name__ == '__main__': RunBot()
代碼應該是十分好理解的。十分方便就可以把自己的QQ號變身機器人了。
這邊有一個不方便的地方。因為qqbot是封裝了網頁QQ的接口,而網頁QQ並不支持文件、語音或者@別人的功能。所以在QQ群裡,我自己的機器人總是@不到小冰。後面還是通過酷Q+圖靈實現的炸群。
詳見 http://www.tuling123.com/help/h_centqq_robot.jhtml?nav=doc
第一部分的視頻(裡面有兩個機器人炸群的內容):
http://v.youku.com/v_show/id_XMjc0MzU3NzI0OA==
◆2 ◆
群機器人最終的解決方案居然是酷Q+圖靈,這讓我感覺自己寫代碼毫無意義,十分尷尬。於是我就在想,這個機器人還可以做更多事情嗎?
我們設想一下,既然機器人可以接受來自QQ的消息,又可以對消息內容進行判斷後進行後續操作,那麼我們能否通過它來對自己的PC電腦做監控或者控制的功能?
於是我嘗試了一個相對簡單的想法:控制我電腦的網易雲音樂。
有了這個想法之後我在思考實現的方式。網易雲顯然是沒有給我們預留和Python交互的接口的。但是我想起之前踩過的一個深坑,那就是網易雲的全局快捷鍵和PyCharm的快捷鍵發生了衝突,導致我PyCharm格式化代碼的功能不能正常使用。那麼我們能否通過模擬全局快捷鍵的按鍵來實現對網易雲音樂的控制。
於是開始尋找Python模擬鍵盤的庫,找到了pyuserinput,可以很方便地模擬滑鼠和鍵盤的輸入內容(包括多按鍵組合快捷鍵)。
詳細內容可以看 https://github.com/SavinaRoja/PyUserInput
網易雲的快捷鍵可以在設置裡看到。
(空的那裡就是我之前提到的快捷鍵衝突的坑)
下面直接給代碼:
import talk
from qqbot import QQBotSlot as qqbotslot, RunBot
from pykeyboard import PyKeyboardk = PyKeyboard()
@qqbotslot
def onQQMessage(bot, contact, member, content): if content == '播放': k.press_keys([k.control_key, k.alt_key, 'p']) bot.SendTo(contact, '開始播放')
elif content == '暫停': k.press_keys([k.control_key, k.alt_key, 'p']) bot.SendTo(contact, '暫停播放')
elif content == '上一首': k.press_keys([k.control_key, k.alt_key, k.left_key]) bot.SendTo(contact, '切換上一首')
elif content == '下一首': k.press_keys([k.control_key, k.alt_key, k.right_key]) bot.SendTo(contact, '切換下一首')
if __name__ == '__main__': RunBot()
使用自己的QQ小號掃描二維碼登陸之後,發送相應消息就可以實現網易雲的播放/暫停/切歌功能。
第二部分的視頻(可以看到切歌的效果):
http://v.youku.com/v_show/id_XMjc0NDc4NTQ0NA==
◆3 ◆
來到第三部分。
第三部分裡面其實已經沒有什麼新鮮內容了,前面已經把大塊需要做的功能實現了,只需要把QQbot做好的東西遷移到我們的微信上就可以了。
微信這邊推薦給大家兩個庫,一個是itchat,一個是wxpy。
詳見:
https://github.com/littlecodersh/ItChat
https://github.com/youfou/wxpy
我寫完QQbot控制網易雲之後,有小夥伴說這樣需要網易雲已經打開的狀態下,能否添加打開/關閉網易雲的功能。
這樣的操作其實已經涉及到一些系統命令了。於是我們嘗試使用subprocess的Popen函數調用系統命令。
大家可以自己去了解Popen函數,我這邊直接給出打開/關閉的操作。
打開網易雲的操作是很簡單的,在Windows的CMD裡直接輸入相應路徑的exe就可以了,比如我本地的:
C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe
關閉的操作稍微麻煩一點。我們可以通過tasklist /svc來查看電腦上正在運行的進程。
然後我們發現網易雲打開了三個進程。
想要關閉網易雲要求我們將三個進程關掉,需要用到命令
taskkill /im cloudmusic.exe /f /t
下面直接放代碼了。比之前的QQbot多了打開/關閉操作。
import itchat, time
from itchat.content import *
from pykeyboard import PyKeyboard
import subprocessk = PyKeyboard()
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg): content = msg['Content'] print(content)
if content == '播放': k.press_keys([k.control_key, k.alt_key, 'p']) elif content == '暫停': k.press_keys([k.control_key, k.alt_key, 'p']) elif content == '上一首': k.press_keys([k.control_key, k.alt_key, k.left_key]) elif content == '下一首': k.press_keys([k.control_key, k.alt_key, k.right_key]) elif content == '打開音樂': subprocess.Popen(r'C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe')
elif content == '關閉音樂': subprocess.Popen(r'taskkill /im cloudmusic.exe /f /t')
itchat.auto_login(True)
itchat.run(True)
第三部分的視頻:
http://v.youku.com/v_show/id_XMjc1MTA2MzEwNA==
最後需要點出的幾個小問題:
0、公眾號代碼排版要用markdown排,總是出錯…可能會有縮進沒對齊的情況,希望不影響大家閱讀。總比貼圖片好一些。
1、測試時圖方便,並沒有加對消息來源的判斷,也就是說…只要任何一個人給我發 播放、暫停、打開、關閉、上一首、下一首這樣的內容,都可以控制我的網易雲…當然我相信你們不會那麼無聊的…自己用的時候加一步判斷就好了。
2、通過pyuserinput似乎是不能模擬一些系統級危險操作的組合鍵的(比如Crtl+Alt+Del),應該是安全限制。
3、之後會嘗試添加微信消息的語音識別功能。QQ的話不支持。
4、taskkill的關閉功能是強制殺進程,不是正常關閉操作。
5、希望對大家有所啟發,可以通過bot+Popen做更多對電腦的遠程控制操作。
最後,這篇文章提到的內容和詳細的教程視頻在我的優酷都可以找到,點擊閱讀原文去往我的優酷個人主頁。
如果有所幫助也希望大家不吝轉發到朋友圈。謝謝大家。有疑問可以在後臺留言交流。