基于tkinter+win32+pynput实现python的QQ微信刷屏(比某些文章稍微高级一点)

原理和大多数一样,利用剪切板复制粘贴发送消息

效果展示:

 

当打开了某个会话窗口,这里利用win32的功能,将所有可识别的窗口展示出来,单选即可。

不需要再次手动打开聊天框,更加人性化(想要完全不打开聊天框意味着我起码要能够读取到qq列表,控制qq后台运行,那难度似乎有些高)

 

 选定对象后出现这样的窗口,可以反复利用

包括有三个按钮,选取txt文档以发送不完全相同但有规律的刷屏

代码如下:

(新手分享,勿喷)

# 获取窗口
import win32gui
import win32con
import tkinter as tk
import ttkbootstrap
from pynput.keyboard import Key, Controller
from tkinter import filedialog

ffont = "华文琥珀"            # 字体
copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None


def get_hwnd_dic(hwnd, hwnd_title):
    if (win32gui.IsWindow(hwnd)
            and win32gui.IsWindowEnabled(hwnd)
            and win32gui.IsWindowVisible(hwnd)
            and win32gui.GetWindowText(hwnd)):
        hwnd_title[f"{hwnd}"] = win32gui.GetWindowText(hwnd)


def get_hwnd():
    hwnd_title = {}
    win32gui.EnumWindows(get_hwnd_dic, hwnd_title)
    return hwnd_title


hwndJson = get_hwnd()                          # 引用上面两个函数,获取当前窗口
numbers = list(hwndJson.keys())                # 所有窗口的句柄
titles = list(hwndJson.values())               # 所有窗口名称
lens = len(titles)

window_of_set = tk.Tk()
window_of_set.geometry('420x{}+10+10'.format(100+lens*30))
window_of_set.resizable(False, False)
window_of_set.title("cqu.rol")
try:
    window_of_set.iconbitmap("resources/001.ico")         # 个人习惯,更改图标,无则跳过
except:
    pass

tagsp = ttkbootstrap.Label(window_of_set, text="选择一个人进行刷屏", font=(ffont, 15))
tagsp.pack(pady=5)
variable_value = tk.StringVar()

for w in range(lens):
    bbb = ttkbootstrap.Radiobutton(window_of_set, text=titles[w], variable=variable_value, value=numbers[w])
    bbb.place(x=70, y=25 * w + 40)
kb = Controller()                                   # 单选按钮


def nexta():                                        # 当点击按钮以后:
    window_of_sp = tk.Toplevel(window_of_set)
    window_of_sp.geometry('330x180+10+10')
    window_of_sp.resizable(False, False)
    window_of_sp.title(" ")
    window_of_sp.attributes("-topmost", 1)
    ttkbootstrap.Label(window_of_sp, text="输入重复次数及内容", font=(ffont, 15)).pack(pady=10)
    try:
        window_of_set.iconbitmap("resources/001.ico")
    except:
        pass
    choose_number = variable_value.get()             # 获取选的是哪一个窗口(的句柄)
    e1 = tk.Entry(window_of_sp, width=40, font=(ffont, 10))
    e1.pack()                                        # 输入框1,获取重复次数
    e2 = tk.Entry(window_of_sp, width=40, font=(ffont, 10))
    e2.pack(pady=10)                                  # 输入框2,获取内容

    variable_val = tk.StringVar()
    e3 = ttkbootstrap.Checkbutton(window_of_sp, text="重复次数显示", variable=variable_val, onvalue="OK", offvalue="NOT")
    e3.pack()                                         # 单选框,获取是的显示已经重复的次数

    # 开始刷屏
    def start_copy():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_ed_times += 1
        final_s = "Error"
        if copy_count == "OK":
            final_s = "第{}次:{}".format(copy_ed_times, copy_content)
        elif copy_count == "NOT":
            final_s = str(copy_content)                  # 这两句获取【重复次数】按钮的结果,并将重复内容写上去,即获得最后说的话

        if copy_ed_times == copy_times:
            window_of_sp.after_cancel(copy_suit)
            copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
            # 当计数达到次数时停止循环,所有全局变量归零
        else:
            kb.type(final_s)
            kb.press(Key.enter)    # 这里按下回车键,如果qq是回车加enter发送消息,随之替换即可
            copy_suit = window_of_sp.after(200, start_copy)
            # 否则循环,每200毫秒重复一次(网络延迟,不要太快)

    # 点击开始
    def start_fun():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_times = int(e1.get()) + 1
        copy_content = e2.get()
        copy_ed_times = 0          # 已经重复次数归零
        if variable_val.get():
            copy_count = variable_val.get()
        else:
            copy_count = "NOT"
            # 【重复次数】按钮调整
        win32gui.ShowWindow(choose_number, win32con.SW_SHOWNORMAL)
        win32gui.SetWindowPos(choose_number, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOOWNERZORDER | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        # 将对话窗口置顶
        start_copy()  # 运行

    # 停止刷屏
    def stop_copy():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times
        copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
        window_of_sp.destroy()

    # 点击文本
    def start_txtt():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        copy_ed_times += 1
        if copy_ed_times == copy_times:
            window_of_sp.after_cancel(copy_suit)
            copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content = None, None, None, None, None, None
        else:
            xxw = copy_ed_times-1
            kb.type(f_content[xxw])
            kb.press(Key.enter)
            copy_suit = window_of_sp.after(200, start_txtt)

    def start_txt():
        global copy_times, copy_content, copy_suit, copy_count, copy_ed_times, f_content
        for_path = filedialog.askopenfilename(title="待处理 请选择", filetypes=[("", ".txt")], defaultextension=[("", ".txt")])
        f_content = open(for_path, "r", encoding="utf-8").readlines()
        win32gui.ShowWindow(choose_number, win32con.SW_SHOWNORMAL)
        win32gui.SetWindowPos(choose_number, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOOWNERZORDER | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        copy_times = len(f_content) +1
        copy_ed_times = 0
        start_txtt()

    buop1 = tk.Button(window_of_sp, text="点击开始", command=start_fun, font=(ffont, 10))
    buop1.place(x=40, y=140)
    buop2 = tk.Button(window_of_sp, text="选取文档", command=start_txt, font=(ffont, 10))
    buop2.place(x=240, y=140)
    buop4 = tk.Button(window_of_sp, text="点击退出", command=stop_copy, font=(ffont, 10))
    buop4.place(x=140, y=140)
    

buop3 = tk.Button(window_of_set, text="点击进入刷屏", command=nexta, font=(ffont, 15))
buop3.place(x=150, y=lens * 30)

window_of_set.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值