Files
2024-11-04 11:01:40 +08:00

116 lines
3.7 KiB
Python
Raw Permalink 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 hashlib
import json
import time
from typing import Tuple, Optional
from app.utils.http import RequestUtils
class IyuuHelper(object):
"""
适配新版本IYUU开发版
"""
_version = "8.2.0"
_api_base = "https://2025.iyuu.cn"
_sites = {}
_token = None
_sid_sha1 = None
def __init__(self, token: str):
self._token = token
if self._token:
self.init_config()
def init_config(self):
pass
def __request_iyuu(self, url: str, method: str = "get", params: dict = None) -> Tuple[Optional[dict], str]:
"""
向IYUUApi发送请求
"""
if method == "post":
ret = RequestUtils(
accept_type="application/json",
headers={'token': self._token}
).post_res(f'{self._api_base + url}', json=params)
else:
ret = RequestUtils(
accept_type="application/json",
headers={'token': self._token}
).get_res(f'{self._api_base + url}', params=params)
if ret:
result = ret.json()
if result.get('code') == 0:
return result.get('data'), ""
else:
return None, f'请求IYUU失败状态码{result.get("code")},返回信息:{result.get("msg")}'
elif ret is not None:
return None, f"请求IYUU失败状态码{ret.status_code},错误原因:{ret.reason}"
else:
return None, f"请求IYUU失败未获取到返回信息"
def get_torrent_url(self, sid: str) -> Tuple[Optional[str], Optional[str]]:
if not sid:
return None, None
if not self._sites:
self._sites = self.__get_sites()
if not self._sites.get(sid):
return None, None
site = self._sites.get(sid)
return site.get('base_url'), site.get('download_page')
def __get_sites(self) -> dict:
"""
返回支持辅种的全部站点
:return: 站点列表、错误信息
"""
result, msg = self.__request_iyuu(url='/reseed/sites/index')
if result:
ret_sites = {}
sites = result.get('sites')
for site in sites:
ret_sites[site.get('id')] = site
return ret_sites
else:
print(msg)
return {}
def __report_existing(self) -> Optional[str]:
"""
汇报辅种的站点
:return:
"""
if not self._sites:
self._sites = self.__get_sites()
sid_list = list(self._sites.keys())
result, msg = self.__request_iyuu(url='/reseed/sites/reportExisting',
method='post',
params={'sid_list': sid_list})
if result:
return result.get('sid_sha1')
return None
def get_seed_info(self, info_hashs: list) -> Tuple[Optional[dict], str]:
"""
返回info_hash对应的站点id、种子id
:param info_hashs:
:return:
"""
if not self._sid_sha1:
self._sid_sha1 = self.__report_existing()
info_hashs.sort()
json_data = json.dumps(info_hashs, separators=(',', ':'), ensure_ascii=False)
sha1 = self.get_sha1(json_data)
result, msg = self.__request_iyuu(url='/reseed/index/index', method='post', params={
'hash': json_data,
'sha1': sha1,
'sid_sha1': self._sid_sha1,
'timestamp': int(time.time()),
'version': self._version
})
return result, msg
@staticmethod
def get_sha1(json_str: str) -> str:
return hashlib.sha1(json_str.encode('utf-8')).hexdigest()