如何将服务器上的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
猜你喜欢
- 上节我们了解了图形验证码的识别,简单的图形验证码我们可以直接利用 Tesserocr 来识别,但是近几年又出现了一些新型验证码,如滑动验证码
- 事件的概念事件:指的是文档或者浏览器窗口中发生的一些特定交互瞬间。我们可以通过 * (或者处理程序)来预定事件,以便事件发生的时候执行相应的
- PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,
- 本文实例讲述了Python wxpython模块响应鼠标拖动事件操作。分享给大家供大家参考,具体如下:wxpython鼠标拖动事件小案例:#
- 前言Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作。1. 基本使
- 学在前面从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。本文的目标是
- 前言最近已经播完第一季的电视剧《雪中悍刀行》,从播放量就可以看出观众对于这部剧的期待,总播放量达到50亿,可让人遗憾的是,豆瓣评分只有5.7
- 1、Config命令Config命令主要用于修改SSI的默认设置。其中:Errmsg:设置默认错误信息。为了能够正常的返回用户设定的错误信息
- Float(浮动)概念也许是CSS中最让人迷惑的一个概念吧。Float经常被错误理解,而且因为将上下文元素全部浮动导致的可读性、
- 如下所示:import urllibimport urllib2 import osimport timeimport re import
- OL定义有序列表的时候,除非指定list-style-position:inside;,否则文字和前导符是有缩进的。但有的时候,OL定义的列
- 一个很普通的网页中显示LOGO图像,按照以往的页面制作经验,基本是在页面中插入图像即可(<img src="logo.gif
- 在讨论其返回值前,我们先来介绍以下calcHist()函数的用法:cv2.calcHist()函数cv2.calcHist()函数的作用通过
- 什么是图像平滑处理在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程我们称之为图像的平滑处理,所得到的图像称为平滑图像。那么什么
- 前言之前看到 RunCat 一只可以在电脑上奔跑猫,其主要的功能是监控电脑的CPU、内存的使用情况,使用越多跑的越快。所以准备做一只在任务栏
- 缓存(Cache)对于创建一个高性能的网站和提升用户体验来说是非常重要的,然而对我们这种只用得起拼多多的码农而言最重要的是学会如何使用缓存。
- Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到
- 小试牛刀:1.需要python如何读取文件2.需要python操作list3.需要使用split()对字符串进行分割代码运行截图 :代码(c
- 通过 CSS transform (firefox文档, safari文档)属性. 无所不能的css也开始玩起3D效果了。在配合 CSS t
- 本文实例讲述了python 协程 gevent原理与用法。分享给大家供大家参考,具体如下:geventgreenlet已经实现了协程,但是这