手把手教你用Python+UiAutomator2写一个抖音自动点赞脚本(附完整源码)
Python+UiAutomator2实战:打造抖音自动点赞机器人
刷抖音时看到喜欢的视频,手动点赞太麻烦?今天我们用Python和UiAutomator2打造一个自动点赞机器人,解放你的双手!这个项目不仅能帮你自动点赞感兴趣的内容,还能深入学习Android自动化测试的核心技术。
1. 环境准备与工具安装
在开始编写自动化脚本之前,我们需要准备好开发环境。UiAutomator2是一个强大的Python库,专门用于Android设备的UI自动化测试和操作。相比Appium,它更轻量级,执行速度更快,特别适合这种简单的自动化任务。
首先确保你的电脑已经安装了Python 3.6或更高版本。然后通过pip安装必要的库:
pip install uiautomator2 pip install weditorweditor是一个可视化元素定位工具,能帮助我们快速获取APP界面元素的属性信息。安装完成后,在命令行运行:
python -m weditor这会启动一个本地Web服务,通常访问地址是http://localhost:17310。确保你的Android设备已通过USB连接电脑,并开启了USB调试模式。
提示:在Android设备的开发者选项中开启"USB调试"和"USB安装"选项,部分设备还需要开启"USB调试(安全设置)"。
2. 设备连接与抖音APP启动
环境准备就绪后,我们开始编写Python脚本。创建一个新的Python文件,比如douyin_auto_like.py,然后添加以下代码:
import uiautomator2 as u2 import time # 连接设备 d = u2.connect() # 默认连接第一个USB设备 # 或者使用WiFi连接:d = u2.connect('192.168.1.x') # 打印设备信息 print(d.info) # 启动抖音APP d.app_start('com.ss.android.ugc.aweme') # 抖音的包名 time.sleep(5) # 等待APP完全启动这段代码完成了三件事:
- 通过USB连接Android设备(如果是WiFi连接,使用
connect()方法传入设备IP) - 打印设备基本信息,确认连接成功
- 启动抖音APP并等待5秒让其完全加载
注意:抖音的包名可能会因版本或地区不同而变化,可以通过
d.app_list_running()查看当前运行的应用包名。
3. 元素定位与点赞操作
抖音APP的界面元素会随着版本更新而变化,因此我们需要一种可靠的方式来定位点赞按钮。打开之前启动的weditor,在浏览器中查看抖音界面的元素结构。
通过分析,我们发现点赞按钮通常有以下特征:
- className: android.widget.ImageView
- resourceId: 包含"like"或"aweme"字样
- 描述可能包含"点赞"
下面是定位并点击点赞按钮的代码:
def like_current_video(): # 尝试多种方式定位点赞按钮 like_btn = None try: like_btn = d(resourceIdMatches=".*like.*", className="android.widget.ImageView") if not like_btn.exists: like_btn = d(descriptionMatches=".*赞.*", className="android.widget.ImageView") if like_btn.exists: like_btn.click() print("点赞成功!") return True except Exception as e: print(f"定位点赞按钮失败: {e}") return False这段代码展示了UiAutomator2强大的元素定位能力,我们使用了:
resourceIdMatches:通过正则表达式匹配resourceIddescriptionMatches:匹配元素描述className:确保定位的是图片按钮
4. 视频滑动与自动化循环
单纯的点赞功能还不够,我们需要让脚本自动滑动到下一个视频并继续点赞。观察抖音的滑动操作,我们发现:
- 视频区域大约占据屏幕的70%-80%
- 向上滑动距离约为屏幕高度的60%
- 每次滑动后需要等待1-2秒让新视频加载
实现代码如下:
def swipe_to_next_video(): # 获取屏幕尺寸 width, height = d.window_size() # 计算滑动起点和终点 start_x = width * 0.5 start_y = height * 0.8 end_y = height * 0.2 # 执行滑动操作 d.swipe(start_x, start_y, start_x, end_y, duration=0.5) time.sleep(2) # 等待新视频加载 # 主循环 def main_loop(max_likes=50): like_count = 0 while like_count < max_likes: if like_current_video(): like_count += 1 print(f"已点赞 {like_count}/{max_likes} 个视频") swipe_to_next_video()这个主循环会:
- 尝试点赞当前视频
- 滑动到下一个视频
- 重复直到达到设定的点赞数量
5. 完整代码与优化建议
将以上各部分组合起来,我们的完整自动点赞脚本如下:
import uiautomator2 as u2 import time class DouyinAutoLiker: def __init__(self): self.d = u2.connect() print("设备信息:", self.d.info) def start_douyin(self): self.d.app_start('com.ss.android.ugc.aweme') time.sleep(5) def like_current_video(self): try: like_btn = self.d(resourceIdMatches=".*like.*", className="android.widget.ImageView") if not like_btn.exists: like_btn = self.d(descriptionMatches=".*赞.*", className="android.widget.ImageView") if like_btn.exists: like_btn.click() print("点赞成功!") return True except Exception as e: print(f"定位点赞按钮失败: {e}") return False def swipe_to_next_video(self): width, height = self.d.window_size() self.d.swipe(width*0.5, height*0.8, width*0.5, height*0.2, 0.5) time.sleep(2) def run(self, max_likes=50): self.start_douyin() like_count = 0 while like_count < max_likes: if self.like_current_video(): like_count += 1 print(f"已点赞 {like_count}/{max_likes}") self.swipe_to_next_video() if __name__ == "__main__": bot = DouyinAutoLiker() bot.run(max_likes=30)优化建议:
- 异常处理:增加更多异常捕获,确保网络波动或APP卡顿时脚本不会崩溃
- 智能等待:使用
d.wait方法代替固定时间的sleep,提高效率 - 元素缓存:对频繁访问的UI元素进行缓存,减少查找时间
- 日志记录:添加详细的日志记录,方便调试和问题追踪
- 随机间隔:在操作之间加入随机延迟,使行为更接近人类操作
6. 常见问题与解决方案
在实际运行中,你可能会遇到以下问题:
问题1:无法找到点赞按钮
解决方案:
- 使用weditor重新确认点赞按钮的属性
- 尝试其他定位策略,如XPath或组合定位
- 检查抖音版本是否更新导致界面变化
问题2:滑动后视频没有正确加载
解决方案:
- 调整滑动距离和持续时间
- 增加滑动后的等待时间
- 检查网络连接是否稳定
问题3:脚本运行一段时间后停止
解决方案:
- 添加心跳检测,定期检查APP是否在前台
- 实现自动恢复机制,当检测到异常时重新启动APP
- 设置最大运行时间,避免长时间运行导致手机发热
# 示例:心跳检测 def check_app_running(self): if not self.d.app_current()['package'] == 'com.ss.android.ugc.aweme': print("抖音不在前台,重新启动...") self.start_douyin()7. 扩展思路与高级功能
基础功能实现后,我们可以考虑添加更多智能功能:
内容过滤:只点赞特定主题或关键词的视频
def should_like_video(self): # 获取视频描述文本 desc = self.d(resourceIdMatches=".*desc.*").get_text() keywords = ["python", "编程", "技术"] return any(keyword in desc.lower() for keyword in keywords)自动评论:对喜欢的视频添加预设评论
def post_comment(self, text): comment_btn = self.d(resourceIdMatches=".*comment.*") if comment_btn.exists: comment_btn.click() time.sleep(1) self.d(resourceIdMatches=".*input.*").set_text(text) self.d(text="发送").click()数据分析:收集点赞视频的数据进行分析
def collect_video_info(self): info = { 'author': self.d(resourceIdMatches=".*author.*").get_text(), 'desc': self.d(resourceIdMatches=".*desc.*").get_text(), 'likes': self.d(resourceIdMatches=".*count.*").get_text(), 'time': time.strftime("%Y-%m-%d %H:%M:%S") } return info定时任务:设置脚本在特定时间段运行
import schedule def job(): bot = DouyinAutoLiker() bot.run(max_likes=30) schedule.every().day.at("12:00").do(job) schedule.every().day.at("18:00").do(job) while True: schedule.run_pending() time.sleep(60)
在实际项目中,我发现最关键的挑战是处理APP界面变化和网络不稳定性。通过添加多重元素定位策略和健壮的错误处理,可以大大提高脚本的稳定性。另外,适当设置操作间隔不仅能让行为更人性化,还能减少被系统检测为自动操作的风险。
