解放双手,自动刷抖音
起因
因为项目需要,最近在学习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/