首页 > 其他分享 >分析document文档中script标签获取抖音无水印视频

分析document文档中script标签获取抖音无水印视频

时间:2023-03-21 12:35:25浏览次数:51  
标签:src script url 抖音 video result cookie document page

思路分析

  1. 使用 playwright 模拟浏览器打开分享链接
  2. 获取 播放页面 html 信息
  3. 解析 播放页面的 video标签,video标签的src属性就是视频的地址
    1. 这种模式会触发抖音的风控机制
  4. 解析页面 获取相关cookie
  5. 使用cookie请求页面文档
  6. 解析文档内容其中就有播放地址

playwright 入门使用介绍

简单使用如下。这种模式会触发抖音的风控机制,出现验证码中间页。

# 抖音分享链接
share_url = 'https://v.douyin.com/SGGxvfM/'

# 创建浏览器打开分享地址
# 因为可能会触发抖音的风控机制,所以这里先设置为有头模式,当触发验证码中间页时,手动处理下
browser = sync_playwright().start().chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto(share_url)

# 获取标签及视频播放地址
page.wait_for_load_state()
video = page.wait_for_selector('video')
print(video)
source = video.query_selector_all('source')
video_src = source[0].get_attribute("src")
video_src = 'https:' + video_src
print(video_src)

file_name = 'result.mp4'
print('开始下载视频...')
response = requests.get(video_src, stream=True)
with open(file_name, "wb") as file:
    file.write(response.content)

print('下载完成')

另辟出路

因为会触发中间验证页,虽然也可以使用 playwright 处理验证码,但是速度慢,同时验证方式更改就得更改总之不好。

背景信息

分享短链地址 :https://v.douyin.com/SGGxvfM/

重定向后的实际地址:https://www.douyin.com/video/7210719593298464003

流程:抖音的短链经过重定向后才会得到实际地址

中间过程就会拿到服务器写回的cookie信息

实际地址的请求是个document类型的内容,重点来了:document里的script标签的ID是RENDER_DATA,type是application/json,把标签里内容解码一下果然是我们想要的内容。

截图如下



处理逻辑

有了上面的背景信息,那处理逻辑也很简单了。

  1. 使用 playwright 进行打开分享地址
  2. 获取cookie信息
  3. 请求实际地址内容
  4. 获取script标签内容
  5. 解析script标签内容里json信息并获取相关字段
import json
import re

import requests
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
from urllib.parse import unquote

share_url = 'https://v.douyin.com/SGGxvfM/'


browser = sync_playwright().start().chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
page.goto(share_url)
cookies = page.context.cookies()
result_cookie = ''
for item in cookies:
    if item['name'] == '__ac_nonce':
        # document_header['__ac_nonce'] = item['value']
        result_cookie = result_cookie + '__ac_nonce=' + item['value'] + ';'
    if item['name'] == '__ac_signature':
        result_cookie = result_cookie + '__ac_signature=' + item['value'] + ';'

document_header = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-ch-ua-platform': 'macOS',
    'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
    'sec-ch-ua-mobile': '?0',
    'upgrade-insecure-requests': '1',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'cookie': result_cookie
}

# print(page.url)
url = page.url
# url = 'https://www.iesdouyin.com/share/video/7210719593298464003/?region=CN&mid=7210720503894805308&u_code=33j73e481hda&did=MS4wLjABAAAAyWxE53gU-qg10uh4jIbo0XpO2_I8z5fpPlI_pBAlio7gocacNdKp0p4KSAydSgC_&iid=MS4wLjABAAAALt7iss0DroHh-NMLV6ZFi-4uYP-lTU-NqsBOH3GQxng6bxW6xVoJ7AHXunv0YjHv&with_sec_did=1&titleType=title&from_ssr=1&timestamp=1678941771&utm_campaign=client_share&app=aweme&utm_medium=ios&tt_from=copy&utm_source=copy'
search_result = re.search('https://www.iesdouyin.com/share/video/(.+?)/', url)
video_id = search_result.group(1)
video_url = 'https://www.douyin.com/video/' + video_id + '?previous_page=app_code_link'
video_detail_response = requests.get(video_url, headers=document_header)

soup = BeautifulSoup(video_detail_response.text)
encode_data = soup.find('script', {'id': 'RENDER_DATA'}).get_text()
decode_data = unquote(encode_data)
decode_data = json.loads(decode_data)
video_url = decode_data['44']['aweme']['detail']['video']['playAddr'][0]['src']

video_src = 'https:' + video_url
print(video_src)

file_name = 'result.mp4'
print('开始下载视频...')
response = requests.get(video_src, stream=True)
with open(file_name, "wb") as file:
    file.write(response.content)

print('下载完成')

额外其他

另外包装了一个微信小程序,可以试用看看,个人带宽服务器流量有限谨慎使用。使用过程中有问题还请多多包涵反馈。

标签:src,script,url,抖音,video,result,cookie,document,page
From: https://www.cnblogs.com/lucky9322/p/17239563.html

相关文章

  • JavaScript Scope All In One
    JavaScriptScopeAllInOneGlobalScope/全局作用域ScriptScope/脚本作用域LocalScope/局部作用域(函数作用域)BlockScope/块级作用域({}作用域)C......
  • TypeScript
    1.什么是TypeScriptTypeScript是一种添加了类型系统的JavaScript,适用于任何规模的项目TypeScript是静态类型 2.安装、编译(1)使用typescript编译 np......
  • javascript 给Object扩展extend方法
    javascript给Object扩展extend方法mdj280759843于2011-04-1213:16:46发布1006收藏分类专栏:JS文章标签:JavaScriptjQueryUIprototype框架ViewUI版权JS专栏......
  • javascript 学习笔记
     JavaScript是区分大小写的,并使用Unicode字符集在JavaScript中,指令被称为语句(Statement),并用分号(;)进行分隔如果一条语句独占一行的话,那么分号是可以省略的。(译者......
  • 深入了解 JavaScript 内存泄漏
    作者:京东零售谢天在任何语言开发的过程中,对于内存的管理都非常重要,JavaScript也不例外。然而在前端浏览器中,用户一般不会在一个页面停留很久,即使有一点内存泄漏,重新加......
  • JavaScript 内置对象你了解多少?
    String字符串对象​字符串转换toStringvarage=20varage2=age.toString()//"20"字符串转换Stringvarage=20varage2=String(age)//"20"字符串分割splitva......
  • JavaScript获取图片的原始尺寸
    页面里的img元素,想要获取它的原始尺寸,以宽度为例可能首先想到的就是width,如下<imgsrc="http://img11.360buyimg.com/da/g14/M07/01/0E/rBEhVlNhh8wIAAAAAADmFBLo1twAAM2......
  • 三种javascript数组搜索的效率对比
    [b][color=red][size=x-large]结论:内置方法是最快的.[/size][/color][/b]//构造一个数组vararr=[];for(vari=0;i<=1000000;i++){arr.push('abcdefghigk'+i);}varv=......
  • TypeScript 学习笔记 — 类型兼容 (十)
    目录一.基本数据类型的兼容性二.接口兼容性三.函数的兼容性四.类的兼容性类的私有成员和受保护成员五.泛型的兼容性六.枚举的兼容性标称类型简短介绍TS是结构类型系统(str......
  • NX2212安装后Menuscript 定义语法错误解决方法
    NX2212系列安装后报错如下:NX2212安装后Menuscript定义语法错误,按钮‘PACK’缺少有效的操作。 可尝试找到所述文件D:\ProgramFiles\Siemens\NX2212\localizat......