/ 01 / Charles

用Charles来找视频的API接口,具体操作和之前当当网那个案例一样,不细说。

这里通过滑动抖音App,可以获取到视频的请求信息。



通过多次实验,发现链接的后面是会不停的改变,只有链接的前头始终不变,即「http://v1-dy <http://v1-dy>」「http://v6-dy
<http://v6-dy>」「http://v9-dy <http://v9-dy>」不变。

所以在写脚本的时候,可以以这些信息做为链接开头。

/ 02 / mitmproxy

利用mitmproxy中的mitmdump组件,对接Python脚本,用Python实现监听后的处理。



这里我只是利用脚本获取链接,并没有直接利用脚本下载视频。 因为我是在mitmdump.exe文件所在的文件夹运行脚本,脚本里导入不了requests模块。
不想搞那些烦人的环境变量,所以只获取链接。 然后再去下载视频,视频链接需要去重,可能会有重复的。

Python脚本如下。
def response(flow):   urls = ['http://v1-dy', 'http://v3-dy', 'http://v6-dy',
'http://v9-dy']   \# 对url进行筛选,只选取视频的url   for url in urls:       if url in
flow.request.url:           print('\n\n抖音视频\n\n')           with
open('douyin.csv', 'a+', encoding='utf-8-sig') as f:              
f.write(flow.request.url + '\n')
/ 03 / Appium

配置抖音的Appium参数。



点击蓝色按钮,手机自动启动抖音App!

接下来操作手机,然后点击Appium的刷新键,获取元素定位代码。

通过本次的实践发现Appium有时并不能很好的获取元素的定位,这可能就跟Web端的iframe页面一样。

所以针对找不到的元素,我直接对手机屏幕位置进行点击。

由于大家手机屏幕大小不同,这个参数肯定是会变化的,所以存在弊端,无法通用。

{ 左右滑动切换图片 }







大致操作如上图。UP主的主页图漏了,请自行脑补,Python代码如下。
import time import random from appium import webdriver from
selenium.webdriver.common.by import By from selenium.webdriver.support.ui
import WebDriverWait from appium.webdriver.common.touch_action import
TouchAction from selenium.webdriver.support import expected_conditions as EC ​
def main(): # 设置驱动配置   server = 'http://localhost:4723/wd/hub'   desired_caps =
{       'platformName': 'Android',       'deviceName': 'STF_AL00',      
'appPackage': 'com.ss.android.ugc.aweme',       'appActivity':
'.main.MainActivity', ​       # 关闭手机软键盘       'unicodeKeyboard': True,      
'resetKeyboard': True   }   driver = webdriver.Remote(server, desired_caps)  
wait = WebDriverWait(driver, 60)   # 同意用户隐私协议,点击   button_1 =
wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/q6')))   button_1.click()   # 禁止电话权限,点击   button_2
= wait.until(EC.presence_of_element_located((By.ID,
'com.android.packageinstaller:id/permission_deny_button')))   button_2.click()
  # 禁止位置权限,点击   button_3 = wait.until(EC.presence_of_element_located((By.ID,
'com.android.packageinstaller:id/permission_deny_button')))   button_3.click()
  time.sleep(2)   # 向上滑动,进入抖音视频播放页面   TouchAction(driver).press(x=515,
y=1200).move_to(x=515, y=1000).release().perform()   #
这里需要设置一个较长时间的延迟,因为抖音有引导操作和提示,需等待片刻   time.sleep(20)   # 点击抖音"喜欢"处,以此进入登录界面  
TouchAction(driver).press(x=950, y=800).release().perform()   # 点击密码登录 button_4
= wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/afg'))) button_4.click()   # 输入账号   button_5 =
wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/ab_')))   button_5.send_keys('你的账号')   # 输入密码  
button_6 = wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/aes')))   button_6.send_keys('你的密码')  
time.sleep(2)   # 因为会跳出软键盘,会遮挡登录按钮,需点击软键盘取消 TouchAction(driver).press(x=980,
y=1850).release().perform() time.sleep(2) ​   # 点击登录按钮 button_7 =
wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/abb'))) button_7.click() time.sleep(2) ​   #
登录成功,进入抖音视频界面,点击下方标题栏 "我" TouchAction(driver).press(x=990,
y=1850).release().perform()   # 进入个人主页,点击关注处 button_8 =
wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/a_7'))) button_8.click() ​   # 进入关注栏,点击第二个关注
button_9 = wait.until(EC.presence_of_element_located((By.XPATH, '  
/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.LinearLayout/android.support.v7.widget.RecyclerView/android.widget.RelativeLayout[2]/android.widget.RelativeLayout[1]')))
  button_9.click()   # 进入UP主主页,点击第一个视频 button_10 =
wait.until(EC.presence_of_element_located((By.ID,
'com.ss.android.ugc.aweme:id/aqm'))) button_10.click()   # 不断下滑页面,直到底部 while
True:       TouchAction(driver).press(x=515, y=1247).move_to(x=515,
y=1026).release().perform()       time.sleep(float(random.randint(5, 10))) ​ if
__name__ == '__main__':   main()
下载视频代码,需要对视频链接去重。
import pandas as pd import requests import os ​ num = 0 dom = [] folder_path =
"F:/video/" os.makedirs(folder_path) df = pd.read_csv('douyin.csv',
header=None, names=["url"]) ​ ​ # 对链接去重及去除刚进入抖音获取的视频链接 for i in df['url'][2:]:
  if i not in dom:       dom.append(i) ​ # 下载视频 for j in dom:   url = j   num
+= 1   response = requests.get(url, stream=True)   filename = str(num) + '.mp4'
  with open('F:\\video\\' + filename, 'ab+') as f:      
f.write(response.content)       f.flush()       print(filename + '下载完成')
最后成功获取小姐姐们的全部**视频**...



要是曾经在厂子里的我,那时会这骚操作该多好,哈哈。

其实我想的更多,多数妹子都挺喜欢拍抖音,不过她们应该不会下载这种操作滴。

那么小老弟们的机会就来了,下载下来喜欢的妹子的抖音视频。

然后剪辑出一个「最美瞬间」系列的视频,机会不就来了嘛...

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信