乐于分享
好东西不私藏

《懒人硬核福音!Python+Appium实现抖音全智能自动刷视频,从此告别手动划划划~》

《懒人硬核福音!Python+Appium实现抖音全智能自动刷视频,从此告别手动划划划~》

“带你横跨办公自动化的数据江海”

@摸鱼

闻道有先后,术业有专攻。各位大佬们大家好!~我是你们的老朋友摸鱼~,本人在十多年的日常工作中摸爬滚打攒了不少Python办公自动化的实用项目技巧,自创立”码海听潮”公众号以来,已经陆续分享70多篇原创文章啦!里面满满的办公实操干货,希望能与各位大佬共同探讨办公效率提升之道,实现不加班自由。

好叻,多了不说,少了不唠,咱直接上干货。

办公需求场景

从崩溃到优雅的进化

过年这几天,我发现一个有趣的现象:家里的亲戚朋友,几乎都被抖音“俘获”了。饭前饭后、闲聊天时,甚至一大早刚睁眼,总有人掏出手机轻轻一划,然后被逗得前仰后合。整个假期,家里的背景音乐几乎都被抖音热门BGM承包了——这不就是移动互联网经济最鲜活的缩影吗?

看着此起彼伏的手机屏幕,我突然意识到,每个人指尖的每一次滑动,都在参与这场庞大的流量盛宴。抖音这类平台,凭借精准的算法推送和极致的用户体验,早已不只是消遣工具,而是形成了一个涵盖内容创作、电商带货、直播打赏的全新经济生态。亲戚刷到的带货视频、本地美食推荐,甚至不经意划过的广告,背后都链接着复杂商业模式——算法推送内容,也推送消费;用户获取快乐,也被纳入流量的精密计算。

就在欢笑声与BGM的交织中,一个想法冒了出来:能不能用Python做个智能刷抖音的小工具?让它模拟真实用户操作,自动滑动、智能停留、随机点赞,既能为这个流量经济贡献一份“自动化”力量,又能亲身探索平台背后的算法逻辑。说不定,还能帮我“训练”出更懂我口味的推荐流,让刷视频变得高效有趣。

这个念头让我心里痒痒——代码在手,天下我有。既然大家都在刷,不如让手机帮我刷。振臂一呼:python手机自动化,我来征服了!

办公痛点分析

01

 痛点1:效率极低,时间黑洞

    • 无意识消耗:原本只想刷10分钟放松,结果一抬头两小时过去了。这种被动消耗严重挤占了原本用于学习、工作或深度休息的时间。

    • 目的与结果的偏离:如果你想通过大量刷同类视频来“驯化”算法,手动寻找、点赞、划走重复内容,过程极其枯燥且低效,远不如脚本来得精准快速。

    02

     痛点2:算法驯化不精准

      • 误触干扰:不小心在某个不感兴趣的视频上多停留了两秒,或者忘了划走,算法就会持续推荐同类内容,导致推荐流越来越偏,需要花大量精力去“纠正”算法。

      • 手动操作局限:人工无法做到毫秒级的精准操作,且长时间重复“看-划-看”对手指和眼睛都是负担。

      03

      痛点3:生理健康损耗

      • 颈椎与视力:长时间低头、盯着高亮度屏幕,导致颈椎曲度改变、干眼症、视力下降。

      • 睡眠剥夺:深夜躺在床上刷抖音,蓝光抑制褪黑素分泌,加上内容刺激,极易导致失眠和生物钟紊乱。

      由此可见若操作成百上千个抖音视频的话整个操作流程繁琐且耗时,高频次的鼠标点击和键盘输入使操作者手指疲劳,堪称”键盘敲冒烟”式的体力劳动,加上人工疲劳操作极易导致遗漏文件夹。于是乎这时候,按以往的 “解题套路”,Python 的专属 BGM 该响起来了 ——go~ go~ go~,救苦救难的大救星这不就来了!!

      @摸鱼

      问题拆解思路

      1.adb连接手机

      2.用appium移动端UI手机自动化框架配合python脚本实现自动刷抖音视频

      下面,我就用python代码让excel见识一下,什么叫”传统文化遇上赛博效率”(仅展示部分代码,非完整代码,需完整代码看文章末尾说明~)

      import sysfrom datetime import datetimefrom PyQt6.QtWidgets import (    QApplicationQMainWindowQWidgetQVBoxLayoutQHBoxLayout,    QPushButtonQLabelQTextEditQLineEditQComboBoxQSpinBox,    QGroupBoxQGridLayoutQCheckBoxQMessageBoxQFileDialog,    QProgressBarQSplitterQFrame)from PyQt6.QtCore import (    QtQThread, pyqtSignal, QTimerQSizeQSettings)from PyQt6.QtGui import (    QFontQIconQPaletteQColorQTextCursor)# 自定义日志输出信号class LogSignal(QThread):    log = pyqtSignal(str, str)  # 刷视频工作线程class VideoSwipingThread(QThread):    log_signal = pyqtSignal(str, str)    progress_signal = pyqtSignal(int, int)    finished_signal = pyqtSignal()    def __init__(self, bot, loop_count):        super().__init__()        self.bot = bot        self.loop_count = loop_count    def run(self):        try:            def thread_log_callback(message, level):                self.log_signal.emit(message, level)            original_callback = self.bot.log_callback            self.bot.log_callback = thread_log_callback            self.bot.smart_auto_swipe(                loop_count=self.loop_count,                progress_callback=self.on_progress            )            # 恢复原始callback            self.bot.log_callback = original_callback        finally:            self.finished_signal.emit()    def on_progress(self, current, total):        self.progress_signal.emit(current, total)# 连接设备工作线程class ConnectDeviceThread(QThread):    log_signal = pyqtSignal(str, str)    finished_signal = pyqtSignal(bool, object)     def __init__(self, automation, device_udid):        super().__init__()        self.automation = automation        self.device_udid = device_udid    def run(self):        def thread_log_callback(message, level):            self.log_signal.emit(message, level)        original_callback = self.automation.log_callback        self.automation.log_callback = thread_log_callback        driver = self.automation.initialize(self.device_udid)        success = driver is not None        self.automation.log_callback = original_callback        self.finished_signal.emit(success, driver)# 主窗口class AppiumVideoBotUI(QMainWindow):    def __init__(self):        super().__init__()        self.log_signal = LogSignal()        self.log_signal.log.connect(self.append_log)        # 初始化变量        self.automation = None  # 将在外部设置        self.bot = None        self.swiping_thread = None        self.connect_thread = None        self.is_running = False        # 设置窗口基本属性        self.setWindowTitle("Appium 智能刷视频工具 v1.0")        self.setGeometry(1001001000700)        # 设置样式 - 修改按钮文字颜色为黑色        self.setStyleSheet("""            QMainWindow {                background-color: #f0f2f5;            }            QGroupBox {                font-weight: bold;                font-size: 14px;                color: #2c3e50;                border: 1px solid #ddd;                border-radius: 8px;                margin-top: 10px;                padding-top: 10px;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 10px 0 10px;            }            QPushButton {                background-color: #3498db;                color: #000000;  /* 修改为黑色 */                border: none;                border-radius: 6px;                padding: 8px 16px;                font-size: 14px;            }            QPushButton:hover {                background-color: #2980b9;            }            QPushButton:disabled {                background-color: #bdc3c7;                color: #7f8c8d;  /* 禁用状态保持灰色 */            }            QPushButton#startButton {                background-color: #2ecc71;                color: #000000;  /* 修改为黑色 */            }            QPushButton#startButton:hover {                background-color: #27ae60;            }            QPushButton#stopButton {                background-color: #e74c3c;                color: #000000;  /* 修改为黑色 */            }            QPushButton#stopButton:hover {                background-color: #c0392b;            }            QComboBox, QSpinBox, QLineEdit {                border: 1px solid #ddd;                border-radius: 6px;                padding: 6px;                font-size: 14px;            }            QTextEdit {                border: 1px solid #ddd;                border-radius: 6px;                font-family: Consolas, monospace;                font-size: 12px;            }            QProgressBar {                border: 1px solid #ddd;                border-radius: 6px;                text-align: center;                height: 25px;            }            QProgressBar::chunk {                background-color: #3498db;                border-radius: 5px;            }        """)        # 创建中心部件        central_widget = QWidget()        self.setCentralWidget(central_widget)        # 主布局        main_layout = QVBoxLayout(central_widget)        main_layout.setSpacing(15)        main_layout.setContentsMargins(20202020)        # 标题        title_label = QLabel("📱 Appium 智能刷视频工具")        title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)        title_label.setFont(QFont("Arial"18QFont.Weight.Bold))        title_label.setStyleSheet("color: #2c3e50; margin-bottom: 10px;")        main_layout.addWidget(title_label)        # 顶部控制面板        control_group = QGroupBox("控制中心")        control_layout = QGridLayout(control_group)        # 设备选择        control_layout.addWidget(QLabel("📶 设备选择:"), 00)        self.device_combo = QComboBox()        self.device_combo.setMinimumWidth(300)        control_layout.addWidget(self.device_combo, 01)        self.refresh_device_btn = QPushButton("🔄 刷新设备")        self.refresh_device_btn.clicked.connect(self.refresh_devices)        control_layout.addWidget(self.refresh_device_btn, 02)        # 视频数量设置        control_layout.addWidget(QLabel("🎯 刷视频数量:"), 10)        self.video_spin = QSpinBox()        self.video_spin.setRange(1999)        self.video_spin.setValue(10)        self.video_spin.setMinimumWidth(100)        control_layout.addWidget(self.video_spin, 11)        self.infinite_check = QCheckBox("无限循环")        self.infinite_check.stateChanged.connect(self.toggle_infinite)        control_layout.addWidget(self.infinite_check, 12)        # 控制按钮        self.connect_btn = QPushButton("🔌 连接设备")        self.connect_btn.clicked.connect(self.connect_device)        control_layout.addWidget(self.connect_btn, 20)        self.start_btn = QPushButton("▶️ 开始刷视频")        self.start_btn.setObjectName("startButton")        self.start_btn.clicked.connect(self.start_swiping)        self.start_btn.setEnabled(False)        control_layout.addWidget(self.start_btn, 21)        self.stop_btn = QPushButton("⏹️ 停止刷视频")        self.stop_btn.setObjectName("stopButton")        self.stop_btn.clicked.connect(self.stop_swiping)        self.stop_btn.setEnabled(False)        control_layout.addWidget(self.stop_btn, 22)        main_layout.addWidget(control_group)        self.progress_bar = QProgressBar()        self.progress_bar.setRange(0100)          self.progress_bar.setValue(0)        self.progress_bar.setFormat("未开始")          self.progress_bar.setAlignment(Qt.AlignmentFlag.AlignCenter)        main_layout.addWidget(self.progress_bar)        # 日志区域        log_group = QGroupBox("运行日志")        log_layout = QVBoxLayout(log_group)        self.log_text = QTextEdit()        self.log_text.setReadOnly(True)        self.log_text.setMinimumHeight(300)        log_layout.addWidget(self.log_text)        main_layout.addWidget(log_group)        # 初始化设备列表        self.refresh_devices()    def toggle_infinite(self, state):        """切换无限循环模式"""        self.video_spin.setEnabled(state != Qt.CheckState.Checked.value)    def refresh_devices(self):        """刷新设备列表"""        self.log_message("正在刷新设备列表...""INFO")        self.device_combo.clear()        if self.automation:            devices = self.automation.get_device_list()            if devices:                for udid, model in devices:                    self.device_combo.addItem(f"{model} ({udid})", udid)                self.log_message(f"找到 {len(devices)} 个可用设备""INFO")            else:                self.device_combo.addItem("未找到设备,请检查ADB连接")                self.log_message("未找到可用设备""WARNING")        else:            self.device_combo.addItem("自动化模块未初始化")            self.log_message("自动化模块未初始化""ERROR")    def connect_device(self):        """连接设备"""        if self.device_combo.count() == 0 or self.device_combo.currentData() is None:            QMessageBox.warning(self"警告""请选择有效的设备!")            return        self.log_message("开始连接设备...""INFO")        self.connect_btn.setEnabled(False)        # 创建并启动连接线程        device_udid = self.device_combo.currentData()        self.connect_thread = ConnectDeviceThread(self.automation, device_udid)        self.connect_thread.log_signal.connect(self.log_message)        self.connect_thread.finished_signal.connect(self.on_connect_finished)        self.connect_thread.start()    def on_connect_finished(self, success, driver):        """连接完成回调"""        if success:            self.bot = VideoSwipingBot(driver, log_callback=self.log_message)            self.log_message("设备连接成功,可以开始刷视频!""INFO")            self.start_btn.setEnabled(True)            self.connect_btn.setEnabled(True)  # 允许重新连接            # 连接成功后,根据当前设置更新进度条            if not self.infinite_check.isChecked():                loop_count = self.video_spin.value()                self.progress_bar.setRange(0, loop_count)                self.progress_bar.setFormat(f"已完成 %v/{loop_count} 个视频")            else:                self.progress_bar.setRange(00)                self.progress_bar.setFormat("无限循环模式 (0/∞)")        else:            self.log_message("设备连接失败,请检查Appium Server是否运行以及设备连接状态""ERROR")            self.connect_btn.setEnabled(True)        self.connect_thread = None    def start_swiping(self):        """开始刷视频"""        if not self.bot:            QMessageBox.warning(self"警告""请先连接设备!")            return        self.is_running = True        self.start_btn.setEnabled(False)        self.stop_btn.setEnabled(True)        self.connect_btn.setEnabled(False)        # 获取视频数量        loop_count = None if self.infinite_check.isChecked() else self.video_spin.value()        # 设置进度条        if loop_count:            self.progress_bar.setRange(0, loop_count)            self.progress_bar.setFormat(f"已完成 %v/{loop_count} 个视频")        else:            self.progress_bar.setRange(00            self.progress_bar.setFormat("正在刷第 %v 个视频 (无限循环)")        # 重置进度条值        self.progress_bar.setValue(0)        # 创建并启动刷视频线程        self.swiping_thread = VideoSwipingThread(self.bot, loop_count)        self.swiping_thread.log_signal.connect(self.log_message)        self.swiping_thread.progress_signal.connect(self.update_progress)        self.swiping_thread.finished_signal.connect(self.on_swiping_finished)        self.swiping_thread.start()        self.log_message("开始执行刷视频任务...""INFO")    def stop_swiping(self):        """停止刷视频"""        if self.bot:            self.bot.stop()        if self.swiping_thread and self.swiping_thread.isRunning():            self.swiping_thread.quit()            self.swiping_thread.wait(1000)  # 等待线程结束        self.is_running = False        self.stop_btn.setEnabled(False)        # 停止后,重置进度条显示        if not self.infinite_check.isChecked():            loop_count = self.video_spin.value()            self.progress_bar.setRange(0, loop_count)            self.progress_bar.setFormat(f"已完成 %v/{loop_count} 个视频 (已停止)")        else:            self.progress_bar.setRange(00)            self.progress_bar.setFormat("已停止")        self.log_message("已停止刷视频任务""INFO")    def update_progress(self, current, total):        """更新进度"""        if total > 0:            self.progress_bar.setValue(current)        else:            self.progress_bar.setFormat(f"正在刷第 {current} 个视频 (无限循环)")            self.progress_bar.setValue(current)    def on_swiping_finished(self):        """刷视频完成"""        self.is_running = False        self.start_btn.setEnabled(True)        self.stop_btn.setEnabled(False)        self.connect_btn.setEnabled(True)        # 完成后更新进度条显示        if not self.infinite_check.isChecked():            loop_count = self.video_spin.value()            self.progress_bar.setRange(0, loop_count)            self.progress_bar.setFormat(f"已完成 %v/{loop_count} 个视频 (已完成)")        else:            self.progress_bar.setRange(00)            self.progress_bar.setFormat("已完成")        self.log_message("刷视频任务已完成""INFO")    def log_message(self, message, level="INFO"):        """日志消息 - 确保在主线程中执行"""        # 直接调用append_log,避免使用可能未初始化的信号        log_msg = f"[{level}] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {message}"        QTimer.singleShot(0, lambda: self.append_log(log_msg, level))    def append_log(self, message, level):        """添加日志到文本框"""        # 设置日志颜色        color_map = {            "INFO""#2c3e50",            "ERROR""#e74c3c",            "WARNING""#f39c12",            "DEBUG""#7f8c8d"        }        color = color_map.get(level, "#2c3e50")        log_html = f'<span style="color: {color};">{message}</span><br>'        # 确保在主线程中更新UI        self.log_text.insertHtml(log_html)        self.log_text.moveCursor(QTextCursor.MoveOperation.End)    def closeEvent(self, event):        """关闭事件"""        if self.is_running:            self.stop_swiping()        # 等待线程结束        if self.connect_thread and self.connect_thread.isRunning():            self.connect_thread.wait(1000)        if self.swiping_thread and self.swiping_thread.isRunning():            self.swiping_thread.wait(1000)        event.accept()    def set_automation(self, automation):        """设置自动化模块(由外部调用)"""        self.automation = automation        self.refresh_devices()    def set_bot_class(self, bot_class):        """设置刷视频机器人(由外部调用)"""        self.bot_class = bot_class# 主程序入口if __name__ == "__main__":    app = QApplication(sys.argv)    window = AppiumVideoBotUI()    window.show()    sys.exit(app.exec())

      最终实现了自动化智能刷抖音,完美实现了之前既定的需求,效果请看下面视频….

      已关注

      关注

      重播 分享

      通过上面Python自动化脚本,仅用几分钟的时间就完成原需手动操作数小时的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!

      大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

      结语

      当Python遇见办公,牛马打工人终于笑出了猪叫声

      【职场人必看】每天早上一睁眼,想到又要面对:

      1.📊 堆积如山的Excel表格

      2.📑 机械重复的复制粘贴

      3.✍️ 永远改不完的各类文档

      4.诸如此类的更多……..

      是不是连Ctrl+Alt+Delete的心都有了?

      别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

      友情提示:考虑到没有python环境的朋友需要打包好的成品exe,摸鱼早已贴心打包好,本篇文章代码打包的exe截图如下:

      另外,《码海听潮》公众号所有文章码和exe程序已打包好上传绿联nas私有云,有需要的大佬扫一扫上面博主的个人微信二维码,需要的大佬需支付9.9元永久拥有公众号资源(写原创干货费时费力,属实不易),邀请您进入社区群获取下载链接!!,群内提供python办公自动化交流问题,解决问题,且码海听潮微信公众号文章发布会第一时间会更新到群里,非诚勿扰哈!

      码海听潮官方社区群如下:

      赶紧微信扫一扫下方二维码添加摸鱼君微信

      本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 《懒人硬核福音!Python+Appium实现抖音全智能自动刷视频,从此告别手动划划划~》

      评论 抢沙发

      7 + 3 =
      • 昵称 (必填)
      • 邮箱 (必填)
      • 网址
      ×
      订阅图标按钮