> 文档中心 > 解放双手,自动刷抖音

解放双手,自动刷抖音


起因

因为项目需要,最近在学习appium自动化,学习中很枯燥无味,想做点能激起兴趣的事情,正好平时喜欢刷抖音,想一想能不能解放双手自动刷抖音呢,有想法咱们就行动起来,搞、搞、搞

(ps:代码很简单,就是环境比较难搭建)

一、环境搭建:

1、我使用的环境:

①、Python3.7②、Node.js14.9.0③、JDK1.8④、Andriod SDK⑤、Appium1.9.1⑥、Appium-Python-Client

上面是我使用的环境,安装过程就不一一解释了,学习appium最大的难处在于环境的安装,80%的人死于环境安装,然后就没然后了,10%的人被环境折腾一周以上,只有剩下的10%人品好,可以顺利安装。小伙伴们一定不能在环境搭建上面放弃哦,加油,奥利给!

附上软件包下载地址:
链接:https://pan.baidu.com/s/1n7C6-3r5f68oJbBkDuX_jQ
提取码:82wi

二、启动APP

1、连接手机
手机设置开发者模式---->允许USB调试---->cmd中输入adb devices---->显示如下图表示连接成功:
解放双手,自动刷抖音

2、获取包名和Activity名:
①、打开需要用的app
②、在cmd中输入:adb shell dumpsys window w |findstr / |findstr name= 后如图展示:
解放双手,自动刷抖音
③、包名和Activity名为:com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.splash.SplashActivity

3、启动app参数

desired_caps = {}desired_caps['platformName'] = 'Android'   #你要测试的手机操作系统|`iOS`, `Android`, 或 `FirefoxOS`|desired_caps['platformVersion'] = '10'     #手机操作系统版本|例如: `7.1`, `4.4`|desired_caps['deviceName']='JTK5T19917008667'  #手机设备名称desired_caps['appPackage'] = 'com.ss.android.ugc.aweme'   #你想运行的Android应用的包名desired_caps['appActivity'] = 'com.ss.android.ugc.aweme.splash.SplashActivity'  #你要从你的应用包中启动的 Android Activity 名称desired_caps['automationname']='UiAutomator2'   #安卓7以上设备启动时必须加上此参数,定位toast提示时也必须加desired_caps['noReset']='True' #用来防止重复安装app

4、启动app:

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

5、为了方便后期维护,写成配置封装下:

①、获取配置文件代码:
配置文件名字可以是.cfg或者.ini结尾文件,如图:
在这里插入图片描述

#coding:utf-8import osfrom configparser import ConfigParser"""获取descaps.cfg配置文件里面数据"""class Dictionary(dict):    '''    把descaps.cfg中的参数添加值dict    '''    def __getattr__(self, keyname): #如果key值不存在则返回默认值"not find config keyname" return self.get(keyname, "descaps.cfg中没有找到对应的keyname")class Config(object):    '''    ConfigParser二次封装,在字典中获取value    '''    def __init__(self): # 设置descaps.cfg路径 current_dir = os.path.dirname(__file__) top_one_dir = os.path.dirname(current_dir) file_name = top_one_dir + "/data/descaps.cfg" # 实例化ConfigParser对象 self.config = ConfigParser() self.config.read(file_name) #根据section把key、value写入字典 #print(self.config.sections()) for section in self.config.sections():     setattr(self, section, Dictionary())     #print(self.config.items(section))     for keyname, value in self.config.items(section):  setattr(getattr(self, section), keyname, value)    def getconf(self, section): ''' 用法: conf = Config() info = conf.getconf("main").url ''' if section in self.config.sections():     pass else:     print("文件中 找不到该 section") return getattr(self, section)

②、启动APP封装代码:

#coding=utf-8from appium import webdriverfrom tools.configoperate import Configimport osclass BasicSetting(object):    def __init__(self,conf_section): """ 初始化启动appium参数配置 :param conf_section: descaps.cfg文件中的每个配置项的section值 :param platformname 使用哪个移动操作系统平台 :param devicename   使用的移动设备或模拟器的种类,需要在cmd命令下,敲adb devices查看 :param platformversion  移动操作系统版本 :param apppackage   所要测试的app的包名,获取命令:aapt dump badging apk路径,查看package :param appactivity  所要测试app的入口页面,获取命令:aapt dump badging apk路径,查看launchable-activity :param unicodekeyboard :param noreset     在此会话之前,请勿重置应用程序状态 """ conf = Config() info = conf.getconf(conf_section) self.automationname = info.automationname self.platformname = info.platformname self.devicename = os.popen('adb shell getprop ro.product.model').read() self.platformversion = os.popen('adb shell getprop ro.build.version.release').read() self.apppackage = info.apppackage self.appactivity = info.appactivity self.noreset = info.noreset    def start_parameter(self): desired_caps={     'automationName':self.automationname,     'platformName':self.platformname,     'deviceName':self.devicename,     'platformVersion':self.platformversion,     'appPackage':self.apppackage,     'appActivity':self.appactivity,     'noReset':self.noreset } #连接appium server,把启动参数发送 self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) try:     # 设置手机默认输入法为ADB keyboard     os.system('adb shell ime set com.android.adbkeyboard/.AdbIME') except Exception as e:     print(e)     print("手机可能未安装ADB keyboard输入法") return self.driver

上面我们讲了启动app需要哪些参数和条件,可能会因版本和手机不一样有一些出入,导致启动不了app,具体问题欢迎大家留言讨论

三、进入app,自动滑动页面

1、滑动页面:

①、appium官方给我提供的方式是:

swipe(self, start_x, start_y, end_x, end_y, duration=None)    从一个点滑动到另外一个点    start_x 是开始滑动的x坐标, start_y 是开始滑动的y坐标    end_x 是结束点x坐标,end_y是结束点y坐标    duration是持续时间,单位毫秒,可以不填,一般设置为500-1000之间

我们根据使用封装了下滑动的使用如下:

class SwipePlace(object):    """操作app上滑动、下滑、左滑、右滑"""    def __init__(self,driver): self.driver = driver    def get_size(self): """获取手机屏幕大小""" x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return (x,y)    def swipe_up(self,dt=500): """向上滑动""" screen = self.get_size() sx = screen[0] * 0.5 sy = screen[1] * 0.75 ex = screen[1] * 0.5 ey = screen[1] * 0.25 self.driver.swipe(sx, sy, ex, ey,dt)    def swipe_down(self,dt=50): """向下滑动""" screen = self.get_size() sx = screen[0] * 0.5 sy = screen[1] * 0.25 ex = screen[0] * 0.5 ey = screen[1] * 0.75 self.driver.swipe(sx, sy, ex, ey, dt)    def swipe_left(self,dt=50): """向左滑动""" screen = self.get_size() sx = screen[0] * 0.75 sy = screen[1] * 0.5 ex = screen[0] * 0.25 ey = screen[1] * 0.5 self.driver.swipe(sx, sy, ex, ey, dt)    def swipe_right(self,dt=50): """向右滑动""" screen = self.get_size() sx = screen[0] * 0.25 sy = screen[1] * 0.5 ex = screen[0] * 0.75 ey = screen[1] * 0.5 self.driver.swipe(sx, sy, ex, ey, dt)

3、自动滑动douyin app页面
上面讲了那么多,就是为了下面一个循环做准备,下面代码很简单,就是循环滑动页面,调用我们上面写的代码,如下:

#coding=utf-8from time import sleepfrom common.basicMessage import BasicSettingfrom tools.swipeplace import SwipePlacedriver = BasicSetting("douyin").start_parameter()swi = SwipePlace(driver)for i in range(1,10000):    swi.swipe_up()    sleep(10)driver.quit()

咱们就少循环点,保护眼镜最重要,哈哈哈,到此自动刷视频咱们就完成了,这次只做了简单的刷视频,一个视频的等待时间可以自己控制,后面有空继续优化下,下面我们看看效果,视频上传了B站,可能有点模糊。

视频地址.
https://www.bilibili.com/video/BV1o5411P7SS/