Ai_Admin/website/views.py
2024-06-05 05:10:50 +08:00

82 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import aiohttp
from django.http import HttpResponse, StreamingHttpResponse
import os
from datetime import datetime
import requests
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from urllib.parse import quote
from django.http import HttpResponse
from aiohttp import ClientSession
from django.views.decorators.csrf import csrf_exempt
def acme_challenge(request, token):
print(token)
content = f'{token}.E4H2n2zqARGJeN2ulDerea5xYFCDXMy1y9v61hoQfms'
return HttpResponse(content, content_type='text/plain')
@csrf_exempt
async def download_proxy(request):
video_url = request.GET.get('url')
if not video_url:
return HttpResponse("URL is required", status=400)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
async with ClientSession() as session:
try:
async with session.get(video_url, headers=headers) as response:
if response.status == 200:
content = await response.read() # 读取内容到内存中,注意这不适用于大文件
# 创建一个 HttpResponse 对象并设置 Content-Type
response = HttpResponse(content, content_type=response.headers['Content-Type'])
# 添加自定义响应头
response['X-Content-Length'] = str(len(content))
return response
else:
return HttpResponse("Failed to download video", status=response.status)
except aiohttp.ClientConnectionError:
return HttpResponse("Connection closed", status=500)
class ProxyView(View):
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
# 获取目标URL
target_url = request.GET.get('url')
if not target_url:
return HttpResponse("Missing 'url' parameter", status=400)
try:
# 请求目标URL
response = requests.get(target_url, stream=True)
response.raise_for_status()
except requests.exceptions.RequestException as e:
return HttpResponse(f"Error fetching target URL: {e}", status=500)
# 获取文件类型并强制设置为 video/mp4
content_type = 'video/mp4'
# 获取文件名并强制使用 .mp4 后缀
filename = target_url.split("/")[-1].split('?')[0] # 移除查询参数
if not filename.endswith('.mp4'):
filename = f"{filename}.mp4"
# 设置Content-Disposition头部确保文件在浏览器中直接播放而不是下载
content_disposition = f'inline; filename="{filename}"'
# 创建响应对象并将内容传递给客户端
proxy_response = HttpResponse(content=response.content, content_type=content_type)
proxy_response['Content-Disposition'] = content_disposition
return proxy_response