抖音無水印視頻解析思路

本文前半部分是分析過程,只看思路的爲節省時間建議直接拉到末尾。
本文寫於2020年9月8日,不保證此方法在之後的有效性。node

分析過程

首先從抖音客戶端找一個視頻,點擊分享-複製連接,粘貼一下發到電腦上,準備進行下一步,這裏已經準備好了一個從客戶端獲得的分享文本。android

據說集齊碎片能夠召喚神龍!#家鄉變成二次元 #充能計劃 #畫畫 #夏日打卡挑戰 https://v.douyin.com/Jj8eXXu/ 複製此連接,打開【抖音短視頻】,直接觀看視頻!git

把其中的連接粘貼到瀏覽器中訪問一下,獲得了這樣的界面:github

同時,地址欄中的連接變成了:web

https://www.iesdouyin.com/share/video/6855476646057643272/?region=CN&mid=6855476868364192519&u_code=1l1346c029b7&titleType=title&utm_source=copy_link&utm_campaign=client_share&utm_medium=android&app=awemeajax

可見其發生了重定向。npm

F12審查一下播放區域:json

發現這個時候播放區域只有一張背景圖片和一個播放按鈕,點擊一下播放試試:api

多了一個video標籤,其中的src屬性的值就是視頻的url,因此大膽猜想一下,這個播放地址多是經過ajax請求獲得的。瀏覽器

切換到Network面板,點擊xhr,再刷新一下頁面,果真有一個ajax請求,這個ajax請求帶有一個item_ids的參數,其值應該爲視頻的id,能夠在頁面重定向後的url中找到這個id:

響應結果是一個json字符串,複製到編輯器中格式化後以下:

{
    "extra": {
        "now": 1599467301000,
        "logid": "202009071628210101980651031208C5C1"
    },
    "status_code": 0,
    "item_list": [
        {
            "video_labels": null,
            "label_top_text": null,
            "long_video": null,
            "category": 103,
            "aweme_id": "6855476646057643272",
            "desc": "據說集齊碎片能夠召喚神龍!#家鄉變成二次元 #充能計劃 #畫畫 #夏日打卡挑戰",
            "video_text": null,
            "forward_id": "0",
            "mix_info": {
                "statis": {
                    "collect_vv": 0,
                    "current_episode": 35,
                    "updated_to_episode": 35,
                    "play_vv": 0
                },
                "desc": "原創不易,不喜勿噴~",
                "extra": "{\"first_reviewed\":1,\"is_quality_mix\":0,\"next_info\":{\"cover\":\"tos-cn-i-0813/57a48d47c61142748748802d08a75570\",\"desc\":\"原創不易,不喜勿噴~\",\"name\":\"家鄉變成二次元\"}}",
                "create_time": 1596724793,
                "mix_id": "6857880767423318030",
                "cover_url": {
                    "uri": "tos-cn-i-0813/57a48d47c61142748748802d08a75570",
                    "url_list": [
                        "https://p6-dy-ipv6.byteimg.com/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570?from=2563711402",
                        "https://p1-dy-ipv6.byteimg.com/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570?from=2563711402",
                        "https://p26-dy.byteimg.com/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570?from=2563711402"
                    ]
                },
                "status": {
                    "status": 2,
                    "is_collected": 0
                },
                "next_info": {
                    "mix_name": "家鄉變成二次元",
                    "desc": "原創不易,不喜勿噴~",
                    "cover_url": {
                        "uri": "tos-cn-i-0813/57a48d47c61142748748802d08a75570",
                        "url_list": [
                            "https://p1-dy.bytecdn.cn/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570",
                            "https://p3-dy.bytecdn.cn/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570",
                            "https://p9-dy.bytecdn.cn/obj/tos-cn-i-0813/57a48d47c61142748748802d08a75570"
                        ]
                    }
                },
                "mix_name": "家鄉變成二次元"
            },
            "music": {
                "status": 1,
                "id": 6855476868364193000,
                "mid": "6855476868364192519",
                "cover_hd": {
                    "url_list": [
                        "https://p26-dy.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p6-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p3-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ],
                    "uri": "317ca0000ef155aeac0be"
                },
                "cover_large": {
                    "url_list": [
                        "https://p26-dy.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p6-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p3-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ],
                    "uri": "317ca0000ef155aeac0be"
                },
                "play_url": {
                    "uri": "http://p9-dy.byteimg.com/obj/ies-music/6855476835380480781.mp3",
                    "url_list": [
                        "http://p9-dy.byteimg.com/obj/ies-music/6855476835380480781.mp3",
                        "http://p1-dy.byteimg.com/obj/ies-music/6855476835380480781.mp3"
                    ]
                },
                "duration": 135,
                "position": null,
                "title": "@不自由畫師團糰子創做的原聲",
                "author": "不自由畫師團糰子",
                "cover_medium": {
                    "uri": "317ca0000ef155aeac0be",
                    "url_list": [
                        "https://p29-dy.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p1-dy-ipv6.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p9-dy.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ]
                },
                "cover_thumb": {
                    "uri": "317ca0000ef155aeac0be",
                    "url_list": [
                        "https://p3-dy-ipv6.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p9-dy.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p29-dy.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ]
                }
            },
            "author_user_id": 71884871098,
            "share_info": {
                "share_weibo_desc": "#在抖音,記錄美好生活#據說集齊碎片能夠召喚神龍!#家鄉變成二次元 #充能計劃 #畫畫 #夏日打卡挑戰",
                "share_desc": "在抖音,記錄美好生活",
                "share_title": "據說集齊碎片能夠召喚神龍!#家鄉變成二次元 #充能計劃 #畫畫 #夏日打卡挑戰"
            },
            "promotions": null,
            "is_preview": 0,
            "group_id": 6855476646057643000,
            "video": {
                "origin_cover": {
                    "uri": "tos-cn-p-0015/ac5c4e77f7c441359a656c68c86926e4_1596165086",
                    "url_list": [
                        "https://p3-dy-ipv6.byteimg.com/tos-cn-p-0015/ac5c4e77f7c441359a656c68c86926e4_1596165086~tplv-dy-360p.jpeg?from=2563711402",
                        "https://p6-dy-ipv6.byteimg.com/tos-cn-p-0015/ac5c4e77f7c441359a656c68c86926e4_1596165086~tplv-dy-360p.jpeg?from=2563711402",
                        "https://p26-dy.byteimg.com/tos-cn-p-0015/ac5c4e77f7c441359a656c68c86926e4_1596165086~tplv-dy-360p.jpeg?from=2563711402"
                    ]
                },
                "ratio": "540p",
                "has_watermark": true,
                "bit_rate": null,
                "duration": 135302,
                "is_long_video": 1,
                "width": 720,
                "cover": {
                    "uri": "tos-cn-p-0015/b98b9cb496be4379bcb8e283f38f1c9e",
                    "url_list": [
                        "https://p6-dy-ipv6.byteimg.com/img/tos-cn-p-0015/b98b9cb496be4379bcb8e283f38f1c9e~c5_300x400.jpeg?from=2563711402_large",
                        "https://p3-dy-ipv6.byteimg.com/img/tos-cn-p-0015/b98b9cb496be4379bcb8e283f38f1c9e~c5_300x400.jpeg?from=2563711402_large",
                        "https://p9-dy.byteimg.com/img/tos-cn-p-0015/b98b9cb496be4379bcb8e283f38f1c9e~c5_300x400.jpeg?from=2563711402_large"
                    ]
                },
                "height": 1280,
                "dynamic_cover": {
                    "url_list": [
                        "https://p3-dy-ipv6.byteimg.com/obj/tos-cn-p-0015/11e5f3dcb62749a6848a14c01c556f66_1596165086?from=2563711402_large",
                        "https://p29-dy.byteimg.com/obj/tos-cn-p-0015/11e5f3dcb62749a6848a14c01c556f66_1596165086?from=2563711402_large",
                        "https://p9-dy.byteimg.com/obj/tos-cn-p-0015/11e5f3dcb62749a6848a14c01c556f66_1596165086?from=2563711402_large"
                    ],
                    "uri": "tos-cn-p-0015/11e5f3dcb62749a6848a14c01c556f66_1596165086"
                },
                "vid": "v0200fda0000bshokcp94bbr1103bot0",
                "play_addr": {
                    "uri": "v0200fda0000bshokcp94bbr1103bot0",
                    "url_list": [
                        "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fda0000bshokcp94bbr1103bot0&ratio=720p&line=0"
                    ]
                }
            },
            "share_url": "https://www.iesdouyin.com/share/video/6855476646057643272/?region=&mid=6855476868364192519&u_code=48&titleType=title",
            "aweme_type": 4,
            "image_infos": null,
            "geofencing": null,
            "is_live_replay": false,
            "create_time": 1596165084,
            "duration": 135302,
            "comment_list": null,
            "cha_list": [
                {
                    "is_commerce": false,
                    "cid": "1670532508858382",
                    "desc": "",
                    "connect_music": null,
                    "view_count": 0,
                    "hash_tag_profile": "",
                    "cha_name": "家鄉變成二次元",
                    "user_count": 0,
                    "type": 1
                }
            ],
            "risk_infos": {
                "warn": false,
                "type": 0,
                "content": ""
            },
            "text_extra": [
                {
                    "hashtag_id": 1670532508858382,
                    "start": 13,
                    "end": 21,
                    "type": 1,
                    "hashtag_name": "家鄉變成二次元"
                },
                {
                    "start": 22,
                    "end": 27,
                    "type": 1,
                    "hashtag_name": "充能計劃",
                    "hashtag_id": 1655868948754440
                },
                {
                    "start": 28,
                    "end": 31,
                    "type": 1,
                    "hashtag_name": "畫畫",
                    "hashtag_id": 1553508302124033
                },
                {
                    "start": 32,
                    "end": 39,
                    "type": 1,
                    "hashtag_name": "夏日打卡挑戰",
                    "hashtag_id": 1673117213997070
                }
            ],
            "author": {
                "policy_version": null,
                "uid": "71884871098",
                "short_id": "612124342",
                "signature": "沉迷二次元沒法自拔的小姐姐(老阿姨)\n面對骨感的現實,依然滿懷但願的走在實現夢想的路上\n————漸行漸遠……(畫風愈來愈不對了…)",
                "avatar_thumb": {
                    "uri": "317ca0000ef155aeac0be",
                    "url_list": [
                        "https://p3-dy-ipv6.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p9-dy.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p29-dy.byteimg.com/aweme/100x100/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ]
                },
                "unique_id": "",
                "platform_sync_info": null,
                "nickname": "不自由畫師團糰子",
                "avatar_larger": {
                    "uri": "317ca0000ef155aeac0be",
                    "url_list": [
                        "https://p1-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p9-dy.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p6-dy-ipv6.byteimg.com/aweme/1080x1080/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ]
                },
                "avatar_medium": {
                    "uri": "317ca0000ef155aeac0be",
                    "url_list": [
                        "https://p6-dy-ipv6.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p29-dy.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038",
                        "https://p3-dy-ipv6.byteimg.com/aweme/720x720/317ca0000ef155aeac0be.jpeg?from=4010531038"
                    ]
                },
                "followers_detail": null,
                "geofencing": null,
                "type_label": null
            },
            "statistics": {
                "aweme_id": "6855476646057643272",
                "comment_count": 6598,
                "digg_count": 74803,
                "play_count": 0
            }
        }
    ],
    "ab_type": 1
}

信息仍是蠻豐富的,做者信息、視頻信息、音樂信息、封面信息等包羅萬象,視頻的地址是在item_list下video.play_addr.url_list中,複製下這個地址用瀏覽器訪問一下果真獲得了視頻:

不過這個視頻仍是帶水印的,如何得到沒有水印的視頻呢,來看看從json字符串中獲得的視頻地址:

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fda0000bshokcp94bbr1103bot0&ratio=720p&line=0

覺不以爲這個playwm中的wm是water mask的簡寫呢,把wm刪掉再訪問一下試試。即:

https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fda0000bshokcp94bbr1103bot0&ratio=720p&line=0

結果一片空白,是否是這樣行不通呢,不該該啊,否則直接寫play多好,何須又搞個playwm呢,必定是訪問姿式有問題,點擊左上角的設備切換按鈕切換到移動端訪問一下,哇,amazing,居然真的訪問到了!

同時能夠看到本來左上角的抖音水印消失了。成功!

思路總結

  1. 訪問客戶端分享文本中的連接,從重定向後的url中提取視頻id,https://www.iesdouyin.com/share/video/後的數字就是視頻id。
  2. 訪問https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=視頻id獲取有關該視頻的json字符串。
  3. 從獲得的json字符串中提取視頻播放地址,在item_list下video.play_addr.url_list中。
  4. 將視頻地址中的playwm替換爲play。
  5. 使用移動端的user-agent訪問替換後的視頻地址便可獲得無抖音水印的視頻。

我的已使用node.js寫了一個抖音無水印視頻的解析庫,併發布在了npm和github上,詳情請訪問:

npm:https://www.npmjs.com/package/douyin_video

github:https://github.com/xyz-studio/Douyin_Video

相關文章
相關標籤/搜索