成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django實(shí)現(xiàn)在線(xiàn)無(wú)水印抖音視頻下載(附源碼及地址)

瀏覽:166日期:2022-07-05 14:08:12

Django實(shí)現(xiàn)在線(xiàn)無(wú)水印抖音視頻下載(附源碼及地址)

項(xiàng)目地址是:https://www.chenshiyang.com/dytk

接下來(lái)我們分析下源碼簡(jiǎn)要看下實(shí)現(xiàn)原理。

實(shí)現(xiàn)原理

該項(xiàng)目不需要使用模型(models), 最核心的只有兩個(gè)頁(yè)面:一個(gè)主頁(yè)面(home)展示包含下載url地址的表單,一個(gè)下載頁(yè)面(download)處理表單請(qǐng)求,并展示去水印后的視頻文件地址及文件大小,以及用于手機(jī)預(yù)覽的二維碼。

對(duì)應(yīng)兩個(gè)核心頁(yè)面的路由如下所示,每個(gè)url對(duì)應(yīng)一個(gè)視圖函數(shù)。

# urls.py

from django.urls import pathfrom web.views import home, downloadurlpatterns = [ path(’home’, home), path(’downloader’, download),]#web/urls.py

from django.http import HttpResponsefrom django.shortcuts import render, redirect# Create your views here.from common.utils import format_duration, load_mediafrom common.DouYin import DYdef home(request): '''首頁(yè)''' return render(request, ’home.html’)def download(request): '''下載''' url = request.POST.get(’url’, None) assert url != None dy = DY() data = dy.parse(url) mp4_path, mp4_content_length = load_media(data[’mp4’], ’mp4’) mp3_path, mp3_content_length = load_media(data[’mp3’], ’mp3’) realpath = ’’.join([’https://www.chenshiyang.com’, mp4_path]) print(’realpath---------------------’, realpath) if len(data[’desc’].split(’#’)) > 2:topic = data[’desc’].split(’#’)[2].rstrip(’#’) return render(request, ’download.html’, locals())

可以看出通過(guò)home頁(yè)面表單提交過(guò)來(lái)的下載url會(huì)交由download函數(shù)處理。common模塊的DouYin.py中定義的DY類(lèi)負(fù)責(zé)對(duì)url繼續(xù)解析,爬取相關(guān)視頻地址,通過(guò)自定義utils.py中的load_media方法下載文件,并返回文件路徑以及文件大小。

由于解析下載url,從抖音爬取數(shù)據(jù)的代碼都封裝到DY類(lèi)里了,所以我們有必要貼下這個(gè)類(lèi)的代碼。另外,我們還需要貼下load_media這個(gè)方法的代碼。

# common/DouYin.py

# -*- coding: utf-8 -*-# @Time : 2020-07-03 13:10# @Author : chenshiyang# @Email : chenshiyang@blued.com# @File : DouYin.py# @Software: PyCharmimport refrom urllib.parse import urlparseimport requestsfrom common.utils import format_durationclass DY(object): def __init__(self, app=None):self.app = appif app is not None: self.init_app(app)self.headers = { ’accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9’, # ’accept-encoding’: ’gzip, deflate, br’, ’accept-language’: ’zh-CN,zh;q=0.9’, ’cache-control’: ’no-cache’, ’cookie’: ’sid_guard=2e624045d2da7f502b37ecf72974d311%7C1591170698%7C5184000%7CSun%2C+02-Aug-2020+07%3A51%3A38+GMT; uid_tt=0033579d9229eec4a4d09871dfc11271; sid_tt=2e624045d2da7f502b37ecf72974d311; sessionid=2e624045d2da7f502b37ecf72974d311’, ’pragma’: ’no-cache’, ’sec-fetch-dest’: ’document’, ’sec-fetch-mode’: ’navigate’, ’sec-fetch-site’: ’none’, ’sec-fetch-user’: ’?1’, ’upgrade-insecure-requests’: ’1’, ’user-agent’: ’Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1’}self.domain = [’www.douyin.com’, ’v.douyin.com’, ’www.snssdk.com’, ’www.amemv.com’, ’www.iesdouyin.com’, ’aweme.snssdk.com’] def init_app(self, app):self.app = app def parse(self, url):share_url = self.get_share_url(url)share_url_parse = urlparse(share_url)if share_url_parse.netloc not in self.domain: raise Exception('無(wú)效的鏈接')dytk = Nonevid = re.findall(r’/share/video/(d*)’, share_url_parse.path)[0]match = re.search(r’/share/video/(d*)’, share_url_parse.path)if match: vid = match.group(1)response = requests.get( share_url, headers=self.headers, allow_redirects=False)match = re.search(’dytk: '(.*?)'’, response.text)if match: dytk = match.group(1)if vid: return self.get_data(vid, dytk)else: raise Exception('解析失敗') def get_share_url(self, url):response = requests.get(url,headers=self.headers,allow_redirects=False)if ’location’ in response.headers.keys(): return response.headers[’location’]elif ’/share/video/’ in url: return urlelse: raise Exception('解析失敗') def get_data(self, vid, dytk):url = f'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}&dytk={dytk}'response = requests.get(url, headers=self.headers, )result = response.json()if not response.status_code == 200: raise Exception('解析失敗')item = result.get('item_list')[0]author = item.get('author').get('nickname')mp4 = item.get('video').get('play_addr').get('url_list')[0]cover = item.get('video').get('cover').get('url_list')[0]mp4 = mp4.replace('playwm', 'play')res = requests.get(mp4, headers=self.headers, allow_redirects=True)mp4 = res.urldesc = item.get('desc')mp3 = item.get('music').get('play_url').get('url_list')[0]data = dict()data[’mp3’] = mp3data[’mp4’] = mp4data[’cover’] = coverdata[’nickname’] = authordata[’desc’] = descdata[’duration’] = format_duration(item.get('duration'))return data

從代碼你可以看到返回的data字典里包括了mp3和mp4源文件地址,以及視頻的封面,作者昵稱(chēng)及描述等等。

接下來(lái)你可以看到load_media方法爬取了視頻到本地,并提供了新的path和大小。

#common/utils.py

# -*- coding: utf-8 -*-# @Time : 2020-06-29 17:26# @Author : chenshiyang# @Email : chenshiyang@blued.com# @File : utils.py# @Software: PyCharmimport osimport timeimport requestsdef format_duration(duration): ''' 格式化時(shí)長(zhǎng) :param duration 毫秒 ''' total_seconds = int(duration / 1000) minute = total_seconds // 60 seconds = total_seconds % 60 return f’{minute:02}:{seconds:02}’SUFFIXES = {1000: [’KB’, ’MB’, ’GB’, ’TB’, ’PB’, ’EB’, ’ZB’, ’YB’], 1024: [’KiB’, ’MiB’, ’GiB’, ’TiB’, ’PiB’, ’EiB’, ’ZiB’, ’YiB’]}def approximate_size(size, a_kilobyte_is_1024_bytes=True): ’’’Convert a file size to human-readable form. Keyword arguments: size -- file size in bytes a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024if False, use multiples of 1000 Returns: string ’’’ if size < 0:raise ValueError(’number must be non-negative’) multiple = 1024 if a_kilobyte_is_1024_bytes else 1000 for suffix in SUFFIXES[multiple]:size /= multipleif size < multiple: return ’{0:.1f} {1}’.format(size, suffix) raise ValueError(’number too large’)def do_load_media(url, path): ''' 對(duì)媒體下載 :param url: 多媒體地址 :param path:文件保存路徑 :return: None ''' try:headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}pre_content_length = 0# 循環(huán)接收視頻數(shù)據(jù)while True: # 若文件已經(jīng)存在,則斷點(diǎn)續(xù)傳,設(shè)置接收來(lái)需接收數(shù)據(jù)的位置 if os.path.exists(path):headers[’Range’] = ’bytes=%d-’ % os.path.getsize(path) res = requests.get(url, stream=True, headers=headers) content_length = int(res.headers[’content-length’]) # 若當(dāng)前報(bào)文長(zhǎng)度小于前次報(bào)文長(zhǎng)度,或者已接收文件等于當(dāng)前報(bào)文長(zhǎng)度,則可以認(rèn)為視頻接收完成 if content_length < pre_content_length or ( os.path.exists(path) and os.path.getsize(path) == content_length):break pre_content_length = content_length # 寫(xiě)入收到的視頻數(shù)據(jù) with open(path, ’ab’) as file:file.write(res.content)file.flush()print(’receive data,file size : %d total size:%d’ % (os.path.getsize(path), content_length))return approximate_size(content_length, a_kilobyte_is_1024_bytes=False) except Exception as e:print(’視頻下載異常:{}’.format(e))def load_media(url, path): basepath = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 生成13位時(shí)間戳 suffixes = str(int(round(time.time() * 1000))) path = ’’.join([’/media/’, path, ’/’, ’.’.join([suffixes, path])]) targetpath = ’’.join([basepath, path]) content_length = do_load_media(url, targetpath) return path, content_lengthdef main(url, suffixes, path): load_media(url, suffixes, path)if __name__ == '__main__': # url = ’https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fe70000br155v26tgq06h08e0lg&ratio=720p&line=0’ # suffixes = ’test’ # main(url, suffixes, ’mp4’,) print(approximate_size(3726257, a_kilobyte_is_1024_bytes=False))

接下來(lái)我們看下模板, 這個(gè)沒(méi)什么好說(shuō)的。

# templates/home.html

{% extends 'base.html' %}{% block content %} <div class='jumbotron custom-jum no-mrg'> <div class='container'> <div class='row'><div class='col-md-12'> <div class='center'> <div class='home-search'> <h1>抖音無(wú)水印視頻下載器</h1> <h2>將抖音無(wú)水印視頻下載到Mp4和Mp3</h2> </div> <div class='form-home-search'> <form action=’https://www.chenshiyang.com/dytk/downloader’ method=’POST’><div class='input-group col-lg-10 col-md-10 col-sm-10'> <input name='url' placeholder='輸入抖音視頻 URL ...' type='text' required='' value=''> <span class='input-group-btn'><button type='submit' id='btn_submit'>下載</button></span></div> </form> </div> </div></div> </div> </div> </div> </div> {% endblock %}# templates/download.html

{% extends 'base.html' %}{% block content %} <div class='page-content'> <div class='container'> <div class='row'> <div class='col-lg-12 col-centered'><div class='ads mrg-bt20 text-center'> <insdata-ad-client='ca-pub-2984659695526033' data-ad-slot='5734284394'></ins></div><div class='card'> <div class='row'> <div class='col-md-4 col-sm-4'> <a href='http://www.piao2010.com/bcjs/{{mp4_path}}' rel='external nofollow' rel='external nofollow' data-toggle='modal' ><span class='btn-play-video'><i class='glyphicon glyphicon-play'></i></span><p id='time'>{{data.duration}}</p> </a> <h5>作者: {{data.nickname}}</h5> <h5><a href='http://www.piao2010.com/bcjs/17035.html#' rel='external nofollow' >{{topic}} <i class='open-new-window'></i></a></h5> <p class='card-text'>{{data.desc}}</p> </div> <div class='col-md-8 col-sm-8 col-table'> <table class='table'><thead> <tr> <th>format</th> <th>size</th> <th>Downloads</th> </tr></thead><tbody> <tr> <td>mp4</td> <td>{{mp4_content_length}}</td> <td> <a href='http://www.piao2010.com/bcjs/{{mp4_path}}' rel='external nofollow' rel='external nofollow' download=''>下載</a> </td> </tr> <tr> <td>mp3</td> <td>{{mp3_content_length}}</td> <td> <a href='http://www.piao2010.com/bcjs/{{mp3_path}}' rel='external nofollow' download=''>下載</a> </td> </tr></tbody> </table> </div> </div></div><div class='card card-qrcode'> <div class='row'> <div class='col-md-12 qrcode'> <div class='text-center'><p class='qrcode-p'>掃描下面的二維碼直接下載到您的智能手機(jī)或平板電腦!</p> </div> </div> <div class='col-md-4 col-centered qrcode'> <div ><script src='https://rkxy.com.cn/static/js/qrcode.min.js'></script><script type='text/javascript'> new QRCode(document.getElementById('qrcode'), { text: '{{realpath}}', width: 120, height: 120, correctLevel: QRCode.CorrectLevel.L });</script> </div> </div> </div></div> </div> </div> </div></div>{% endblock %}完整源碼地址:

https://github.com/tinysheepyang/python_api。

以上就是Django實(shí)現(xiàn)在線(xiàn)無(wú)水印抖音視頻下載(附源碼及地址)的詳細(xì)內(nèi)容,更多關(guān)于Django 無(wú)水印抖音視頻下載的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: 抖音
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人黄色在线视频| 成人亚洲一区二区一| 久久精品国产亚洲一区二区三区| 欧美日韩一区二区三区在线观看免 | 日韩美女在线视频| 秋霞午夜av一区二区三区| 免费h精品视频在线播放| 亚洲免费观看高清完整版在线| 欧美精品亚洲精品| 久久久久久9999| av成人动漫在线观看| 欧美三级电影在线观看| 天堂av在线一区| 麻豆成人av| 日韩中文字幕不卡| 美女日韩在线中文字幕| 偷拍日韩校园综合在线| 91九色最新地址| 精品在线免费观看| 91精品国产一区二区三区| 国产91丝袜在线播放九色| 日韩美女在线视频| 99久精品国产| 欧美日韩在线观看一区二区| 精品在线亚洲视频| 欧美一区二区三区日韩视频| 床上的激情91.| 国产蜜臀av在线一区二区三区| 欧美色图首页| 亚洲精品视频在线观看免费| 国产亚洲欧美一区二区| 亚洲午夜一二三区视频| 美日韩精品免费| 日韩精品国产精品| 欧美视频中文字幕| 国产成人精品综合在线观看| 久久久久久久久一| 亚洲午夜电影| 亚洲午夜一二三区视频| 久久在线视频| 韩国在线一区二区| 精品国产乱码久久久久久久| 国产精品xvideos88| 亚洲影院理伦片| 欧美三片在线视频观看 | 激情综合久久| 一区二区三区在线高清| 久久久综合香蕉尹人综合网| 久久99热这里只有精品| 精品国产伦一区二区三区观看方式| 欧美在线91| 亚洲一级不卡视频| 色婷婷av一区二区三区大白胸| 国内精品免费**视频| 久久久噜噜噜久久人人看| 国内视频一区| 亚洲国产精品欧美一二99| 欧美性猛片aaaaaaa做受| 粉嫩av一区二区三区粉嫩| 国产情人综合久久777777| 99亚洲视频| 麻豆成人免费电影| 精品国产一二三| 亚洲视频高清| 婷婷成人综合网| 91精品国产综合久久久久久久| 97精品久久久久中文字幕| 亚洲欧洲综合另类| 欧洲精品在线观看| 老司机午夜精品99久久| 国产欧美日韩不卡免费| 免费亚洲一区二区| 国产91精品久久久久久久网曝门| 国产精品亲子乱子伦xxxx裸| 亚洲精品1区2区| 久久99精品久久久久久国产越南| 精品国产制服丝袜高跟| 中文久久精品| 国产精一品亚洲二区在线视频| 国产精品国产三级国产有无不卡 | 精品写真视频在线观看 | 美女视频黄免费的久久| 久久久久久久久久久久久久久99 | 欧美三级视频| 日韩—二三区免费观看av| 欧美xxx久久| 国产精品免费一区二区三区观看| 国内精品免费**视频| 国产无人区一区二区三区| 久久都是精品| 99精品久久只有精品| 亚洲成av人片在线| 国产午夜久久久久| 欧美在线看片a免费观看| 欧美精品系列| 国产自产高清不卡| 一区二区三区免费网站| 精品少妇一区二区三区在线视频| 国产亚洲一级| 99视频精品在线| 日本在线不卡一区| 国产精品美日韩| 91麻豆精品国产91| 一区二区三区欧美在线| 国产成人精品一区二区三区网站观看| 亚洲免费观看高清完整版在线观看 | 成人精品一区二区三区中文字幕| 亚洲一区二区五区| 久久看人人爽人人| 日本丶国产丶欧美色综合| 欧美永久精品| 极品美女销魂一区二区三区免费| 亚洲精品久久久蜜桃| 26uuu亚洲综合色| 在线免费观看日本欧美| 亚洲经典在线看| bt7086福利一区国产| 日本亚洲欧美天堂免费| 国产精品传媒在线| 日韩视频免费观看高清完整版| 国产精品夜夜夜一区二区三区尤| jlzzjlzz亚洲女人18| 日本va欧美va瓶| 亚洲精品国产成人久久av盗摄| 精品福利一区二区三区免费视频| 久久激情综合| 亚洲香蕉网站| 91香蕉视频污| 国产精品综合在线视频| 五月综合激情网| 国产精品不卡一区二区三区| 日韩一卡二卡三卡四卡| 在线视频一区二区三| 一区二区av| 欧美午夜免费影院| 99久久婷婷国产综合精品电影 | 欧美一区二区三区思思人| 久久久国产精品一区二区中文| 国产精品xnxxcom| 成人国产精品免费观看| 狠狠狠色丁香婷婷综合久久五月| 午夜亚洲福利老司机| 中文字幕五月欧美| 久久嫩草精品久久久精品一| 欧美日高清视频| 色狠狠综合天天综合综合| 亚洲全部视频| 国产精品mv在线观看| 欧美一区国产在线| 99久久99久久综合| 白白色亚洲国产精品| 国产成人免费高清| 精品一区二区三区在线播放视频| 婷婷综合五月天| 亚洲人xxxx| 欧美激情自拍偷拍| 久久精品视频在线免费观看| 精品国产乱码久久久久久久久| 日韩三级视频在线观看| 欧美一级xxx| 欧美va日韩va| 欧美日韩夫妻久久| 精品视频999| 欧美特级限制片免费在线观看| 久久亚洲图片| 在线免费亚洲电影| 国产亚洲精品自拍| 国产偷久久久精品专区| 日韩午夜av| 国产精品婷婷| 玖玖在线精品| 欧美中文一区二区三区| 欧美三级日韩三级| 亚洲欧美网站| 久久久精品日韩| 欧美亚洲综合另类| 欧美日韩免费高清一区色橹橹 | 蜜臀av在线播放一区二区三区| 午夜亚洲福利老司机| 日韩精品一级二级| 理论片日本一区| 国产麻豆精品久久一二三| 国产黄人亚洲片| www.欧美精品一二区| 午夜精品亚洲| 亚洲精品激情| 久久久亚洲一区| 欧美日韩久久久一区| 精品国精品国产| 中文字幕av一区 二区| 亚洲精品午夜久久久| 日日夜夜免费精品视频| 国内久久精品视频| 成人做爰69片免费看网站| 99精品久久免费看蜜臀剧情介绍| 欧美日韩免费观看一区| 国产日产精品一区二区三区四区的观看方式 | 亚洲黄色视屏| 欧美一级视频| 欧美日韩一级片网站|