From e7d847bd84eccac710c80d77d20b8f4591ff7b98 Mon Sep 17 00:00:00 2001 From: Evil0ctal Date: Wed, 6 Apr 2022 01:24:35 -0700 Subject: [PATCH] Delete web_api.py --- web_api.py | 195 ----------------------------------------------------- 1 file changed, 195 deletions(-) delete mode 100644 web_api.py diff --git a/web_api.py b/web_api.py deleted file mode 100644 index ab632e7..0000000 --- a/web_api.py +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env python -# -*- encoding: utf-8 -*- -# @Author: https://github.com/Evil0ctal/ -# @Time: 2021/11/06 -# @Update: 2022/04/05 -# @Function: -# 基于Requests、Flask,可实现在线批量解析抖音的无水印视频/图集。 -# 可用于下载作者禁止下载的视频,同时可搭配iOS的快捷指令APP配合本项目API实现应用内下载。 - -import os -import re -import time -import requests -import unicodedata -from scraper import Scraper -from werkzeug.urls import url_quote -from flask import Flask, request, jsonify, make_response - - -app = Flask(__name__) -headers = { - 'user-agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36 Edg/87.0.664.66' -} - - -def find_url(string): - # 解析抖音分享口令中的链接并返回列表 - url = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', string) - return url - - -def clean_filename(string, author_name): - # 替换不能用于文件名的字符('/ \ : * ? " < > |') - rstr = r"[\/\\\:\*\?\"\<\>\|]" - # 将上述字符替换为下划线 - new_title = re.sub(rstr, "_", string) - # 新文件名 - filename = ('douyin.wtf_' + new_title + '_' + author_name).replace('\n', '') - return filename - - -@app.route("/api", methods=["POST", "GET"]) -def webapi(): - # 创建一个Flask应用获取POST参数并返回结果 - api = Scraper() - content = request.args.get("url") - if content != '': - post_content = find_url(content)[0] - # 将API记录在API_logs.txt中 - date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) - with open('API_logs.txt', 'a') as f: - f.write(date + " : " + post_content + '\n') - try: - # 开始时间 - start = time.time() - # 校验是否为TikTok链接 - if 'tiktok.com' in post_content: - result = api.tiktok(post_content) - # 以JSON格式返回TikTok信息 - return jsonify(result) - # 如果关键字不存在则判断为抖音链接 - elif 'douyin.com' in post_content: - result = api.douyin(post_content) - # 以JSON格式返回返回Douyin信息 - return jsonify(result) - except Exception as e: - # 结束时间 - end = time.time() - # 解析时间 - analyze_time = (format((end - start), '.4f') + 's') - # 返回错误信息 - return jsonify(status='failed', reason=str(e), time=analyze_time, function='webapi()', value=content) - else: - # 返回错误信息 - return jsonify(status='failed', reason='url value cannot be empty') - - - -@app.route("/video", methods=["POST", "GET"]) -def download_video(): - # 用于返回视频下载请求(返回MP4文件下载请求,面对大量请求时非常吃服务器内存,容易崩,慎用。) - api = Scraper() - content = request.args.get("url") - post_content = find_url(content)[0] - try: - if 'douyin.com' in post_content: - # 获取视频信息 - result = api.douyin(post_content) - # 视频链接 - video_url = result['nwm_video_url'] - # 视频标题 - video_title = result['video_title'] - # 作者昵称 - video_author = result['video_author'] - # 清理文件名 - file_name = clean_filename(video_title, video_author) - elif 'tiktok.com' in post_content: - # 获取视频信息 - result = api.tiktok(post_content) - # 无水印地址 - video_url = result['nwm_video_url'] - # 视频标题 - video_title = result['video_title'] - # 作者昵称 - video_author = result['video_author'] - # 清理文件名 - file_name = clean_filename(video_title, video_author) - else: - return jsonify(Status='Failed', Reason='Check submitted parameters!') - # 获取视频文件字节流 - video_mp4 = requests.get(video_url, headers).content - # 将字节流封装成返回对象 - response = make_response(video_mp4) - # 添加响应头部信息 - response.headers['Content-Type'] = "video/mp4" - # 他妈的,费了我老大劲才解决文件中文名的问题 - try: - filename = file_name.encode('latin-1') - except UnicodeEncodeError: - filenames = { - 'filename': unicodedata.normalize('NFKD', file_name).encode('latin-1', 'ignore'), - 'filename*': "UTF-8''{}".format(url_quote(file_name) + '.mp4'), - } - else: - filenames = {'filename': file_name + '.mp4'} - # attachment表示以附件形式下载 - response.headers.set('Content-Disposition', 'attachment', **filenames) - return response - except Exception as e: - return jsonify(status='failed', reason=str(e), function='download_video()', value=content) - - -@app.route("/music", methods=["POST", "GET"]) -def download_music(): - # 用于返回视频下载请求(返回MP3文件下载请求,面对大量请求时非常吃服务器内存,容易崩,慎用。) - api = Scraper() - content = request.args.get("url") - post_content = find_url(content)[0] - try: - if 'douyin.com' in post_content: - # 获取视频信息 - result = api.douyin(post_content) - bgm_url = result['video_music'] - if bgm_url == "None": - return jsonify(Status='Failed', Reason='This link has no music to get!') - else: - # 视频标题 - bgm_title = result['video_music_title'] - # 作者昵称 - author_name = result['video_music_author'] - # 清理文件名 - file_name = clean_filename(bgm_title, author_name) - elif 'tiktok.com' in post_content: - # 获取视频信息 - result = api.douyin(post_content) - # BGM链接 - bgm_url = result['video_music'] - # 视频标题 - bgm_title = result['video_music_title'] - # 作者昵称 - author_name = result['video_music_author'] - # 清理文件名 - file_name = clean_filename(bgm_title, author_name) - else: - return jsonify(Status='Failed', Reason='This link has no music to get!') - video_bgm = requests.get(bgm_url, headers).content - # 将bgm字节流封装成response对象 - response = make_response(video_bgm) - # 添加响应头部信息 - response.headers['Content-Type'] = "video/mp3" - # 他妈的,费了我老大劲才解决文件中文名的问题 - try: - filename = file_name.encode('latin-1') - except UnicodeEncodeError: - filenames = { - 'filename': unicodedata.normalize('NFKD', file_name).encode('latin-1', 'ignore'), - 'filename*': "UTF-8''{}".format(url_quote(file_name) + '.mp3'), - } - else: - filenames = {'filename': file_name + '.mp3'} - # attachment表示以附件形式下载 - response.headers.set('Content-Disposition', 'attachment', **filenames) - return response - except Exception as e: - return jsonify(status='failed', reason=str(e), function='download_music()', value=content) - - -if __name__ == '__main__': - # 开启WebAPI - if os.environ.get('PORT'): - port = int(os.environ.get('PORT')) - else: - # 默认端口 - port = 2333 - app.run(host='0.0.0.0', port=port) \ No newline at end of file