欢迎光临
我们一直在努力

基于Chrome140的Discord账号自动化——脚本撰写(二)

引言

在上一篇文章《基于Chrome140的Discord账号自动化——需求分析&环境搭建(一)》中,我们完成了开发环境的准备工作,包括Python环境配置、uv包管理器安装、Playwright框架部署以及Chrome浏览器的配置。现在,我们将进入核心开发阶段,基于RPA框架构建Discord自动化浏览系统。

本文将详细介绍如何使用基于动作执行器(action_executor)的RPA框架,实现Discord的智能浏览、交互和状态管理。通过状态机模式和权重化随机动作系统,我们将构建一个既自然又高效的自动化解决方案。

本教程将展示业务核心内容代码,框架部分将不作为展示。

1. RPA框架架构设计

核心框架结构

基于您提供的代码,我们的Discord自动化系统采用了成熟的RPA框架设计,具有以下核心特性:

from stubs.rpa import *
from functools import partial
from typing import Tuple
import random
import time

# 核心组件说明
# – CoreBrowsePage: 浏览器页面基类
# – CorePageObject: 页面对象基类
# – action_exector: 动作执行器装饰器
# – start_main_page_process: 主流程启动器

1.1 状态机设计模式

系统采用状态机模式管理不同的页面状态,每个状态对应特定的动作集合:

  • home状态:Discord首页浏览
  • detail状态:帖子详情页交互
  • unknown状态:异常状态处理

2. 核心动作系统

智能滚动动作

滚动是模拟真实用户浏览行为的基础动作,我们实现了支持随机距离、持续时间和方向的智能滚动系统。

@action_exector
def scroll_action(page: CoreBrowsePage, distance: Tuple[int, int], duration: Tuple[float, float], scroll_down_probability: int):
"""
滚动动作
:param distance: 滚动距离的范围,是一个元组,如(100, 200)
:param duration: 滚动持续时间的范围,是一个元组,如(0.1, 1.0)
:param scroll_down_probability: 向下滚动的概率,0-100之间的整数
:param page: 页面对象
"""
pass
page.ui_logger.log(f"Scrolling the page with a random distance between {distance[0]} and {distance[1]} pixels, ")
# 如果是首页可能触发切换
if page.get_current_state() == "home" and random.randint(0, 100) < 30:
# 切换页面
pass
_tabs = page.page.locator('[role="tablist"] > [role="tab"]')
# 随机切换一个
_random_index = random.randint(0, _tabs.count() – 1)
page.ui_logger.log(f"Switching to tab index {_random_index}.")
_tabs.nth(_random_index).click()
time.sleep(1)
return

_distance = random.randint(*distance)
_duration = random.uniform(*duration)
_scroll_locator = page.page.locator('body')
if random.randint(0, 100) > scroll_down_probability:
# 向上滚动
_distance = -_distance

smooth_scroll(page.page, _distance, _duration)

2.1 停留动作模拟

停留动作模拟用户阅读和思考的时间,是增强真实性的重要组件:

@action_exector
def stay_action(page: CoreBrowsePage, stay_time: Tuple[int, int]):
"""
用户停留动作模拟器

模拟真实用户在浏览过程中的阅读、思考停顿时间

Args:
page: 浏览器页面对象
stay_time: 停留时间范围 (min_seconds, max_seconds)
"""
# 随机生成停留时间
_stay_duration = random.uniform(*stay_time)

page.logger.info(f"用户停留思考: {_stay_duration:.2f}秒")

# 执行等待
time.sleep(_stay_duration)
# 如果需要截图可以添加截图记录执行
page.save_html_and_screenshot() # 保存html内容和截图
page.logger.info("停留结束,继续浏览")

3. 内容交互系统

智能帖子选择与点击

内容交互是Discord自动化的核心功能,我们实现了智能的帖子识别和点击系统:

@action_exector
def detail_action(page: CorePageObject):
pass
page.ui_logger.log("Viewing details of the current page.")
_article_locators = page.page.locator('[class*="transitionGroup"]')
_selected_article = None
for _article_locator in _article_locators.all():
if element_in_viewport(page.page, _article_locator) and _article_locator.is_enabled():
_selected_article = _article_locator
break

if not _selected_article:
page.ui_logger.log("not found article in viewport", "warning")
return

page.ui_logger.log(f"click article position: {_selected_article.bounding_box()}")
_article_title_locator = _selected_article
if _article_title_locator.count() > 0:
page.logger.info(f"click article title {_article_title_locator.locator('h2').first.text_content()}")
simulate_mouse_click(page.page, _article_title_locator)

3.1 返回导航动作

返回动作确保用户能够从详情页回到主页面继续浏览:

@action_exector
def back_action(page: CorePageObject):
pass
page.page.go_back()

4. Discord页面控制器

DiscordBrowsePage核心类

Discord浏览页面类是整个系统的核心控制器,管理页面状态、动作权重和异常处理:

class DiscordBrowsePage(CoreBrowsePage):

@property
def url(self):
return "https://discord.com/discovery/servers"

@property
def random_actions(self):
return {
"home": [
(self.scroll_weight, partial(scroll_action, distance=self.scroll_distance, duration=self.scroll_time, scroll_down_probability=self.scroll_down_probability)),
(self.stay_weight, partial(stay_action, stay_time=self.home_stay_time)),
(self.view_detail_weight, partial(detail_action)),
],
"detail": [
(self.scroll_weight, partial(scroll_action, distance=self.scroll_distance, duration=self.scroll_time, scroll_down_probability=self.scroll_down_probability)),
(self.stay_weight, partial(stay_action, stay_time=self.home_stay_time)),
(self.go_back_weight, partial(back_action)),
],
}

def check_exception_handler(self):
"""
每个随机动作之前检查是否有异常行为, 例如页面弹出的dialog
:return:
"""
pass
self.page.bring_to_front()
if "discovery/servers" not in self.page.url and "channels" not in self.page.url:
self.ui_logger.log(f"abnormal page url: {self.page.url}, try to go back to home page", "warning")
self.page.goto("https://discord.com/discovery/servers")
self.page.wait_for_load_state()
self.page.bring_to_front()
time.sleep(3)

_dialog_locator = self.page.locator('div[role="dialog"]')
if _dialog_locator.count() > 0 and _dialog_locator.first.is_visible():
self.ui_logger.log("found dialog, try to close it", "warning")
# 点击关闭按钮
_dialog_locator.first.locator('button[class*="close"]').first.click()
time.sleep(3)
return True

4.1 登录状态检测

def is_login(self):
"""
检查是否登录
:return:
"""
try:
self.page.wait_for_selector('[class*="transitionGroup"]', timeout=10000)
except Exception as e:
self.logger.error(f"Error checking login status: {e}")
return False
return True

4.2 页面状态识别

def get_current_state(self):
_current_page_url = self.page.url
self.ui_logger.log(f"current page url: {_current_page_url}")
if "discovery/servers" in _current_page_url:
return "home"
return "detail"

5. 系统启动与配置

主流程启动配置

系统启动使用框架提供的start_main_page_process函数,支持重试机制和超时控制:

# 系统主流程启动
start_main_page_process(
self, # 页面实例
DiscordBrowsePage, # Discord页面控制器类
retry=1, # 失败重试次数
timeout=60000 # 超时时间(毫秒)
)

5.1 配置参数说明

Discord自动化系统的行为通过以下权重参数进行调控:

# 动作权重配置示例
class DiscordBrowsePage(CoreBrowsePage):
def __init__(self):
super().__init__()

# 滚动相关配置
self.scroll_weight = 40 # 滚动动作权重
self.scroll_distance = (200, 600) # 滚动距离范围(像素)
self.scroll_time = (0.5, 2.0) # 滚动持续时间(秒)
self.scroll_down_probability = 80 # 向下滚动概率(%)

# 停留相关配置
self.stay_weight = 30 # 停留动作权重
self.home_stay_time = (3, 8) # 主页停留时间范围(秒)

# 交互相关配置
self.view_detail_weight = 20 # 查看详情权重
self.go_back_weight = 80 # 返回操作权重

额外说明

框架依赖说明

本系统基于成熟的RPA框架构建,主要依赖组件包括:

# 核心依赖模块
from stubs.rpa import (
CoreBrowsePage, # 浏览器页面基类
CorePageObject, # 页面对象基类
action_exector, # 动作执行器装饰器
smooth_scroll, # 平滑滚动函数
element_in_viewport, # 视口检测函数
simulate_mouse_click, # 鼠标点击模拟
start_main_page_process # 主流程启动器
)

最佳实践建议

  • 权重调优:根据实际需求调整各动作的权重比例
  • 时间控制:合理设置停留时间和滚动持续时间
  • 异常处理:完善check_exception_handler方法的异常检测逻辑
  • 日志记录:充分利用页面对象的logger进行调试和监控
  • 状态管理:根据业务需求扩展更多的页面状态
  • 结语

    本文详细介绍了基于RPA框架的Discord自动化浏览系统实现方案。通过动作执行器模式、状态机管理和权重化随机动作系统,我们构建了一个功能完整、行为自然的自动化解决方案。

    核心技术特点:

    • 基于装饰器的动作执行器模式,代码结构清晰
    • 状态机管理不同页面的行为策略
    • 权重化随机动作系统,模拟真实用户行为
    • 智能内容识别和交互机制
    • 完善的异常检测和处理框架

    系统优势:

    • 高度模块化的设计,易于扩展和维护
    • 基于成熟RPA框架,稳定性有保障
    • 智能的页面状态识别和动作选择
    • 丰富的配置参数,适应不同使用场景

    通过本文的学习,您已经掌握了Discord自动化系统的核心开发技术。在下一篇文章《基于Chrome140的Discord账号自动化——运行脚本(三)》中,我们将重点介绍系统的部署运行、监控管理和性能优化,帮助您将开发完成的自动化脚本投入实际应用。

    赞(0)
    未经允许不得转载:171主机测评 » 基于Chrome140的Discord账号自动化——脚本撰写(二)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址