因为在QQ群里中发消息实在是太慢了 所以我定得用python制作一个能够快速发送消息的脚本具体内容如下:
先上总代码:
import sys
import tkinter as tk
import pyautogui
import time
import threading
import keyboard as keys
import os
from pynput import keyboard
# import ttkbootstrap as ttk
from playsound import playsound
import random
auto_times = 1 # 自动脚本执行次数
auto_rest = 0.1 # 自动脚本每次点击间隔时间
Copy_times = 1 # 复制消息发送次数
Click_times = 1 # 连点器点击次数
Click_rest = 0.1 # 连点器每次点击间隔时间
random_list = [1, 2, 3] # 随机数字列表
def play_prompt_sound(file_path):
MyThread(playsound, file_path)
def get_current_time_string():
global current_time_string # 声明要在函数内部使用全局变量
while True:
current_time = time.localtime() # 获取当前时间的时间结构
current_time_string = "[" + time.strftime("%H:%M:%S",
current_time) + "]" # 格式化时间为字符串
time.sleep(1) # 等待1秒
def Send_Copy():
global current_time_string
play_prompt_sound("C:\\Windows\\Media\\Windows Notify Messaging.wav")
time.sleep(3)
pyautogui.PAUSE = 0.015 # 每次点击的间隔时间 若QQ崩溃则调大该数值即可 该数值与发送速度成反比
while True:
if keys.is_pressed("F10"): # 按下F10结束发送
print(current_time_string + '已结束QQ消息发送')
break
pyautogui.click(125, 977) # 点击第一处位置
pyautogui.hotkey('ctrl', 'v') # 粘贴
randfigure = random.choice(random_list) # 随机字符输入
if randfigure == 1:
pyautogui.press('.')
if randfigure == 2:
pyautogui.press('。')
if randfigure == 3:
pyautogui.press(',')
pyautogui.click(1644, 1025) # 点击第二处位置
def Click(): # 连点器函数
global Click_rest, Click_times
Click_times = int(entry_Click_times.get())
Click_rest = float(entry_Click_rest.get()) # 刷新次数和间隔
pyautogui.PAUSE = 0.015
def on_press(key):
if key == keyboard.Key.f9: # 按下f9开始连点器
for i in range(Click_times):
pyautogui.click()
time.sleep(Click_rest)
with keyboard.Listener(
on_press=on_press) as listener:
listener.join()
def Auto_Edit():
play_prompt_sound("C:\\Windows\\Media\\Windows Notify Messaging.wav")
global figure
figure = 0
try:
os.remove('1.xml')
print(current_time_string + '删除上次配置')
except:
print(current_time_string + '创建配置')
print(current_time_string + '开始记录脚本位置')
spam = []
def on_press(key):
if key == keyboard.Key.home: # 按下home键开始记录点击位置
global figure
figure = figure + 1
a1 = pyautogui.position()
a2 = [a1.x, a1.y]
spam.append(a2)
print(current_time_string + f'第{figure}处位置设置成功')
play_prompt_sound("C:\\Windows\\Media\\Windows Notify Email.wav")
def on_release(key):
if key == keyboard.Key.end: # 按下end键结束记录
if not spam:
print(current_time_string + '本次未记录点击位置')
pyautogui.confirm('未记录点击位置')
sys.exit()
so = open('1.xml', 'w')
for c in range(0, len(spam)):
so.write(f'{spam[c]}\n')
so.close()
print(current_time_string + '结束设置')
play_prompt_sound("C:\\Windows\\Media\\Windows Message Nudge.wav")
sys.exit()
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join() # 热键监听
def Auto_Click():
play_prompt_sound("C:\\Windows\\Media\\Windows Notify Messaging.wav")
global current_time_string, auto_rest
shu = os.path.exists('1.xml')
spam1 = []
auto_rest = float(entry_Auto_rest.get())
auto_times = int(entry_Auto_times.get())
if not shu:
print(current_time_string + '未找到数据') # 未找到xml文件 暂停函数
pyautogui.confirm('未找到数据')
sys.exit()
with open("1.xml") as lines:
for line in lines:
spam1.append(eval(line))
if not spam1:
print(current_time_string + '未找到数据') # xml中无数据 暂停函数
pyautogui.confirm('未找到数据')
sys.exit()
time.sleep(2)
pyautogui.PAUSE = 0.005
i1 = 0
for x in range(auto_times): # 脚本次数
for i in range(0, len(spam1)): # 获取ldq列表的长度 决定点击次数
i1 = i1 + 1
pyautogui.click(spam1[i]) # 依次点击
time.sleep(auto_rest)
print(current_time_string + f'第{i + 1}处位置点击成功') # 点击状态提示
class MyThread(threading.Thread): # 多线程封装 没有这部分tkinter会无法响应
def __init__(self, func, *args):
super().__init__()
self.func = func
self.args = args
self.setDaemon(True)
self.start() # 在这里开始
def run(self):
self.func(*self.args)
thread = threading.Thread(target=get_current_time_string)
thread.daemon = True
thread.start()
win = tk.Tk() # 利用ttk库创建tk窗口
# win = ttk.Window() # 利用ttk库创建tk窗口
# style = ttk.Style('litera') # 窗口风格为litera
win.title('连点器') # 窗口标题
win.geometry('400x200') # 窗口大小(500x300)
win.resizable(False, False) # 窗口大小不可改变
# win.wm_attributes("-topmost", 1) # 窗口置顶
Button_Copy = tk.Button(win, text='发送(复制内容)', command=lambda: MyThread(Send_Copy), width=22)
Button_Copy.pack() # 绘制按钮 下同
Button_Copy.place(x=0, y=130) # 用place布局 下同
Q_Label = tk.Label(win, text='QQ消息:', width=22)
Q_Label.pack()
Q_Label.place(x=0, y=110)
Button_Click = tk.Button(win, text='连点器', command=lambda: MyThread(Click), width=22)
Button_Click.pack()
Button_Click.place(x=200, y=60)
Label_Click_times = tk.Label(win, text='连点器执行次数:')
Label_Click_times.pack()
Label_Click_times.place(x=200, y=0)
Label_Click_rest = tk.Label(win, text='每次点击间隔时间:')
Label_Click_rest.pack()
Label_Click_rest.place(x=200, y=30)
entry_Click_times = tk.Entry(win, width=5) # 连点器点击次数
entry_Click_times.pack()
entry_Click_times.place(x=320, y=0)
entry_Click_times.insert(0, str(Click_times))
entry_Click_rest = tk.Entry(win, width=5) # 连点器每次点击时间
entry_Click_rest.pack()
entry_Click_rest.place(x=320, y=30)
entry_Click_rest.insert(0, str(Click_rest))
Label_Auto_times = tk.Label(win, text='自动脚本执行次数:')
Label_Auto_times.pack()
Label_Auto_times.place(x=0, y=0)
Label_Auto_rest = tk.Label(win, text='每次点击间隔时间:')
Label_Auto_rest.pack()
Label_Auto_rest.place(x=0, y=30)
# 创建一个Entry部件用于输入文本
entry_Auto_times = tk.Entry(win, width=5) # 自动脚本执行次数
entry_Auto_times.pack()
entry_Auto_times.place(x=120, y=0)
entry_Auto_times.insert(0, str(auto_times))
entry_Auto_rest = tk.Entry(win, width=5) # 自动脚本每次点击时间
entry_Auto_rest.pack()
entry_Auto_rest.place(x=120, y=30)
entry_Auto_rest.insert(0, str(auto_rest))
Auto_Record = tk.Button(win, text='记录自动脚本', command=lambda: MyThread(Auto_Edit))
Auto_Record.pack()
Auto_Record.place(x=0, y=60)
Auto_Run = tk.Button(win, text='执行自动脚本', command=lambda: MyThread(Auto_Click))
Auto_Run.pack()
Auto_Run.place(x=80, y=60)
print(current_time_string + '窗口创建成功')
win.mainloop()
运行效果图:
因为我的显示器是1920x1080的 所以我的点击位置为上图所示 大家可以在python控制台中输入pyautogui.mouseInfo()来查看鼠标位置
在QQ群中快速发消息的原理:点击消息框>粘贴内容>点击发送按钮 这样就完成了发消息 这样就实现了快速发消息 可以算是脚本或是宏之类的
自动脚本的记录就是当按下一次按键时 向文件中写入做坐标数据 当下次执行自动脚本时 从文件中读取坐标数据来进行点击
[23, 917]
[54, 695]
1.xml文件中的坐标数据
这一部分是用来创建窗口的:
win = tk.Tk() # 利用ttk库创建tk窗口
# win = ttk.Window() # 利用ttk库创建tk窗口
# style = ttk.Style('litera') # 窗口风格为litera
win.title('连点器') # 窗口标题
win.geometry('400x200') # 窗口大小(500x300)
win.resizable(False, False) # 窗口大小不可改变
# win.wm_attributes("-topmost", 1) # 窗口置顶
Button_Copy = tk.Button(win, text='发送(复制内容)', command=lambda: MyThread(Send_Copy), width=22)
Button_Copy.pack() # 绘制按钮 下同
Button_Copy.place(x=0, y=130) # 用place布局 下同
Q_Label = tk.Label(win, text='QQ消息:', width=22)
Q_Label.pack()
Q_Label.place(x=0, y=110)
Button_Click = tk.Button(win, text='连点器', command=lambda: MyThread(Click), width=22)
Button_Click.pack()
Button_Click.place(x=200, y=60)
Label_Click_times = tk.Label(win, text='连点器执行次数:')
Label_Click_times.pack()
Label_Click_times.place(x=200, y=0)
Label_Click_rest = tk.Label(win, text='每次点击间隔时间:')
Label_Click_rest.pack()
Label_Click_rest.place(x=200, y=30)
entry_Click_times = tk.Entry(win, width=5) # 连点器点击次数
entry_Click_times.pack()
entry_Click_times.place(x=320, y=0)
entry_Click_times.insert(0, str(Click_times))
entry_Click_rest = tk.Entry(win, width=5) # 连点器每次点击时间
entry_Click_rest.pack()
entry_Click_rest.place(x=320, y=30)
entry_Click_rest.insert(0, str(Click_rest))
Label_Auto_times = tk.Label(win, text='自动脚本执行次数:')
Label_Auto_times.pack()
Label_Auto_times.place(x=0, y=0)
Label_Auto_rest = tk.Label(win, text='每次点击间隔时间:')
Label_Auto_rest.pack()
Label_Auto_rest.place(x=0, y=30)
# 创建一个Entry部件用于输入文本
entry_Auto_times = tk.Entry(win, width=5) # 自动脚本执行次数
entry_Auto_times.pack()
entry_Auto_times.place(x=120, y=0)
entry_Auto_times.insert(0, str(auto_times))
entry_Auto_rest = tk.Entry(win, width=5) # 自动脚本每次点击时间
entry_Auto_rest.pack()
entry_Auto_rest.place(x=120, y=30)
entry_Auto_rest.insert(0, str(auto_rest))
Auto_Record = tk.Button(win, text='记录自动脚本', command=lambda: MyThread(Auto_Edit))
Auto_Record.pack()
Auto_Record.place(x=0, y=60)
Auto_Run = tk.Button(win, text='执行自动脚本', command=lambda: MyThread(Auto_Click))
Auto_Run.pack()
Auto_Run.place(x=80, y=60)
print(current_time_string + '窗口创建成功')
win.mainloop()