如何将服务器上的python代码通过QQ发送回传信息(附实现方法)
作者:yihua_Leo 发布时间:2022-04-24 04:27:08
本文介绍我使用QQ得到服务器上回传的python代码的探索历程,面向的对象是对计算机网络有一定了解的读者。期待有兴趣的人和我一起探讨!
需求来源
最近,我在跑一些数据量巨大的代码。代码在本地一运行,CPU就占满了,代码运行时间又久,因此这段时间根本用不了电脑,这对疫情在家的大学生很难受。把代码放服务器吧,又不知道什么时候能跑完,这让我很不爽。于是,我希望服务器端的代码能给我一个不错的反馈,由此我选择了QQ交互方法。
硬件工具
本地电脑一台,服务器一台(如果你只是想尝试一下,而没有服务器,可以使用 VMware 虚拟机)
探索历程
首先,我使用的 * 面CentOS服务器上是没有办法运行QQ的,因此想要实现交互,应该先把服务器上的信息传送到本地电脑,再由本地电脑发送给QQ,这样我就可以收到消息了。
那么就将目标分割为两个任务了,分别为:
本地电脑给QQ发信息
服务器与本地电脑信息交互
接下来就给大家说明我是怎么实现这两步的:
本地电脑给QQ发信息
主要原理:通过 win32 API, 将python信息赋给剪切板,粘贴到QQ聊天框中,最后模拟按 “Enter” 键,发送消息1。
代码如下:
import win32gui
import win32con
import win32clipboard as w
class SendMsg:
"""
这是一个用于将信息发送到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()
# 发送消息
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有两种发送消息的模式,一种是"Enter",一种是"Ctrl+Enter"。这里要选择"Enter"模式。
服务器与本地电脑信息交互
我们已经完成了本地电脑给QQ发信息的操作,现在只需要完成服务器与本地电脑信息的交互,就可以让本地电脑根据服务器的指令发送QQ信息了。
如何让服务器和本地电脑通信呢?经过一些思考,我选择用Socket2。使用Socket的话,就要解决IP问题,因为本地电脑的IP不是公网IP,我们需要解决端口映射问题,将本地电脑的IP映射到公网!
考虑到不一定有路由器,我使用了一款软件路由侠,该软件在免费的状态下,一个月可以有一个G的流量进行端口映射,因为我们主要用于小段文字传输,这点流量已经足够。该软件也操作简单,我不过多介绍。
本地电脑开放的端口为8080端口,经过路由侠的端口映射后,端口变为yihuahuahua.e2.luyouxia.net:30985
因为我们只用做单向通信,所以服务器的IP不重要。
我们首先测试一下Socket功能,让服务器给本地电脑发一个"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通信时,要注意开放端口!!!
将功能综合
这里规定一个任务:计算1加1的值,并返回计算时间,将上述功能综合后,代码如下:
本地电脑端代码
from socket import *
import win32gui
import win32con
import win32clipboard as w
class SendMsg:
"""
这是一个用于将信息发送到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()
# 发送消息
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第一次通信有概率收不到消息,第二次就好了…希望有大佬在评论区指出我的不足。
这个版本只能实现单方面信息传送,如果想实现双向的,我思考的一个思路是通过 酷QAir的QQ机器人 加上 CQHTTP3 插件配合nonebot库4来实现。不过我的需求已经实现了,暂时懒得动手了,有缘再探索吧。
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 ↩︎
总结
来源:https://blog.csdn.net/qq_40577941/article/details/106065267


猜你喜欢
- Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Pyth
- 什么是特征金字塔很多文章里面写道特征金字塔这个结构,其实这个结构Very-Easy目标检测任务和语义分割任务里面常常需要检测小目标,但是小目
- 前言本来准备讲解nginx和apache的日志的,但是个人不太推荐apache(纯属个人爱好),这里就不介绍apache的日志了。作为一名程
- jQuery是一个非常优秀的JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效
- 阅读上一篇:定义网页的语言编码 用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计
- 首先了解下session的机制客户端(浏览器中) cookie 作为键值,匹配服务器端的一个数据。然后客户端每次在 HTTP 请求里面带着那
- 1. 引言之前已经有博客专门介绍了Python中的列表生成式,可能大家还不太擅长。这里推荐九个Python列表生成式的面试题(从简单到困难排
- 前言基于 Pythgo的 Django 框架,编程实现一个 WEB 程序,为用户提供 城市信息查询功能。用户可输入一个城市名,输出其所在省份
- 一、Python下载1.进入Python官网:https://www.python.org/2.选择windows版本(Download &
- 最近写了两个管理后台的前端页面,其中有一个管理后台,左侧菜单导航和右侧内容页是两个iframe,需求是,点击上面的主导航时,左侧iframe
- python数组和矩阵先创建一个一维数组直接定义一个数组:a = [1,2,3,4,5]b = ['a','c
- 本文实例讲述了php简单获取复选框值的方法。分享给大家供大家参考,具体如下:html:<form id="form1&quo
- python如何为创建大量实例节省内存,具体内容如下案例:某网络游戏中,定义了玩家类Player(id, name, status,....
- 从某种程度上说,判断一个网页设计师是否优秀,可以从其在WEB开发(或网页设计)中是否合理的采用各种图片格式得出结论。事实上,或许所有人都知道
- 为什么需要垃圾回收(GC)程序和人一样,生活时间长了会产生垃圾,程序在运行过程中也会产生垃圾,垃圾积攒过多后,会导致程序运行速度变慢。在Ja
- 本文实例为大家分享了JavaScript实现动态数字时钟的具体代码,供大家参考,具体内容如下实现效果代码实现<!DOCTYPE htm
- Django模板系统压根儿就没想过实现一个全功能的编程语言,所以它不允许我们在模板中执行Python的语句(还是那句话,要了解更多请参看理念
- 一、适合创建索引1、字段的数值有唯一性限制根据Alibaba规范,指明在业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。例如,
- 这篇文章主要介绍了python cv2在验证码识别中应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 1.event.srcElement //srcElement只能在IE下使用target是FireFox使用的,下面是兼容性写法 var