import time import json import redis import requests import urllib3 from matplotlib.artist import allow_rasterization from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry from typing import Optional, Dict, Any, Union class HttpClient: def __init__(self, max_retries: int = 3, backoff_factor: float = 0.5): self.session = requests.Session() # 配置重试策略 retry_strategy = Retry( total=max_retries, backoff_factor=backoff_factor, status_forcelist=[500, 502, 503, 504, 429] ) adapter = HTTPAdapter(max_retries=retry_strategy) self.session.mount("http://", adapter) self.session.mount("https://", adapter) def request(self, method: str, url: str, headers: Optional[Dict] = None, params: Optional[Dict] = None, data: Optional[Union[Dict, str]] = None, cookies: Optional[Dict] = None, allow_redirects: bool = True, timeout: int = 30, **kwargs) -> requests.Response: try: response = self.session.request( method=method, url=url, headers=headers, params=params, data=data, cookies=cookies, allow_redirects=allow_redirects, timeout=timeout, **kwargs ) response.raise_for_status() return response except requests.exceptions.RequestException as e: print(f"请求失败: {url}, 错误: {str(e)}") raise def get(self, url: str, **kwargs) -> requests.Response: return self.request("GET", url, **kwargs) def post(self, url: str, **kwargs) -> requests.Response: return self.request("POST", url, **kwargs) # 创建全局的 HTTP 客户端实例 http_client = HttpClient() _REDIS_CONF = { "host": "192.144.230.75", "port": 6379, "password": "qwert@$123!&", "decode_responses": True, "db": 1, } def save_report_token(key_name: str, json_data: dict): r = redis.Redis(**_REDIS_CONF) key = key_name json_str = json.dumps(json_data, ensure_ascii=False) r.set(key, json_str) print(f"已在 Redis(DB {_REDIS_CONF['db']}) 中写入 key -> {key}") def get_report_token(key_name: str): r = redis.Redis(**_REDIS_CONF) key = key_name json_str = r.get(key) if not json_str: return None return json.loads(json_str) def login(): try: headers = { "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded", "Origin": "https://www.dailymotion.com", "Pragma": "no-cache", "Referer": "https://www.dailymotion.com/", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", "sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } url = "https://graphql.api.dailymotion.com/oauth/token" data = { "client_id": "f1a362d288c1b98099c7", "client_secret": "eea605b96e01c796ff369935357eca920c5da4c5", "grant_type": "password", "username": "copyright@qiyi.com", "password": "ppsIQIYI2018@", "scope": "userinfo,email,manage_subscriptions,manage_history,manage_likes,manage_playlists,manage_videos", "version": "2", "traffic_segment": "962042", "visitor_id": "359703fb-66c2-43d2-bd0d-b1cac9c7ae8a" } response = http_client.post(url, headers=headers, data=data) data = { "update_time": int(time.time()), "username": "copyright@qiyi.com", "password": "ppsIQIYI2018@", "token": response.json() } save_report_token('token', data) return data except Exception as e: print(f"登录失败: {str(e)}") raise def refresh_token(access_token, refresh_token): headers = { "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Length": "0", "Origin": "https://www.dailymotion.com", "Pragma": "no-cache", "Referer": "https://www.dailymotion.com/signin?urlback=%2Fzendesk%3Ftimestamp%3D1748932650%26return_to%3Dhttps%253A%252F%252Ffaq.dailymotion.com%252Fhc%252Fen-us%252Frequests%252Fnew", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", "sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } cookies = { "dmvk": "683e982c34e34", "ts": "133696", "v1st": "a847389a-6b91-4157-948f-457666f7172b", "ff": "on", "lang": "zh_CN", "usprivacy": "1---", "dmaid": "73ca37e4-6858-46c1-aac4-a4a5fc9a270e", "cookie_policy_closed": "1", "access_token": access_token, "refresh_token": refresh_token, } url = "https://www.dailymotion.com/cookie/refresh_token" response = http_client.post(url, headers=headers, cookies=cookies) def zendesk(): headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "no-cache", "Connection": "keep-alive", "Pragma": "no-cache", "Referer": "https://www.dailymotion.com/sg", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", "sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } url = "https://www.dailymotion.com/zendesk" params = { "return_to": "https://faq.dailymotion.com/hc/en-us/requests/new", "timestamp": str(time.time()), } response = http_client.get(url, headers=headers, params=params, allow_redirects=True) data = http_client.session.cookies.get_dict() data['update_time'] = int(time.time()) save_report_token('cookies', data) def get_csrftoken(): try: url = "https://faq.dailymotion.com/hc/api/internal/csrf_token.json" headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "no-cache", "Connection": "keep-alive", "Pragma": "no-cache", "Referer": "https://www.dailymotion.com/sg", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", "sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } response = http_client.get(url, headers=headers) data = {"update_time": int(time.time()), "csrf_token": response.json()} save_report_token('csrf_token', data) return data except Exception as e: print(f"获取 CSRF token 失败: {str(e)}") raise def report(csrf_token: str, v_url, title): try: headers = { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "no-cache", "content-type": "application/x-www-form-urlencoded", "origin": "https://faq.dailymotion.com", "pragma": "no-cache", "priority": "u=0, i", "referer": "https://faq.dailymotion.com/hc/en-us/requests/new?ticket_form_id=136048", "sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "same-origin", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0" } url = "https://faq.dailymotion.com/hc/en-us/requests" data = { "utf8": "✓", "authenticity_token": csrf_token, "request%5Bticket_form_id%5D": "136048", "request%5Bcollaborators%5D%5B%5D": "duke.chen@dailymotion.com", "request%5Bcustom_fields%5D%5B360008684839%5D": "__dc.copyright_user_protection_-_copyright__", "request%5Bcustom_fields%5D%5B30150188%5D": "copyrightform-notification", "request%5Bcustom_fields%5D%5B25089567%5D": "legal_entity", "request%5Bcustom_fields%5D%5B25159868%5D": "Beijing iQIYI Science & Technology Co.,Ltd", "request%5Bcustom_fields%5D%5B4869133282962%5D": "Legal Department", "request%5Bsubject%5D": "Copyright infringement Notification", "request%5Bcustom_fields%5D%5B25613698%5D": v_url, "request%5Bdescription%5D": f"We request that you take immediate actionto stop the infringing activity, take steps to ensure that iQIYI Content is notre-posted on, re-linked to, or otherwise available through your site. Pleaseinform us of the actions you have taken and their results.\r\n1) please help remove these videos\r\n2) The drama series titles are \"{title}\"\r\n", "request%5Bdescription_mimetype%5D": "text/plain", "request%5Bcustom_fields%5D%5B4769880845586%5D": "on", "request%5Bcustom_fields%5D%5B25626417%5D": "on", "request%5Bcustom_fields%5D%5B4769797363346%5D": "on", "request%5Bcustom_fields%5D%5B25159848%5D": "on", "request%5Bcustom_fields%5D%5B4769658191250%5D": "on" } response = requests.post(url, headers=headers, data=data) print(response.status_code) print(response.text) print(response) return response.status_code == 200 except Exception as e: print(f"提交报告失败: {str(e)}") raise if __name__ == '__main__': cookies = get_report_token('cookies')['cookies'] http_client.session.cookies = requests.utils.cookiejar_from_dict(cookies) csrf_token = get_csrftoken()['csrf_token']['current_session']['csrf_token'] report(csrf_token, 'Hunter X Hunter', 'https://www.dailymotion.com/video/x8kjx7v')