QQ批量挂机(python实现)

效果图:

主要使用了pyautogui和pyperclip两个第三方库实现,如多使用了图像匹配功能会使pyautogui引入了Pillow等库,如果代码涉及到了关键参数还需要OpenCV库等等。

特意写了很多注释,供学习使用。

完整代码:

import os
import threading
import time
from tkinter import Tk, StringVar, Entry, Label, Button, DISABLED

import pyautogui
import pyperclip


def read(file):
    f = open(file, 'r')
    str_list = f.read().split('\n')
    return str_list


def input_pw(password):  # 输入密码
    pyautogui.keyDown('backspace')
    time.sleep(2)
    pyautogui.keyUp('backspace')
    pyautogui.write(password, interval=0.1)


def login(qq_msg, qq_path):
    # 获取登录qq账号密码
    qq_msg = qq_msg.split('#')
    qq = qq_msg[0]
    password = qq_msg[1]
    # 打开QQ
    os.startfile(qq_path)
    time.sleep(8)
    # 获取运行时的屏幕分辨率(因为我的指定坐标是基于1920*1080的,要适应不同分辨率变化)
    width, height = pyautogui.size().width, pyautogui.size().height
    # 输入账号
    pyautogui.click(int(1060*width/1920), int(560*height/1080))   # 点击账号输入框
    pyperclip.copy(qq)
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(0.5)
    # 输入密码
    pyautogui.click(int(1060*width/1920), int(610*height/1080))  # 点击密码输入框
    input_pw(password)
    time.sleep(0.5)
    pyautogui.press('enter')


class QqOnHook:
    def __init__(self):
        """初始化一个界面"""
        self.window = Tk()
        self.window.title('QQ挂机')
        window_width, window_height = 500, 250
        screenwidth, screenheight = pyautogui.size().width, pyautogui.size().height
        # 设置窗口居中显示
        self.window.geometry("%dx%d+%d+%d" % (       # 前两个参数是窗口的大小,后面两个参数是窗口的位置
            window_width, window_height, (screenwidth - window_width) / 2, (screenheight - window_height) / 2))
        self.window.resizable(False, False)  # 规定窗口不可缩放
        self.day_num = 0
        self.txt1 = StringVar()
        self.statr_time = StringVar()
        onhook_time = StringVar()
        onhook_time.set("125")
        entry1 = Entry(self.window, width=30, textvariable=self.txt1,
                       state="readonly", font=('宋体', 20), fg='blue', justify='center')
        entry2 = Entry(self.window, width=34, textvariable=self.statr_time,
                       state="readonly", font=('宋体', 18))
        label1 = Label(self.window, text="每日启动时间: ", font=('宋体', 15))
        label2 = Label(self.window, text="时", font=('宋体', 15))
        label3 = Label(self.window, text="分", font=('宋体', 15))
        self.entry3 = Entry(self.window, width=4, font=('宋体', 20))
        self.entry4 = Entry(self.window, width=4, font=('宋体', 20))
        label4 = Label(self.window, text="单Q挂机时长: ", font=('宋体', 15))
        self.entry5 = Entry(self.window, width=4, textvariable=onhook_time, font=('宋体', 20))
        label5 = Label(self.window, text="分", font=('宋体', 15))
        self.button = Button(self.window, width=9, height=2, text='开始', font=('黑体', 20), command=self.run)
        # 设置界面布局
        entry1.grid(row=0, column=0, columnspan=6)
        entry2.grid(row=1, column=0, columnspan=6)
        label1.grid(row=3, column=0, columnspan=2)
        self.entry3.grid(row=3, column=2)
        label2.grid(row=3, column=3)
        self.entry4.grid(row=3, column=4)
        label3.grid(row=3, column=5)
        label4.grid(row=4, column=0, columnspan=2)
        self.entry5.grid(row=4, column=2)
        label5.grid(row=4, column=3)
        self.button.grid(row=5, column=2, rowspan=2, columnspan=2)
        self.window.mainloop()

    def run(self):  # 启动一个线程执行挂机任务
        hour = self.entry3.get()  # 获取每日启动时间
        minute = self.entry4.get()
        run_time = self.entry5.get()  # 获取单Q挂机时间
        if hour.isdigit() and 0 <= int(hour) <= 24 and minute.isdigit() and 0 <= int(minute) < 60 \
                and run_time.isdigit() and int(run_time) > 0:  # 输入检测
            self.readonly_state()
            t = threading.Thread(target=self.count_down, args=(int(hour), int(minute), int(run_time),))
            t.setDaemon(True)  # 守护线程,退出界面后回收线程
            t.start()

    def count_down(self, hour, minute, run_time):  # 定时函数
        still_time = 0
        while True:
            t = time.localtime()
            last_hour = hour - 1    # 指定小时的上一个小时
            if hour == 0:   # 排除特殊的小时
                last_hour = 23
            if t.tm_hour == last_hour or (t.tm_hour == hour and t.tm_min < minute):  # 逼近 指定小时
                # 计算离 指定时间 还有多久
                if t.tm_hour == last_hour:
                    still_time = (59 - t.tm_min) * 60 + (59 - t.tm_sec) + minute * 60
                elif t.tm_hour == hour:
                    still_time = (minute - 1 - t.tm_min) * 60 + (59 - t.tm_sec)
                time.sleep(still_time)
                self.start(run_time)
            else:
                time.sleep(3000)  # 每50分钟判断一次当前小时

    def start(self, n):  # 启动QQ并定时关闭
        self.window.after(0, self.update)
        content = read('登录qq.txt')
        qq_path = content[0]    # 获取qq路径
        login_qq_list = content[1:]     # 获取登录qq
        for login_qq in login_qq_list:
            if login_qq:    # 避免空值
                login(login_qq, qq_path)
                time.sleep(n * 60)  # 单Q运行时间
                os.system("taskkill /F /IM QQ.exe")  # 关闭QQ
                time.sleep(5)

    def update(self):  # 记录挂机行为
        self.day_num += 1
        self.txt1.set("已挂机 " + str(self.day_num) + " 天")
        self.statr_time.set("上次启动时间:" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))

    def readonly_state(self):
        self.txt1.set("关闭软件可取消")
        self.button["text"] = "挂机中"
        self.button['state'] = DISABLED
        self.entry3.configure(state="readonly")
        self.entry4.configure(state="readonly")
        self.entry5.configure(state="readonly")


if __name__ == '__main__':
    QqOnHook()

然后在同一目录下创建一个登录qq.txt文件,并在首行填写QQ路径,后面的行填写账号密码,账号密码以“#”号分隔,登录qq.txt文件格式如下:

最后附上打包好的exe文件,下载即可直接使用【求赞!】

QQ挂机exe文件下载

放在服务器持久运行需要保持鼠标、键盘、剪切板正常运行,所以要配合我写的另一个软件使用:

关闭远程桌面连接后,鼠标、键盘、剪切板等失效解决方法

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要用 Python 实现 QQ器人,你需要先了解 QQ 器人的工作原理。QQ 器人需要连接 QQ 协议服务器,接收和发送消息,然后根据消息内容做出相应的响应。 一些 Python 库可以帮助你实现这个功能,比如 SmartQQQQBot。这里我们以 QQBot 为例,简单介绍一下如何用 Python 实现 QQ器人。 首先,你需要在 QQ 中注册一个器人账号,并开通器人权限。然后,你需要安装 QQBot 库,可以使用 pip 工具进行安装: ``` pip install qqbot ``` 安装完成后,你需要创建一个 QQBot 实例,并添加一些处理函数,用来处理接收到的消息。比如,如果接收到一条消息,你可以解析这条消息,并根据消息内容做出相应的回复。 下面是一个简单的示例代码: ```python from qqbot import QQBotSlot as qqbotslot, RunBot # 处理群消息的函数 @qqbotslot def onQQMessage(bot, contact, member, content): if content == 'hello': # 回复消息 bot.SendTo(contact, 'world') elif content == 'hi': # 回复消息,并@发消息的人 bot.SendTo(contact, '@' + member.name + ' hello') # 创建 QQBot 实例并运行 if __name__ == '__main__': RunBot() ``` 这个示例代码中,我们定义了一个 `onQQMessage` 函数,用来处理群消息。当接收到一条消息时,如果消息内容是 `'hello'`,则回复 `'world'`;如果消息内容是 `'hi'`,则回复 `'@发消息的人 hello'`。 你可以根据自己的需要,添加更多的处理函数,来实现更丰富的功能。当你完成代码编写后,可以运行这个 Python 文件,QQBot 就会连接到 QQ 协议服务器,并等待接收消息。当有消息到来时,QQBot 会调用相应的处理函数进行处理,并根据处理函数的返回值发送消息。 当然,要实现一个完整的 QQ器人还需要考虑很多问题,比如如何处理群成员变化、如何处理非法消息等等。这里只是提供了一个基本的实现思路,供你参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢铁の洪流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值