网上这类工具很多,但是我还是想自己实现一下。

研究了一下,主要流程如下:

  1. 访问地址:https://v.douyin.com/J8cHNas/,他帮我们自动跳转到一个页面。
  2. 不用管页面如何,我们可以直接打开f12看到请求,稍微看一下,会发现所有的视频信息(包含视频路径、名称、作者等等)都存储在这个请求中:https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6841990853624433920&dytk=
  3. 直接从接口获取到video的链接:https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f4f0000brpq51lahtm68p8nvh6g&ratio=720p&line=0
  4. 把链接中的playwm替换成play(去掉wm就行),就可以获得无水印的地址了,如:https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200f4f0000brpq51lahtm68p8nvh6g&ratio=720p&line=0
  5. 注:无水印的视频,只能在移动端播放,所以我们需要在user-agent中模拟手机端的操作。
  6. 至于如何得出去掉wm就可以无水印的结论,有经验的可以尝试看抖音时抓包,可以得到他的视频链接,简单对比就可以得出结论了。

代码如下:

import requests
import re
import json
#获取抖音地址
url=input("请输入抖音地址\n")
userAgent = "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"
header = {
    "Referer": "https://v.douyin.com/",
    'User-Agent': userAgent,
}
#获取到视频id
r = requests.get(url,headers = header)
url=r.url
id=url.split("video/")[1].split("/?")[0]
#获取到有水印视频地址
url="https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids="+id
r = requests.get(url,headers = header)
#获取到无水印视频地址
video=json.loads(r.content)["item_list"][0]
url=video["video"]["play_addr"]["url_list"][0]
url=url.replace("playwm","play")
#开始下载
r = requests.get(url,headers = header)
with open(video["desc"]+".mp4", "wb") as code:
     code.write(r.content)
     print("下载成功")
input("按下回车退出程序")

比较简单,其实看懂了逻辑非常好实现。

但,如果是实用党,也可以直接下载成品:


一个爱搞事情的前端,一个爱玩技术的程序员