Fiddler+Appium+Pycharm无限随机下载抖音视频

本教程是在Win7上操作的。
第一部分: 讲各个软件的安装。Fiddler很简单,不提。Pycharm的安装比较早,印象中安装不麻烦,但是破解麻烦,不提。在此详述Appium的安装:
首先要安装必备的软件。由appium-doctor可以知道一部分(当然在appium安装完毕之前,无法在cmd中输入appium-doctor),由下图可知,至少需要安装Android SDK,jdk:appium-doctor截图
其次要安装Appium本身。
再次,若想使用Appium的高级功能,则必然要编程,在Appium中编程可以用Python,也可以用Java,也可以用Ruby,装一个即可,我选择的是Python(编译器选择:PyCharm)。
最后, PyCharm中使用Appium,必须安装Appium-python-client。
接下来,按软件一条条详述:

  1. 安装了nodejs,发现node.js会自动注册下面两个path:System System Path: C:\Program Files\node.js
    User System Path: C:\Users<username>\AppData\Roaming\npm。

  2. 安装android,由于Android Studio过于庞大,所以仅下载Android SDK即可。Android SDK安装下载不难,但是安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。由于Android Studio过于庞大,所以仅下载Android SDK即可。Android SDK安装下载不难,但是安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。
    Android SDK Manager安装Android SDK时的坑:
    一定要更改SDK Path!我就安装错路径了。
    下载并安装了Intel x86 Emulator Accelerator(HAXM installer)(D:software/haxm-windows_v7_3_2.zip),但AVD Manager中仍然显示Not Compatible with Windows.至于这有没有关系,目前还不知道,因为没有用过。
    Android SDK安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。

  3. Java安装(jdk)。注意jdk安装时会两次要求填写安装路径,一次是jdk的,另一次是jre的:jdk安装JAVA_HOME和path环境变量:
    JAVA_HOME:C:\Program Files (x86)\Java\jdk-9.0.1
    Path:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
    其中%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 的意思:
    设置Java环境变量。%JAVA_HOME%代表的是自定义的JAVA_HOME变量值。前者代表JDK所在目录,后者代表JRE命令目录。
    Java安装的坑:
    使用的Java版本是jdk-9.0.1。但是发现没有lib\dt.jar和lib\tools.jar。查询发现新版本就是没有,因此不需要配置CLASSPATH环境变量。因此只设置了JAVA_HOME和path环境变量:
    JAVA_HOME:C:\Program Files (x86)\Java\jdk-9.0.1
    Path:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

  4. 可以安装Appium_desktop,也可以安装Appium_Server,二者功能相同而后者长期不更新,所以只下载appium_desktop即可。

  5. 若想使用Appium的高级功能,则必然要编程,在Appium中编程可以用Python,也可以用Java,也可以用Ruby(使用较少)。如果用java开发,需要安装编译器(例如IntelliJ IDEA),还要安装一个特殊的玩意–Maven,据说这货是管理第三方库的。用python的话要简单一些,因为编译器(例如Pycharm)我已经安装了,而且不需要什么第三方库管理器。所以我选择PyCharm。

  6. PyCharm中使用Appium,必须安装Appium-python-client。如果没有Appium-python-client,则PyCharm无法调用Appium的相关API:Pycharm中使用appium的API
    不安装Appium-python-client的话会报错
    PyCharm中安装appium
    pip安装Appium-python-client(注:appium像是一个服务,而appium-python-client是让python连接appium服务的一个驱动,也就是一个python语言封装和appium api通讯的一个库(python,java,js等):pip安装Appium-python-client
    pycharm中找不到appium,需要在File-Settings安装:
    pycharm2


第二部分: 讲各个软件的使用。
1.Fiddler的使用方法:
首先配置手机,将4G网络设置成代理:需要注意的是长按,对于我来说,就是长按名字是“4G”的那个网络,并修改网络,设置如图片中所示。将ip地址配置成跟电脑一样的:
4g1
4g2
4g3
在手机浏览器中输入如下ip,并且点击"FiddlerRoot certificate"进行安装,我的荣耀4x在点击后几秒就显示安装完毕,但是页面没有变化,我开始还以为没装好,实际操作时发现已经装好。
在这里插入图片描述
手机配置好之后,电脑上的Fiddler软件也要做一些设置,网上有很多教程,在此不详述。开始抓包,如此教程所说(https://www.cnblogs.com/stevenshushu/p/9635097.html),将其中的代码插入Fiddler Script Editor,插入之后保存即可,不需要编译等就可以直接使用(我将他的代码中url保存的路径与名字修改了):
Fiddler
果真得到了不少URL:
url
2.Appium_Desktop的使用方法:
首先双击紫色图标:Appium_Desktop的使用方法
其次,不要更改默认设置,直接点击Start Server v1.10.0:
appium Start Server
最后,成功打开抖音的配置(注意,由于我只连接了一台真机,且没有开虚拟机,所以deviceName可以随便写):
在这里插入图片描述
2.1 Appium确定坐标:
本来打算用Android SDK带的UIAutomaterViewer,但是打不开,网上说是Java版本不对。因此使用Appium-Desktop。用它打开New Session后,可以看到如下界面:
一
如果界面的内容跟手机上的不一样,则点击刷新按钮,即可跟手机一致:一
如果想查看某部分的位置,就点击:
二
并在界面上的定位,然后在右边找到bounds,它显示的是左上角和右下角的坐标。

Appium使用中的坑:
连接真机时,出现adb devices的问题:
appium坑一
解决方法: 添加了ANDROID_SDK_HOME这个环境变量,path中也添加了。并且拔下USB,重插之后,输入adb devices时,手机界面上会显示“是否允许调试”之类,确定之后,解决上面 unauthorized的问题。
grep不是内部命令也不是外部命令的问题:
grep问题
解决方法:加双引号
grep问题
Appium寻找appPackage和appActivity的问题:
寻找这两个量有多种方法:
https://blog.csdn.net/mtbaby/article/details/78676477
但是各个方法找到的值可以不一样,至于哪个是正确的,现在没有好的判断方法,只能自己去试验。
比如,方法一得到的结果:
方法一
方法三得到的结果(如果你安装了Appium,进入设置页,选择APK 路径,下面就会显示包名和Activity名称.appPackage即图片中的Package,而appActivity即图片中的Launch Activity.):
方法3
方法五得到的结果:
方法五
最后实践发现,方法一是对的,方法三和五是错的:
方法一是对的
从上图可以看出,如果Appium仅仅连接了一台机器(包括虚拟机在内),则deviceName可以随便写。
Appium报的错误:
错误一
网上说要加noReset,加上了,运行时间确实长了点,但还是报错:
noReset
Error2
解决方法:应该是appActivity后面多写了一个空格。


第三部分: 实战-获取URL并下载。
首先,使用Fiddler获取url,在此教程代码的基础上做了修改(https://www.cnblogs.com/stevenshushu/p/9635097.html):

from appium import webdriver
from time import sleep

##以下代码可以操控手机app
class Action():
    def __init__(self):
        # 初始化配置,设置Desired Capabilities参数
        self.desired_caps = {
            "platformName": "Android",
            "deviceName": "Mi_Note_3",
            "appPackage": "com.ss.android.ugc.aweme",
            "appActivity": ".main.MainActivity"
        }
        # 指定Appium Server
        self.server = 'http://localhost:4723/wd/hub'
        # 新建一个Session
        self.driver = webdriver.Remote(self.server, self.desired_caps)
        # 设置滑动初始坐标和滑动距离
        #self.start_x = 500
        #self.start_y = 1500
        #self.distance = 1300
        self.start_x = 500
        self.start_y = 900
        self.end_x = 500
        self.end_y = 300
        #self.distance = 600

    def comments(self):
        #sleep(3)
        sleep(30)
        # app开启之后点击一次屏幕,确保页面的展示
        #self.driver.tap([(500, 1200)], 500)
        self.driver.tap([(360, 648)], 500)
    def scroll(self):
        # 无限滑动
        while True:
            # 模拟滑动
            #self.driver.swipe(self.start_x, self.start_y, self.start_x, self.start_y - self.distance)
            self.driver.swipe(self.start_x, self.start_y,self.end_x,self.end_y)
            # 设置延时等待
            sleep(1)
    def main(self):
        self.comments()
        self.scroll()

if __name__ == '__main__':
    action = Action()
    action.main()

果真获得了很多URL:
url2
然后使用如下代码,分析URL并下载视频(https://www.cnblogs.com/stevenshushu/p/9635097.html).注意代码中做了一处修改: #############修改了原作者的代码: “% %” 改成了"%%"###############. 此程序会无限运行:

# _*_ coding: utf-8 _*_
import requests
import sys
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36" }

##去重方法
def distinct_data():
    ##读取txt中文档的url列表
    datalist_blank=[]
    pathtxt='D:/douyin.txt'
    with open(pathtxt) as f:
        f_data_list=f.readlines()#d得到的是一个list类型
        for a in f_data_list:
            datalist_blank.append(a.strip())#去掉\n strip去掉头尾默认空格或换行符
    # print(datalist)
    data_dict={}
    for data in datalist_blank:
        #print(type(data),data,'\n')
        #print(data.split('/'),'\n',data.split('/').index('m'),'\n')
        #url中以/为切分,在以m为切分   ##把m后面的值放进字典key的位置,利用字典特性去重
        if int(data.split('/').index('m'))==4 :#此处为v6开头的url
            #print(data,44,data.split('/')[5])
            data_key1=data.split("/")[5]
            data_dict[data_key1]=data
        elif int(data.split('/').index('m'))==6: #此处为v1或者v3或者v9开头的url
            #print(data,66,data.split('/')[7],type(data.split('/')[7]))
            data_key2=data.split("/")[7]
            data_dict[data_key2] =data
    #print(len(data_dict),data_dict)
    data_new=[]
    for x,y in data_dict.items():
        data_new.append(y)
    return data_new

def responsedouyin():
    data_url=distinct_data()
    # 使用request获取视频url的内容
    # stream=True作用是推迟下载响应体直到访问Response.content属性
    # 将视频写入文件夹
    num = 1
    for url in data_url:
        res = requests.get(url,stream=True,headers=headers)
        #res = requests.get(url=url, stream=True, headers=headers)
        #定义视频存放的路径
        pathinfo = 'D:/douyin-video/%d.mp4' % num  #%d 用于整数输出   %s用于字符串输出
        # 实现下载进度条显示,这一步需要得到总视频大小
        total_size = int(res.headers['Content-Length'])
        #print('这是视频的总大小:',total_size)
        #设置流的起始值为0
        temp_size = 0
        if res.status_code == 200:
            with open(pathinfo, 'wb') as file:
                #file.write(res.content)
                #print(pathinfo + '下载完成啦啦啦啦啦')
                num += 1
                #当流下载时,下面是优先推荐的获取内容方式,iter_content()函数就是得到文件的内容,指定chunk_size=1024,大小可以自己设置哟,设置的意思就是下载一点流写一点流到磁盘中
                for chunk in res.iter_content(chunk_size=1024):
                    if chunk:
                        temp_size += len(chunk)
                        file.write(chunk)
                        file.flush() #刷新缓存
                #############下载进度条部分start###############
                        done = int(50 * temp_size / total_size)
                        #print('百分比:',done)
                #############修改了原作者的代码: "% %" 改成了"%%"###############
                        sys.stdout.write("\r[%s%s] %d %%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size)+" 下载信息:"+pathinfo + "下载完成啦啦啦啦啦")
                        sys.stdout.flush()#刷新缓存
                #############下载进度条部分end###############
                print('\n')#每一条打印在屏幕上换行输出


if __name__ == '__main__':
    responsedouyin()

Pycharm中的那些坑:
在运行Fiddler自动获取url的程序时报错,我怀疑跟下面有关系:
坑一
网上说很可能是VPN导致的,因此退出了我的VPN。
报错:adb.exe已停止工作,因此关闭了appium,fiddler等,又重启了appium,fiddler,用appium连接华为,结果出了这个问题:
坑三
查询发现好像是adb devices有问题,结果一查果然是unauthorized的状态,于是拔掉usb线,然后再插上,提醒是否要usb调试,确定之后,appium就可以连接了。

猜你喜欢

转载自blog.csdn.net/galilajiao2006/article/details/85842813