首页 踩坑记录 🎯

分享一下抖音最新无水印视频真实链接获取过程和PHP接口制作

前言

准备链接

链接:https://v.douyin.com/JNE8dJB/

访问链接

访问链接后会跳转到一个 船新 的地址
https://www.iesdouyin.com/share/video/6548694333237759240/?

审查元素

按下 F12 或者 右击网页选择审查元素 然后刷新页面
NewWork 里会对这个页面进行抓包
U1GI5n.md.png

分析数据包

分析一下 NetWork 抓取的数据包
U1GI5n.md.png

红框部分数据包请求的文件均为 img(图片) 可以直接略过
剩下三个数据包分别为document、script、xhr

  • document:原先访问短网址会跳转到一个全新的网址 这个数据包即为这个网页的网页源代码
  • script:这是一个JavaScript文件
  • xhr:这是一个xhr请求

分析xhr请求返回数据

点击这个xhr请求 康康返回了什么数据

U1JqJI.md.png

返回了json数据 展开里面的数据 分析一下

U1YpwQ.md.png

找到一条可访问的视频地址 copy这条链接

研究地址

访问这条链接后会重定向到一个新的地址 会播放一个带水印的地址

尝试修改地址

原地址:https://aweme.snssdk.com/aweme/v1/playwm/?video_id=8fad853e0e6c48be87e0c991d51a4220&ratio=720p&line=0
尝试把playwm修改为play
新地址:https://aweme.snssdk.com/aweme/v1/play/?video_id=8fad853e0e6c48be87e0c991d51a4220&ratio=720p&line=0

访问这个新地址后一片空白 emmmmmmmmm 如果没报404的话说明还是有机会的
我尝试刷新下还是一片空白
我默默打开了 代码审计 还是一片空白
emmmmmmmmmm 切换下模拟移动设备访问 页面跳转到一个新的地址 这个地址竟然是无水印视频的地址

U1YXN9.md.png

原来设置了移动设备的 User-Agent 就会跳转到无水印地址
所以在原页面的xhr请求才是关键 分析一下链接
链接:https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6548694333237759240
这个链接是一个GET请求 是对https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/
传递 item_ids 参数 参数值应该就是这个视频的ID
等等 一开始访问的网页重定向后得到的链接里不就有这个ID
重定向后的链接:https://www.iesdouyin.com/share/video/6548694333237759240/
这段地址里面不就包含了这个ID 搜嘎斯内
我尝试在这个网页源代码里查找这个作品的ID
U1NMxx.png
竟然没有 emmmmmmmm 可能这个网页有他的想法
不过刚刚的抓包里是有一个script的数据包 可以分析一下
在js代码里搜索刚刚那个xhr请求的参数名 item_ids
U1NLWR.md.png
阿西 我貌似发现了什么 这是一段get请求 原来如此
所以我们可以照着这个改写一份js代码出来

模拟请求一下并在控制台打印出json数据

$.get("/web/api/v2/aweme/iteminfo/", {
    item_ids: "6548694333237759240"
}, function (json) {
    console.log(json)
});

在控制台运行一下
U1U0h9.md.png
Nice 成功请求数据并打印出json数据

优化代码

$.get("/web/api/v2/aweme/iteminfo/", {
    item_ids: "6548694333237759240"
}, function(json) {
    var url = json.item_list[0].video.play_addr.url_list[0]
    url = url.replace("/playwm/","/play/")
    console.log(url)
});

在控制台运行一下 成功打印出无水印地址
U1abx1.md.png

修改代码

$.get("/web/api/v2/aweme/iteminfo/", {
    item_ids: "6548694333237759240"
}, function(json) {
    var url = json.item_list[0].video.play_addr.url_list[0]
    url = url.replace("/playwm/","/play/")
    location.href = url
});

模拟移动设备环境下在控制台运行一下这段代码 切记一定要模拟移动设备的环境下 要不然会一片空白
U1dMzn.md.png
Nice 成功跳转到无水印的下载地址 @(qqguzhang)

继续优化

原代码的item_ids是固定的 如果要在其他视频页面运行还是会跑到我这个视频过来 所以需要优化一下
所以修改为 location.href.split(“/“)[5]
这段代码可以先获取地址然后以“/”分割后会返回7个数组 第5个为这个视频的ID

$.get("/web/api/v2/aweme/iteminfo/", {
    item_ids: location.href.split("/")[5]
}, function(json) {
    var url = json.item_list[0].video.play_addr.url_list[0]
    url = url.replace("/playwm/","/play/")
    location.href = url
});

在模拟移动设备的环境下打开控制台并运行上述代码 成功跳转 @(qqdoge)
U1wSmV.md.png

PHP接口开发

整理思路

js代码研究完就尝试用PHP写一个接口 先重新理一下思路 解析需要哪些步骤

  1. 先访问短链得到长链
  2. 获取长链里的作品ID 再将作品ID请求到 /web/api/v2/aweme/iteminfo/ 接口并得到返回的数据
  3. 在返回的数据中找到视频链接
  4. 将视频链接里的 playwm 修改成 play
  5. 以移动端访问这个新链接即可得到无水印视频的地址

开始编写

<?
    $url = 'http://v.douyin.com/JNE8dJB/';
    $location = get_headers($url, 1)["location"];
    $videoid = explode('/', $location)[5];
    $json = json_decode(file_get_contents("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=".$videoid),true);
    $videourl = $json["item_list"][0]["video"]["play_addr"]["url_list"][0];
    $videourl = str_replace("/playwm/", "/play/", $videourl);
    $videourl = get_headers($videourl, 1)["location"];
    echo $videourl;
?>

经过测试 这段代码确实可以获取视频的无水印地址
现在改写这段代码 将这段代码改写成api接口

<?
    if (empty($_GET["url"])) {
        exit(json_encode(array("status"=>"-1","msg"=>"请传入抖音URL链接!")));
    } else {
        $url = 'http://v.douyin.com/JNE8dJB/';
        $location = get_headers($url, 1)["location"];
        $videoid = explode('/', $location)[5];
        if (!empty($videoid)) {
            $json = json_decode(file_get_contents("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=".$videoid), true);
            $videourl = $json["item_list"][0]["video"]["play_addr"]["url_list"][0];
            if (!empty($videourl)) {
                $videourl = str_replace("/playwm/", "/play/", $videourl);
                $videourl = get_headers($videourl, 1)["location"];
                if (!empty($videourl)) {
                    exit(json_encode(array("status"=>"1","msg"=>"success","video"=>$videourl)));
                } else {
                    exit(json_encode(array("status"=>"-1","msg"=>"解析失败,请检查链接!")));
                }
            } else {
                exit(json_encode(array("status"=>"-1","msg"=>"解析失败,请检查链接!")));
            }
        } else {
            exit(json_encode(array("status"=>"-1","msg"=>"链接有误,请检查链接!")));
        }
    }
?>

这就完工了 本方法不一定能一直适用 如果代码失效即为抖音更换接口 码字不易还望支持 本文仅供学习参考 请勿用于商业用途



文章评论

    Aaron 访客 LV 1 Windows Chrome
    2021-02-10 回复

    magnificent post, very informative. I wonder why the opposite specialists of this sector don't notice this.
    You must proceed your writing. I'm confident, you've a huge readers' base already!

      阿轩 作者 Mac Browser
      2021-02-17

      @Aaron:Thanks.

未显示?请点击刷新