| import json | |
| import re | |
| import urllib.request | |
| from flask import make_response | |
| def jsonify(data, status=200): | |
| """Custom jsonify dengan indent 2 dan ensure_ascii False.""" | |
| response = make_response(json.dumps(data, indent=2, ensure_ascii=False), status) | |
| response.headers["Content-Type"] = "application/json; charset=utf-8" | |
| return response | |
| def validate_tiktok_url(url): | |
| """Validasi apakah URL adalah URL TikTok yang valid (video atau photo).""" | |
| patterns = [ | |
| r'https?://(www\.)?tiktok\.com/@[\w.]+/(video|photo)/\d+/?', | |
| r'https?://(vm|vt)\.tiktok\.com/[\w]+/?', | |
| r'https?://(www\.)?tiktok\.com/t/[\w]+/?', | |
| ] | |
| return any(re.match(pattern, url) for pattern in patterns) | |
| def resolve_url(url): | |
| """Mengikuti redirect URL untuk mendapatkan URL final (misal dari vt.tiktok ke tiktok.com/@user/video/id).""" | |
| try: | |
| req = urllib.request.Request( | |
| url, | |
| headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} | |
| ) | |
| with urllib.request.urlopen(req, timeout=15) as response: | |
| return response.geturl() | |
| except Exception: | |
| return url | |