详细介绍:基于Chrome140的FB账号自动化——脚本撰写(二)

news/2025/10/1 13:48:55/文章来源:https://www.cnblogs.com/yxysuanfa/p/19122398

引言

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

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

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

1. RPA框架架构设计

核心框架结构

基于您提供的代码,我们的Facebook自动化系统采用了成熟的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状态:Facebook首页浏览
  • detail状态:帖子详情页交互
  • unknown状态:异常状态处理

2. 核心动作系统

智能滚动动作

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

@action_exector
def scroll_action(page: CoreBrowsePage, distance: Tuple[int, int],duration: Tuple[float, float], scroll_down_probability: int):"""智能滚动动作执行器Args:page: 浏览器页面对象distance: 滚动距离范围 (min_distance, max_distance)duration: 滚动持续时间范围 (min_duration, max_duration)scroll_down_probability: 向下滚动概率 (0-100)"""# 随机生成滚动参数_distance = random.randint(*distance)_duration = random.uniform(*duration)# 获取页面主体元素_scroll_locator = page.page.locator('body')# 根据概率决定滚动方向if random.randint(0, 100) > scroll_down_probability:# 向上滚动(负值)_distance = -_distancepage.logger.info(f"执行向上滚动: {abs(_distance)}px, 持续时间: {_duration:.2f}s")else:page.logger.info(f"执行向下滚动: {_distance}px, 持续时间: {_duration:.2f}s")# 执行平滑滚动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. 内容交互系统

智能帖子选择与点击

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

@action_exector
def detail_action(page: CorePageObject):"""智能帖子详情页进入动作自动识别当前视口内的可点击内容,优先选择图片和视频帖子"""page.logger.info("开始搜索可点击的帖子内容")_selected_post = None# 第一优先级:搜索图片帖子_photo_post_locators = page.page.locator('[data-virtualized="false"] .html-div > a')for _article_locator in _photo_post_locators.all():# 检查链接是否包含photo关键词href_attr = _article_locator.get_attribute('href')if not href_attr or "photo" not in href_attr:continue# 检查元素是否在视口内且可点击if element_in_viewport(page.page, _article_locator) and _article_locator.is_enabled():_selected_post = _article_locatorpage.logger.info(f"找到可点击的图片帖子: {href_attr}")break# 第二优先级:搜索视频帖子if not _selected_post:page.logger.info("未找到图片帖子,搜索视频内容")_video_post_locators = page.page.locator('[data-virtualized="false"] .html-div video')for _video_post_locator in _video_post_locators.all():if element_in_viewport(page.page, _video_post_locator) and _video_post_locator.is_enabled():_selected_post = _video_post_locatorpage.logger.info("找到可点击的视频帖子")break# 执行点击操作if not _selected_post:page.logger.info("当前视口内未找到可点击的帖子内容")return# 记录点击信息page.logger.info(f"准备点击帖子元素: {_selected_post}")try:bounding_box = _selected_post.bounding_box()if bounding_box:page.logger.info(f"帖子位置信息: x={bounding_box['x']}, y={bounding_box['y']}, "f"width={bounding_box['width']}, height={bounding_box['height']}")except Exception as e:page.logger.warning(f"获取元素位置信息失败: {e}")# 执行模拟鼠标点击page.logger.info("执行帖子点击操作")simulate_mouse_click(page.page, _selected_post.first)

3.1 返回导航动作

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

@action_exector
def back_action(page: CorePageObject):"""页面返回导航动作从帖子详情页返回到主页面,并等待页面加载完成"""page.logger.info("执行页面返回操作")# 执行浏览器返回page.page.go_back()# 等待页面稳定page.logger.info("等待页面加载完成...")page.page.wait_for_timeout(5000)  # 固定等待5秒page.page.wait_for_load_state()   # 等待页面加载状态page.logger.info("页面返回完成")

4. Facebook页面控制器

FBBrowsePage核心类

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

# 详情页URL关键词定义
_DETAIL_URL_KEYWORDS = ["photo",    # 图片帖子"watch",    # Watch视频"video",    # 普通视频"reel",     # Reels短视频"live",     # 直播内容
]
class FBBrowsePage(CoreBrowsePage):"""Facebook自动化浏览页面控制器"""@propertydef url(self):"""Facebook主页URL"""return "https://facebook.com"@propertydef 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.stay_weight, partial(stay_action,stay_time=self.home_stay_time)),(self.go_back_weight, partial(back_action)),],}

4.1 登录状态检测

    def is_login(self):"""Facebook登录状态检测通过检查当前页面URL来判断是否成功登录登录成功后应该停留在Facebook主页Returns:bool: True表示已登录,False表示未登录或登录失败"""try:# 等待页面加载完成self.page.wait_for_load_state()# 检查URL是否为Facebook主页current_url = self.page.url.strip('/')expected_url = "https://www.facebook.com"if current_url != expected_url:self.logger.warning(f"当前页面URL不匹配: {current_url} != {expected_url}")return Falseself.logger.info("Facebook登录状态检测通过")return Trueexcept Exception as e:self.logger.error(f"登录状态检测失败: {e}")return False

4.2 页面状态识别

    def get_current_state(self):"""智能页面状态识别系统根据当前页面URL自动识别页面状态,用于动作选择Returns:str: 页面状态 ("home", "detail", "unknown")"""_current_page_url = self.page.urlself.logger.info(f"当前页面URL分析: {_current_page_url}")# Facebook主页状态if _current_page_url.strip('/') == "https://www.facebook.com":self.logger.info("识别为主页状态 (home)")return "home"# 详情页状态检测if any(keyword in _current_page_url for keyword in _DETAIL_URL_KEYWORDS):self.logger.info(f"识别为详情页状态 (detail)")return "detail"# 未知状态self.logger.warning(f"未知页面状态: {_current_page_url}")return "unknown"def check_exception_handler(self):"""异常状态处理器在每个随机动作执行前检查页面是否出现异常情况例如:弹出对话框、验证码、错误页面等可以在这里添加各种异常情况的处理逻辑"""try:# 检查是否有阻塞性弹窗modal_selectors = ['[role="dialog"]','.modal','[data-testid="cookie-policy-manage-dialog"]','[aria-label*="关闭"]']for selector in modal_selectors:elements = self.page.locator(selector)if elements.count() > 0:self.logger.warning(f"检测到弹窗元素: {selector}")# 这里可以添加关闭弹窗的逻辑breakexcept Exception as e:self.logger.error(f"异常检查处理失败: {e}")

5. 系统启动与配置

主流程启动配置

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

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

5.1 配置参数说明

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

# 动作权重配置示例
class FBBrowsePage(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 # 主流程启动器
)

最佳实践建议

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

结语

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

核心技术特点

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

系统优势

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7二进制安装包方式部署K8S集群之CA根证书生成 - 实践

CentOS7二进制安装包方式部署K8S集群之CA根证书生成 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

网站地址栏做1个响应式设计网站好

全世界只有3.14 % 的人关注了爆炸吧知如何才能学好数学?我国著名数学家苏步青先生曾说:"要学好数学,方法不外乎打好基础,多做习题,多加思索和分析”。为了帮助大家学好数学,今天,超模君要给…

旅游网站开发系统的er图网站建设 公司 广州

1.android电池充满电剩余时间 android电量还需多长时间充满时间计算参考下面链接: [Android Framework] 8.1 Battery系列(四) 电量还需多长时间充满时间计算_batteryinfo.java-CSDN博客 从这个链接中可以看出android默认的计算方式为平均计算每1%所需要的时间,在乘以剩余的电…

旅游景区网站源码长沙网络科技有限公司有哪些

介绍 赋值运算符就是将某个运算后的值, 赋给指定的变量。 赋值运算符的分类 基本赋值运算符 例如: int a 10; 复合赋值运算符 , - , * , / , % 等 a b; [等价 a a b; ] a - b; [等价 a a - b; ] …

可以做进销存的网站系统百度网站改版工具

QQ的庞大安装量带动了腾讯系的所有产品的安装量,QQ浏览器作为腾讯旗下开发的浏览工具,也拥有不俗的装机量。QQ浏览器不仅是沾了QQ的光,其自身实力也有不俗的,QQ浏览器的应用中心与其他浏览器的扩展中心一般支持用户安装各种浏览器…

软件设计师——03 数据结构(上) - 详解

软件设计师——03 数据结构(上) - 详解2025-10-01 13:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

深圳网站建设公司地图建站官网模板

给自己一个目标,然后坚持一段时间,总会有收获和感悟! 在实际项目开发中,多少都会遇到高并发的情况,有可能是网络问题,连续点击鼠标无反应快速发起了N多次调用接口, 导致极短时间内重复调用了多次…

DailyPaper-2025-9-30

感觉今天 paper 质量不是很高, 刚考完试太累了也读不很下去. SLA: Beyond Sparsity in Diffusion Transformers via Fine-Tunable Sparse-Linear Attention https://arxiv.org/abs/2509.24006SLA, a trainable attenti…

Powershell 管理 后台/计划 作业(六)

Powershell 管理 后台/计划 作业目录管理 后台/计划 作业后台作业本地作业远程作业CIM / WMI 作业作业的管理检索作业查看子作业简单案例计划作业作业选项作业触发器创建和注册使用流程查看与管理与任务计划程序的关系…

【stm32】bash自动配置buildenv - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

java17及以上版本如何抵御TemplatesImpl注入

最近有一篇写的很好的关于java17反序列化绕过模块化的文章:https://mp.weixin.qq.com/s/DrUUAJaLig_RtXZWaAm1IQ 关于本篇的方式方法也比较传统,直接jep290在java运行时增加命令行参数: -Djdk.serialFilter=!com.su…

详细介绍:【C++实战(53)】C++11线程库:开启多线程编程新世界

详细介绍:【C++实战(53)】C++11线程库:开启多线程编程新世界pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

wordpress让小工具支持简码汕头百度seo在哪里

2006-2023年各地级市债务余额数据 1、时间:2006-2023年 2、来源:整理自wind 3、指标:地区、地方政府债-债券数量(只)、地方政府债-债券余额(亿)、地方政府债-债券余额占比(%)、城投债-债券数量(只)、城投债-债券余额(亿)、城投债-债券余额…

将图片某个区域批量填充白色(jsx代码)

// 定义源文件夹和目标文件夹路径 var sourceFolderPath = "C:/Users/***/Desktop/拆分/"; var destFolderPath = "C:/Users/***/Desktop/结果/";// 定义要填充的区域坐标 (x, y, 宽度, 高度) var…

青岛做网站哪个公司好网站建设报告论文

电影《楚门的世界》中描述过这样的故事:楚门这个快乐单纯的青年,一直以为自己是平凡小镇上普通的保险推销员。直到有一天他发现这世界上的一切都是为他精心安排的。他会遇到谁、在他身上将要发生什么事件,都是按照剧本被人操纵的。甚至连他的…

详细介绍:四数之和_优选算法(C++)双指针法总结

详细介绍:四数之和_优选算法(C++)双指针法总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

网站建设 嘉定宣传片制作公司前景

内存操作命令 直接对DRAM进行读写的操作,uboot常用的内存操作命令有md,nm,mm,mw,cp和cmp. md命令: 显示内存值 # md md - memory display Usage: md [.b, .w, .l, .q] address [# of objects] b:1个字节 byte w:2个字节 world l:4个字节 long of objects 以word 为单位的1…

《初等数论(第四版,北京大学出版社,潘承洞,潘承彪著)》阅读笔记+心得

I、整除理论 一、自然数与整数 这里的自然数定义和各种规律以及反证法的定义就不再赘述,我们从归纳法开始讲起。 1.归纳原理 归纳原理: 设 S 是 N 的一个子集,满足条件: (i) \(1 \in S\) (ii) \(n \in S\),那么有…

完整教程:Ansible Playbook

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …