news 2026/5/11 21:26:35

用uiautomator2+weditor实现抖音自动点赞脚本:从元素定位到手势模拟的完整实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用uiautomator2+weditor实现抖音自动点赞脚本:从元素定位到手势模拟的完整实战

抖音自动化交互实战:uiautomator2与weditor的深度应用

刷短视频已经成为许多人日常消遣的一部分,但重复的手势操作往往让人感到疲惫。作为一名Python开发者,你是否想过用代码来模拟这些操作?本文将带你深入探索如何利用uiautomator2和weditor工具包,构建一个能够自动浏览抖音视频并点赞的智能脚本。

1. 环境准备与工具链搭建

在开始自动化之旅前,我们需要配置一套稳定的开发环境。不同于简单的Python脚本,Android自动化测试需要更多组件协同工作。

1.1 基础环境配置

首先确保你的开发机满足以下条件:

  • Python 3.7+(推荐3.8或3.9版本)
  • ADB工具已安装并配置到系统PATH
  • 一部开启开发者选项的Android手机(建议Android 8.0+)

安装核心工具包时,建议使用国内镜像加速:

pip install --pre -U uiautomator2 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install weditor pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

注意:安装完成后需要执行python -m uiautomator2 init初始化手机端服务,这会在设备上安装ATX守护应用。

1.2 设备连接验证

uiautomator2支持USB和Wi-Fi两种连接方式。对于日常开发,USB连接更稳定:

import uiautomator2 as u2 # USB连接 d = u2.connect_usb() # 或Wi-Fi连接 # d = u2.connect('192.168.1.100') print(d.info)

连接成功后,你应该能看到设备的基本信息输出。如果遇到5037端口占用问题,可以尝试:

adb kill-server adb start-server

2. 界面元素解析与weditor实战

自动化操作的核心是准确定位界面元素。weditor作为可视化分析工具,能极大提升元素定位效率。

2.1 启动weditor分析抖音界面

在命令行执行:

python -m weditor

浏览器会自动打开本地服务页面。确保手机已连接并开启ATX的UIAUTOMATOR服务。

在抖音主界面点击"Dump Hierarchy"按钮,你会看到类似这样的布局结构:

android.widget.FrameLayout |- android.widget.LinearLayout |- android.widget.FrameLayout[resourceId="com.ss.android.ugc.aweme:id/root_view"] |- android.widget.RelativeLayout |- android.widget.ImageView[resourceId="com.ss.android.ugc.aweme:id/icon"]

2.2 关键元素定位策略

抖音的点赞按钮通常具有以下特征:

  • resourceId: com.ss.android.ugc.aweme:id/b0a
  • className: android.widget.ImageView
  • 描述可能包含"喜欢"或"点赞"

我们可以通过多种方式定位:

# 通过resourceId定位 like_btn = d(resourceId="com.ss.android.ugc.aweme:id/b0a") # 通过描述文字定位 like_btn = d(description="点赞") # 通过组合条件定位 like_btn = d(className="android.widget.ImageView", resourceId="com.ss.android.ugc.aweme:id/b0a")

提示:抖音不同版本的元素ID可能变化,建议使用weditor实时获取最新标识符。

3. 手势模拟与自动化流程设计

单纯的点击操作无法满足抖音的交互需求,我们需要模拟完整的用户行为链。

3.1 基础交互实现

以下是核心操作的代码实现:

def watch_and_like(d, count=10): for _ in range(count): # 上滑切换视频 d.swipe(500, 1500, 500, 500, 0.5) # 随机延迟模拟人类操作 import random time.sleep(random.uniform(1.5, 3.0)) # 双击点赞 like_pos = d(resourceId="com.ss.android.ugc.aweme:id/b0a").center() d.double_click(like_pos[0], like_pos[1], 0.1) # 随机滑动观看时长 time.sleep(random.uniform(5, 15))

3.2 高级手势控制

为增加行为的真实性,可以引入更复杂的手势:

def human_like_swipe(d): # 模拟人类手指的不规则滑动 points = [(500, 1500)] for i in range(1, 5): x_offset = random.randint(-50, 50) y_offset = random.randint(200, 250) points.append( (points[-1][0] + x_offset, points[-1][1] - y_offset) ) # 分段滑动 for i in range(len(points)-1): d.swipe(*points[i], *points[i+1], 0.2) time.sleep(random.uniform(0.05, 0.1))

4. 异常处理与稳定性优化

真实环境中的自动化脚本需要应对各种异常情况。

4.1 常见异常及解决方案

异常类型检测方法处理方案
弹窗广告检测特定元素存在点击关闭按钮
网络中断检查加载动画持续时间等待重试或刷新
版本更新检测包名变化终止运行并提示
操作超时设置timeout参数重试或记录日志

4.2 健壮性增强实现

def safe_click(element, max_retry=3): for attempt in range(max_retry): try: if element.exists: element.click() return True time.sleep(1) except Exception as e: print(f"点击失败: {str(e)}") d.screenshot(f"error_{int(time.time())}.png") return False def handle_popups(d): popups = [ {"text": "我知道了", "action": "click"}, {"resourceId": "com.ss.android.ugc.aweme:id/close", "action": "click"}, {"text": "以后再说", "action": "click"} ] for popup in popups: element = d(**{k:v for k,v in popup.items() if k != "action"}) if element.exists: getattr(element, popup["action"])() return True return False

5. 完整脚本架构与执行策略

将各个模块组合成完整的自动化解决方案。

5.1 主流程设计

def main(): d = u2.connect_usb() d.app_start("com.ss.android.ugc.aweme") try: while True: # 处理可能出现的弹窗 if handle_popups(d): continue # 执行观看和点赞 watch_and_like(d, count=1) # 随机休息防止过热 if random.random() < 0.2: time.sleep(random.uniform(10, 30)) except KeyboardInterrupt: print("用户终止运行") finally: d.app_stop("com.ss.android.ugc.aweme") if __name__ == "__main__": main()

5.2 性能监控与调优

添加性能统计功能:

class PerfMonitor: def __init__(self): self.actions = [] def record(self, action, duration): self.actions.append({ "time": time.time(), "action": action, "duration": duration }) def report(self): df = pd.DataFrame(self.actions) print(f"平均操作间隔: {df['duration'].mean():.2f}s") print(f"成功率: {len(df)/df['action'].nunique():.1%}")

在实际项目中,我发现抖音的界面元素结构会随版本更新而变化,因此建议将元素定位信息提取到配置文件中,便于后期维护。同时,适当增加随机延迟和操作变化可以有效降低被检测为自动化的风险。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 21:24:46

【指南】修复CDR缩略图异常:从ShellExt.msf控件冲突到多版本共存

1. 为什么CDR文件突然不显示缩略图了&#xff1f; 最近帮朋友处理了一个特别典型的CDR文件缩略图显示问题。这位设计师同事刚升级了CorelDRAW 2023&#xff0c;结果发现所有.cdr文件在资源管理器里都变成了白板图标&#xff0c;完全看不到内容预览。这种情况其实特别常见&#…

作者头像 李华
网站建设 2026/5/11 21:24:40

Gemini写代码全攻略:提示词技巧、实战避坑与效率翻倍指南

一、你是不是也遇到过这些"AI写代码"的尴尬&#xff1f; 说实话&#xff0c;很多人第一次用AI辅助写代码时&#xff0c;满心期待——结果生成的代码跑不通、不兼容、甚至用了根本不存在的API。 "为什么AI总给我编造库名&#xff1f;""生成的Python代…

作者头像 李华
网站建设 2026/5/11 21:24:24

现代SaaS应用开发:从技术选型到多租户架构实战指南

1. 项目概述&#xff1a;从零到一构建现代SaaS的技术蓝图 如果你正在考虑或者已经开始动手搭建一个SaaS&#xff08;软件即服务&#xff09;产品&#xff0c;那么你大概率已经搜索过“SaaS starter kit”、“SaaS boilerplate”这类关键词。在GitHub上&#xff0c; async-labs…

作者头像 李华
网站建设 2026/5/11 21:19:37

命运杠杆具象化的庖丁解牛

它的本质是&#xff1a;**在人生的长周期中&#xff0c;识别并利用那些 投入极小、但能引发系统性巨变 的 支点 (Fulcrum) 和 力臂 (Lever Arm)。它不是关于每天多努力一点&#xff08;线性积累&#xff09;&#xff0c;而是关于 在正确的时间、正确的地点、做正确的选择&#…

作者头像 李华