82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
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 |