Python自动化脚本实现QQ大乐斗游戏任务自动完成

引言

Q宠大乐斗是一款经典的社交网络游戏,深受广大玩家喜爱。但是随着游戏的深入,每日需要完成的任务越来越多,占用了玩家大量的时间。本文介绍了一个基于Python和Selenium的自动化脚本,可以帮助玩家自动完成大乐斗中的日常任务,极大地节省时间。

脚本概述

这个脚本使用Python编写,主要基于以下几个库:

  • Selenium:用于自动化控制浏览器
  • tkinter:用于创建图形用户界面
  • threading:实现多线程执行任务

脚本的主要功能包括:

  • 自动领取每日奖励
  • 自动乐斗好友和BOSS
  • 自动完成日常任务如历练、竞技场等
  • 自动参与活动如武林大会、飞升大作战等
  • 图形界面操作,方便用户选择要执行的任务

 

 

脚本结构

脚本主要分为三个部分:

(1) QQFightAutomation类:实现各项自动化任务的核心逻辑

(2) Application类:创建图形用户界面

(3) TextRedirector类:重定向输出到GUI文本框

下面分别介绍这几个部分的实现。

QQFightAutomation类详解

这个类是整个脚本的核心,实现了所有的自动化任务。主要方法包括:

class QQFightAutomation:
    def __init__(self, status_text):
        # 初始化Selenium WebDriver
        
    def update_status(self, message):
        # 更新GUI状态信息
        
    def start(self):
        # 启动浏览器并打开游戏页面
        
    def EverydayAward(self):
        # 领取每日奖励
        
    def faction(self):
        # 查看帮派
        
    def ledouhaoyou(self):
        # 自动乐斗好友
        
    def boss(self):
        # 自动乐斗BOSS
        
    # ... 其他任务方法

每个方法都对应游戏中的一项任务,通过Selenium控制浏览器自动点击和操作页面元素来完成任务。例如,EverydayAward方法的实现:

def EverydayAward(self):
    self.update_status("开始执行每日奖励领取...")
    self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=login")
    self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=meridian")
    self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=daren")
    self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=wuzitianshu")
    self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&B_UID=0&sid=&channel=0&g_ut=1&cmd=exp")
    self.update_status("每日奖励领取完成")

这个方法通过直接访问相应的URL来领取各种每日奖励。

Application类详解

Application类负责创建图形用户界面,主要包括以下部分:

  • 状态显示区域:显示当前执行的任务状态
  • 任务按钮区域:包含各种任务按钮,点击即可执行相应任务
  • 说明文字区域:显示脚本的使用说明
  • 日志显示区域:显示详细的执行日志
class Application(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("QQFightAutomation")
        self.geometry("1200x800")
        
        # 创建各个区域的frame
        
        self.create_buttons(top_frame)
        self.add_instructions()
        
        # 重定向stdout到日志区域
        sys.stdout = TextRedirector(self.log_text)
        
    def create_buttons(self, parent):
        # 创建任务按钮
        
    def execute_all_tasks(self):
        # 执行所有任务的方法
        
    def add_instructions(self):
        # 添加使用说明

 

使用方法

使用这个脚本非常简单:

(1) 运行脚本,会自动打开浏览器并导航到大乐斗页面

(2) 在浏览器中手动登录QQ账号

(3) 登录成功后,可以在GUI界面上点击各个任务按钮来执行相应的任务

(4) 也可以点击"执行所有任务"按钮,自动按顺序执行所有定义的任务

(5) 任务执行过程和结果会实时显示在状态框和日志区域

注意事项

  • 确保已安装Edge或Chrome浏览器
  • 使用脚本时请遵守游戏规则,避免过于频繁的操作
  • 建议在网络稳定的环境下使用
  • 部分功能可能不适用于低等级玩家
  • 如遇问题,可以尝试重启程序或检查网络连接改进方向

虽然这个脚本已经能够实现大部分日常任务的自动化,但仍有一些可以改进的地方:

(1) 错误处理:增加更多的异常处理,提高脚本的稳定性

(2) 配置文件:将一些参数(如等待时间、URL等)放到配置文件中,方便调整

(3) 日志记录:将日志保存到文件,便于后期分析

(4) 智能判断:根据页面内容智能判断当前状态,增加脚本的灵活性

(5) 定时任务:增加定时执行功能,可以设置在指定时间自动运行

(6) 多账号支持:支持同时操作多个账号

安全性考虑

使用自动化脚本时需要注意以下安全问题:

(1) 账号安全:脚本中不要硬编码账号密码,避免泄露

(2) 游戏规则:确保脚本的行为不违反游戏规则,避免账号被封禁

(3) 网络安全:使用HTTPS协议,保护数据传输安全

(4) 个人隐私:不要在公共场合运行脚本,避免个人信息泄露

结语

这个Python自动化脚本为QQ大乐斗玩家提供了一个便捷的工具,可以大大减少日常任务所需的时间。它不仅展示了Python在游戏自动化方面的应用,也为其他类似游戏的自动化提供了思路。

然而,使用自动化脚本时也要注意遵守游戏规则,保护账号安全。同时,这个脚本还有很大的改进空间,欢迎感兴趣的读者在此基础上进行优化和扩展。

最后,编写这样的自动化脚本不仅能够提高游戏体验,还能锻炼编程技能,是一个非常有趣且有价值的项目。希望这个脚本能够为大家带来便利,也祝愿各位在编程和游戏中都能获得快乐!

完整代码如下:

import tkinter as tk
from tkinter import scrolledtext
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import threading
import sys

class QQFightAutomation:
    def __init__(self, status_text):
        self.status_text = status_text
        edge_service = Service(executable_path='msedgedriver.exe')
        self.driver = webdriver.Edge(service=edge_service)
        self.driver.set_page_load_timeout(30)
        self.initial_url = 'https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=index'
        self.wait = WebDriverWait(self.driver, 10)  # 设置等待时间为10秒

    def update_status(self, message):
        self.status_text.insert(tk.END, message + "\n")
        self.status_text.see(tk.END)

    def start(self):
        try:
            self.driver.get(self.initial_url)
            self.update_status("请登录后再执行其他动作...")
            element = WebDriverWait(self.driver, 10).until(  # 设置等待时间为10秒
                EC.element_to_be_clickable((By.ID, "img_out_1248693038"))
            )
            element.click()
        except TimeoutException:
            self.update_status("页面加载超时,请检查网络连接")
        except WebDriverException as e:
            self.update_status(f"WebDriver异常: {e}")



    # ... [其他方法保持不变,只需在每个方法的开始和结束添加 self.update_status() 调用]

    def EverydayAward(self):
        self.update_status("开始执行每日奖励领取...")
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=login")  # 每日登录
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=meridian")  # 传功符
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=daren")  # 达人礼包
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=dailygift&op=draw&key=wuzitianshu")  # 无字天书
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&B_UID=0&sid=&channel=0&g_ut=1&cmd=exp")  # 徒弟经验
        self.update_status("每日奖励领取完成")


    # 查看帮派
    def faction(self):
        # 示例:等待并点击另一个元素
        self.driver.get(self.initial_url)
        self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&B_UID=0&sid=&channel=0&g_ut=1&cmd=factionop&subtype=3&facid=5937554")
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=factionop&subtype=8&pageno=1&type=2")
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=facwar&sub=0&id=1")
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=facwar&sub=0&id=1")
        self.driver.get(
            "https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=factionhr&subtype=14")
        self.driver.get("https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&B_UID=0&sid=&channel=0&g_ut=1&cmd=forage_war")
        self.update_status("帮派查看完成")

    def ledouhaoyou(self):
        for i in range(8, 9):
            url = f"https://dld.qzapp.z.qq.com/qpet/cgi-bin/phonepk?zapp_uin=&sid=&channel=0&g_ut=1&cmd=friendlist&page={i}"
            self.driver.get(url)

            ledou_urls = []

            # 查找所有文本包含"乐斗"但不是"已乐斗"的超链接
            ledou_links = self.driver.find_elements(By.XPATH,
                                                    "//a[contains(text(), '乐斗') and not(contains(text(), '已乐斗'))]")

            # 保存所有符合条件的链接URL到列表中
            for link in ledou_links:
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值