吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 25688|回复: 202
上一主题 下一主题
收起左侧

[Python 原创] 首发,批量下载抖音单用户所有无水印视频

     关闭 [复制链接]
跳转到指定楼层
楼主
Quincy_007 发表于 2021-4-30 22:23 回帖奖励
本帖最后由 Quincy_007 于 2021-5-1 00:02 编辑

####首先声明该方法仅供个人学习交流使用,严禁非法获利。
####
之前发过一次原创下载抖音单视频无水印的帖子,【原创源码】【python】下载抖音无水印视频, 这次分享一个批量下载抖音单用户所有无水印视频的方法,希望和大家多多交流互相学习!
####
首先在抖音上随机挑选一个小姐姐,今天就是Fairy.了


0x01 获取用户主页分享链接:
用户主页右上角点开,获取分享链接

得到类似分享链接:在抖音,记录美好生活! https://v.douyin.com/eSN7g1c/

0x02 运行程序,批量下载该用户无水印视频:
1.获取用户抖音昵称,并创建同名文件夹存放视频

2.校验用户所有时间段是否发布过视频,校验数量为0则跳过,不为0则进行下载

3.下载并保存,数量和用户主页视频数量一致

4.验证一下,确实无水印,bingo!



0x03 分享程序思路:
1.根据用户页面分享的链接提取url2.根据url来进行请求,通过禁用重定向来获取headers['location'],再从中提取sec_id
3.拼接该用户所有视频列表请求url,然后在下载保存即可。下面给出一个请求参数示例:params = {
    'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk', #每个用户不同
    'count' : '200', #每次请求返回视频list中视频条数,不建议太大
    'min_cursor' : '1612108800000',#用户视频开始时间,带毫秒的时间戳
    'max_cursor' : '1619251716404',#用户视频结束时间,带毫秒时间戳
    'aid' : '1128',#未知参数,可有可无
    '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR' #签名值,直接从请求参数里面复制一个就能一直用
}

0x04 关键代码:
1.提取分享链接中的url
[Python] 纯文本查看 复制代码
string = input('粘贴分享链接:')
shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]

2.请求上述url,禁用重定向获取location的value,在正则提取出sec_id
[Python] 纯文本查看 复制代码
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]

3.拼接请求用户信息url,获取用户昵称,也可以获取其他信息,这里只取昵称
[Python] 纯文本查看 复制代码
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']

4.创建用户昵称同名文件夹,切换到该路径下
[Python] 纯文本查看 复制代码
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)

5.视频时间戳生成,原本可以直接使用一个大跨度的时间段,但是在测试中发现时间跨度太大的话,下载的视频数量会变少,多次测试后确定以1个月为间隔,年份从2018到2021,基本上也没有更早的视频了吧
[Python] 纯文本查看 复制代码
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)

6.到这里,params里面的参数都拿到了,直接拼接视频列表url,把返回结果存入json中。
[Python] 纯文本查看 复制代码
 awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
        awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
        data = json.loads(awemehtml)

7.直接从json中提取我们要的内容{“视频数量”,“视频title”,“无水印视频url”},然后还等啥,下载吧
[Python] 纯文本查看 复制代码
awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')


0x05 完整代码分享:
[Python] 纯文本查看 复制代码
import requests
import json
import os
import time
import re
"""
1.根据用户页面分享的字符串提取短url
2.根据短url加上302获取location,提取sec_id
3.拼接视频列表请求url
params = {
    'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk',
    'count' : '200',
    'min_cursor' : '1612108800000',
    'max_cursor' : '1619251716404',
    'aid' : '1128',
    '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
}
"""
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Mobile Safari/537.36"
}
# string  = '在抖音,记录美好生活! https://v.douyin.com/ekkTsYw/'
string = input('粘贴分享链接:')

shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]
print(shroturl)
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']
print(userinfo['user_info']['nickname'])
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)

"""new function"""
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)

        params = {
            'sec_uid' : sec_uid,
            'count' : 200,
            'min_cursor' : t1,
            'max_cursor' : t2,
            'aid' : 1128,
            '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
        }
        awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
        awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
        data = json.loads(awemehtml)
        # print(data)
        # print(type(data))
        awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')

免费评分

参与人数 51吾爱币 +53 热心值 +42 收起 理由
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
MyModHeaven + 1 + 1 我很赞同!
cuitao1995 + 1 + 1 谢谢@Thanks!
CPip + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
liming00 + 1 谢谢@Thanks!
XMQ + 1 热心回复!
HappinessPig + 1 谢谢@Thanks!
berserker85k + 1 + 1 谢谢@Thanks!
a4826800 + 1 + 1 热心回复!
小小的石头13 + 1 + 1 热心回复!
青葡 + 1 + 1 谢谢@Thanks!
转角遇到狗 + 1 + 1 我很赞同!
Cool_风 + 1 + 1 谢谢@Thanks!
Milk395 + 1 哥几个 在学习穿搭的路上越走越远
不会逆向 + 1 + 1 谢谢@Thanks!
Jw7560 + 1 热心回复!
泪水一样的温柔 + 1 + 1 谢谢@Thanks!
002 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
zzszz2016 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
uilyuan + 1 + 1 我很赞同!
jefftbb + 1 用心讨论,共获提升!
ArchieLiu + 1 我很赞同!
suyuewen + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!五花牛!
Moical + 1 + 1 谢谢@Thanks!
helian147 + 1 + 1 谢谢@Thanks!
泽哥 + 1 + 1 学习了,感谢!
heroabo + 1 + 1 谢谢@Thanks!
ElliottNumb + 2 + 1 我很赞同!
po1718 + 2 + 1 谢谢@Thanks!
wangdao + 1 谢谢@Thanks!
我的梦想也会飞 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Ucshishab1 + 1 + 1 热心回复!
chinaq + 1 很棒哦,抖音下载无水印,你币有了
yy季末 + 1 + 1 完全不会编程的,看的一脸懵逼,希望给个成品链接
samary1999 + 1 + 1 学习了
iYoloPPD + 1 谢谢@Thanks!
KeleZander + 1 学习到了
sgzdmsz + 1 + 1 谢谢@Thanks!
zjytrhy + 1 + 1 谢谢@Thanks!
pentium315 + 1 + 1 热心回复!
59pj + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
461735945 + 1 + 1 谢谢@Thanks!
KHacker + 1 我很赞同!
一日就是一天 + 1 + 1 求个成品……我想下载我暗恋的人的所有视频。。跪求了。。看在爱情的份上
warlden + 1 + 1 谢谢@Thanks!
caleb110 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
opqrsgu + 1 + 1 我很赞同!
MC心福 + 1 + 1 我很赞同!
Ebichu + 1 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
呵呵我笑了 + 1 学习一下
lendone + 1 + 1 学习一下

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| Quincy_007 发表于 2021-4-30 22:36 |楼主
呵呵我笑了 发表于 2021-4-30 22:34
问一下,去水印是什么原理

视频真实url中有个参数,playwm就是带水印,改成play就是无水印
推荐
zhangdane0110 发表于 2021-5-11 19:37
推荐
xucl 发表于 2021-5-15 09:30
推荐
lr梦魇 发表于 2021-5-14 22:22
看了,不会用啊
推荐
darkefire 发表于 2021-5-10 23:17
虽然不知道下载这个东西有什么用,不过看见楼主这么热心的分析讲解,还是要赞一个!
推荐
nulix 发表于 2021-5-11 09:44
牛逼,虽然我没咋看懂,但还是感觉很厉害,学习一下
推荐
zouya1990 发表于 2021-5-2 16:06
腻害,测试ok,我也在做一个
推荐
工口夏 发表于 2021-5-2 16:29
感谢楼主,马住
推荐
忧郁之子 发表于 2021-5-7 19:09
学到了,谢谢分享。
推荐
云上看景 发表于 2021-5-6 20:35
感谢分享
沙发
孤独无情 发表于 2021-4-30 22:34
希望有批量下快手的成品
3#
呵呵我笑了 发表于 2021-4-30 22:34
问一下,去水印是什么原理
4#
小智xyz 发表于 2021-4-30 22:35
求打包好的
5#
 楼主| Quincy_007 发表于 2021-4-30 22:35 |楼主
孤独无情 发表于 2021-4-30 22:34
希望有批量下快手的成品

原理都差不多的,可以研究一下
7#
mzhsohu 发表于 2021-4-30 22:37
感谢分享~!哪位大佬给翻译成易语言,谢谢了~!
8#
呵呵我笑了 发表于 2021-4-30 22:37
Quincy_007 发表于 2021-4-30 22:36
视频真实url中有个参数,playwm就是带水印,改成play就是无水印

非常感谢
9#
 楼主| Quincy_007 发表于 2021-4-30 22:37 |楼主

直接pyinstrall打包即可
exe执行效率蛮低
10#
小智xyz 发表于 2021-4-30 22:39
Quincy_007 发表于 2021-4-30 22:37
直接pyinstrall打包即可
exe执行效率蛮低

楼主打包发给我好吗本人小白一个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 08:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表