如何將服務器上的python代碼通過QQ發(fā)送回傳信息(附實現(xiàn)方法)
本文介紹我使用QQ得到服務器上回傳的python代碼的探索歷程,面向的對象是對計算機網絡有一定了解的讀者。期待有興趣的人和我一起探討!
需求來源
最近,我在跑一些數據量巨大的代碼。代碼在本地一運行,CPU就占滿了,代碼運行時間又久,因此這段時間根本用不了電腦,這對疫情在家的大學生很難受。把代碼放服務器吧,又不知道什么時候能跑完,這讓我很不爽。于是,我希望服務器端的代碼能給我一個不錯的反饋,由此我選擇了QQ交互方法。
硬件工具
本地電腦一臺,服務器一臺(如果你只是想嘗試一下,而沒有服務器,可以使用 VMware 虛擬機)
探索歷程
首先,我使用的無界面CentOS服務器上是沒有辦法運行QQ的,因此想要實現(xiàn)交互,應該先把服務器上的信息傳送到本地電腦,再由本地電腦發(fā)送給QQ,這樣我就可以收到消息了。
那么就將目標分割為兩個任務了,分別為:
- 本地電腦給QQ發(fā)信息
- 服務器與本地電腦信息交互
接下來就給大家說明我是怎么實現(xiàn)這兩步的:
本地電腦給QQ發(fā)信息
主要原理:通過 win32 API, 將python信息賦給剪切板,粘貼到QQ聊天框中,最后模擬按 “Enter” 鍵,發(fā)送消息1。
代碼如下:
import win32gui import win32con import win32clipboard as w class SendMsg: """ 這是一個用于將信息發(fā)送到QQ的類, 使用方法為 : SendMsg("收信人QQ昵稱", "信息").sendmsg() 注意一點,收信人的QQ聊天窗口要在屏幕上,不能最小化或被掩蓋。 """ def __init__(self, receiver, msg): self.receiver = receiver self.msg = msg self.set_text() # 設置剪貼版內容 def set_text(self): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT, self.msg) w.CloseClipboard() # 發(fā)送消息 def sendmsg(self): qq = win32gui.FindWindow(None, self.receiver) win32gui.SendMessage(qq, win32con.WM_PASTE, 0, 0) win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) if __name__ == '__main__': SendMsg("一花一世界", "Hello, world").sendmsg()
效果如圖所示:
注意:
1、python 關于 win32 的包,下載方式為:
pip install pypiwin32
2、QQ有兩種發(fā)送消息的模式,一種是"Enter",一種是"Ctrl+Enter"。這里要選擇"Enter"模式。
服務器與本地電腦信息交互
我們已經完成了本地電腦給QQ發(fā)信息的操作,現(xiàn)在只需要完成服務器與本地電腦信息的交互,就可以讓本地電腦根據服務器的指令發(fā)送QQ信息了。
如何讓服務器和本地電腦通信呢?經過一些思考,我選擇用Socket2。使用Socket的話,就要解決IP問題,因為本地電腦的IP不是公網IP,我們需要解決端口映射問題,將本地電腦的IP映射到公網!
考慮到不一定有路由器,我使用了一款軟件路由俠,該軟件在免費的狀態(tài)下,一個月可以有一個G的流量進行端口映射,因為我們主要用于小段文字傳輸,這點流量已經足夠。該軟件也操作簡單,我不過多介紹。
本地電腦開放的端口為8080端口,經過路由俠的端口映射后,端口變?yōu)閥ihuahuahua.e2.luyouxia.net:30985
因為我們只用做單向通信,所以服務器的IP不重要。
我們首先測試一下Socket功能,讓服務器給本地電腦發(fā)一個"Hello world"
代碼如下:
本地電腦端代碼
from socket import * HOST = '' PORT = 8080 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while True: print('waiting for connection...') tcpCliSock, addr = tcpSerSock.accept() print('...connnecting from:', addr) while True: data = tcpCliSock.recv(BUFSIZ) if not data: break print(data.decode('utf-8')) tcpCliSock.close() tcpSerSock.close()
服務器端代碼
from socket import * HOST = 'yihuahuahua.e2.luyouxia.net' PORT = 30985 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) output_str = "Hello world!" tcpCliSock.send(output_str.encode()) tcpCliSock.close()
注意:在進行Socket通信時,要注意開放端口?。?!
將功能綜合
這里規(guī)定一個任務:計算1加1的值,并返回計算時間,將上述功能綜合后,代碼如下:
本地電腦端代碼
from socket import * import win32gui import win32con import win32clipboard as w class SendMsg: """ 這是一個用于將信息發(fā)送到QQ的類, 使用方法為 : SendMsg("收信人QQ昵稱", "信息").sendmsg() 注意一點,收信人的QQ聊天窗口要在屏幕上,不能最小化或被掩蓋。 """ def __init__(self, receiver, msg): self.receiver = receiver self.msg = msg self.set_text() # 設置剪貼版內容 def set_text(self): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT, self.msg) w.CloseClipboard() # 發(fā)送消息 def sendmsg(self): qq = win32gui.FindWindow(None, self.receiver) win32gui.SendMessage(qq, win32con.WM_PASTE, 0, 0) win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) if __name__ == '__main__': HOST = '' PORT = 8080 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while True: tcpCliSock, addr = tcpSerSock.accept() while True: data = tcpCliSock.recv(BUFSIZ) if not data: break output_str = data.decode('utf-8') SendMsg("一花一世界", output_str).sendmsg() tcpCliSock.close() tcpSerSock.close()
服務器端代碼
from socket import * import time HOST = 'yihuahuahua.e2.luyouxia.net' PORT = 30985 BUFSIZ =1024 ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM) tcpCliSock.connect(ADDR) start = time.time() count = 1 + 1 end = time.time() output_str = "結果為" + str(count) + " 消耗時間" + str(int(end - start)) + "秒" tcpCliSock.send(output_str.encode()) tcpCliSock.close()
運行結果:
美滋滋。
改進方向與探索
目前已知的缺陷有:Socket第一次通信有概率收不到消息,第二次就好了…希望有大佬在評論區(qū)指出我的不足。
這個版本只能實現(xiàn)單方面信息傳送,如果想實現(xiàn)雙向的,我思考的一個思路是通過 酷QAir的QQ機器人 加上 CQHTTP3 插件配合nonebot庫4來實現(xiàn)。不過我的需求已經實現(xiàn)了,暫時懶得動手了,有緣再探索吧。
https://www.cnblogs.com/hwj2019/p/11552055.html ↩︎
https://blog.csdn.net/su_bao/article/details/80380465 ↩︎
https://github.com/richardchien/coolq-http-api ↩︎
https://nonebot.cqp.moe/guide/getting-started.html ↩︎
總結
到此這篇關于我將服務器上的python代碼通過QQ發(fā)送回傳信息(附實現(xiàn)方法)的文章就介紹到這了,更多相關python qq發(fā)送回傳信息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!