无水印解析抖音小视频

2020-11-10

抖音短视频的无水印下载,可能会帮助到需要视频素材的小伙伴。这里使用PHP完成无水印解析,源码仅供参考

前言

首先,我们应当先了解一下无水印解析的前提条件。这里,我们不考虑其他大佬二次开发的接口,从官方的角度,来实现无水印解析。当然,在这之前,可能众多大佬均都了解并且发表了相关思路。因此,此文章仅仅表示博主的思路进行解读。

话不多说,源码先奉上。

源码

<?php
function douyin($url){
    //设置移动端请求头
    $hdrs = array(
        'http' =>array('header' => "User-Agent: Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36\r\n"),
    );
    //设置请求头
    $context = stream_context_create($hdrs);
    //请求获取数据
    $lines=file($url);
    //获取响应的302链接,处理mid
    $id=$http_response_header[6];
    //匹配url中的数字,获取mid真实值
    $mid=preg_match('|(\d+)|',$id,$id_result);
    //请求抖音官方接口 依据mid值
    $json_id=file_get_contents("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=".$id_result[0]);
    //将请求的数据array化
    $arr_id = json_decode(mb_substr(mb_substr($json_id, strpos($json_id, '{')), 0, -1), true);
    //获取文字标题以及真实视频链接
    $name=$arr_id['item_list'][0]['author']['nickname'];
    $url_video=$arr_id['item_list'][0]['video']['play_addr']['url_list'];
    //取代获取真实无水印接口
    $url_video=str_replace("playwm","play",$url_video[0]);
    //移动模拟访问获取真实链接
    file_get_contents($url_video,0,$context);
    $url_video=$http_response_header[9];
    //进一步获取数据后,消除不需要的前缀
    $url_video=str_replace("location: ","",$url_video);
    //输出url数据
    //print(#url_video);
    //json格式输出
    $json_con=array('msg'=>'success','url'=>$url_video,'author'=>'https://github.com/blueweiwei');
    $json_con=json_encode($json_con,JSON_UNESCAPED_SLASHES);
    print($json_con);
}

//get请求内容,正着表达式处理,仿制
$a=preg_match('/(http|https):\/\/v.douyin.com\/+[a-zA-Z0-9]+\//i',$_GET['url'],$result);
// print_r($result) ;
if($a){
    douyin($result[0]);
}else{
    print('输入链接有误!');
}

讲解思路

对于程序实现过程,简单进行阐述

使用方法

此PHP程序采用get方式来传递参数,对于传递来的链接,进行正则表达式匹配。避免处理链接出现error

处理视频链接

接下来的操作,都是源于一个神秘的url

https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=

而想要获取到item_ids的值,需要在获取的分享链接302的中转url中。在PHP中,采用 $http_response_header 来获取302的链接。

将item_ids的链接补全访问,或发现获得了一个json格式的文件,这个文件正是该视频的详细信息。

image-20201110203841782

在图片的json文件中, play_addr 的 url_list 正是视频播放的源地址。

就等待我们获取到抖音原视频的地址时,我们就可以采用将参数 playwm => play 的形式,获取到无水印的源视频。

//有水印视频源地址
https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300fc30000bkc46gm0gekipjvdld8g&ratio=720p&line=0
//无水印视频源地址
https://aweme.snssdk.com/aweme/v1/play/?video_id=v0300fc30000bkc46gm0gekipjvdld8g&ratio=720p&line=0

到这里,对于找到的无水印视频地址,在PC端是空白页,只有当在移动端设备访问时,才可以出现真正的视频资源,进一步进行下载。因此,我们在PHP源码中使用了 stream_context_create 来设置 User-Agent 。

这样,我们就能得到真实的无水印地址了!

具体的操作实现,还需要进行一步一步的尝试。

结尾

对于视频的无水印解析,网络上有很多大牛的解析接口。尝试大佬们的接口,会很方便、很轻松的完成。然而,处于学习的目的,我们要知其然,知其所以然。简单的描述一下实现的过程,有利于初学者,更有利于自身的技能提高。