From cafa4d217cae0321e9b078fbe478ce32c3d07bb2 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:07:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E4=BB=93=E5=BA=93Github=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 33 +++++++++++++++++++++++++++++++++ app/helper/plugin.py | 14 ++++++++++---- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 41b9de5c..aae1ca4d 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -224,6 +224,8 @@ class Settings(BaseSettings): PLUGIN_MARKET: str = "https://github.com/jxxghp/MoviePilot-Plugins,https://github.com/thsrite/MoviePilot-Plugins,https://github.com/honue/MoviePilot-Plugins,https://github.com/InfinityPacer/MoviePilot-Plugins" # Github token,提高请求api限流阈值 ghp_**** GITHUB_TOKEN: Optional[str] = None + # 指定的仓库Github token,多个仓库使用,分隔,格式:{user1}/{repo1}:ghp_****,{user2}/{repo2}:github_pat_**** + GITHUB_TOKEN_FOR_REPO: Optional[str] = None # Github代理服务器,格式:https://mirror.ghproxy.com/ GITHUB_PROXY: Optional[str] = '' # 自动检查和更新站点资源包(站点索引、认证等) @@ -362,6 +364,37 @@ class Settings(BaseSettings): } return {} + def GITHUB_HEADERS_FOR_REPO(self, repo: str = None): + """ + Github指定的仓库请求头 + :param repo: 指定的仓库名称,格式为 "user/repo"。如果为空,或者没有找到指定仓库请求头,则返回默认的请求头信息 + :return: Github请求头 + """ + # 如果没有传入指定的仓库名称,或没有配置指定的仓库Token,则返回默认的请求头信息 + if not repo or not self.GITHUB_TOKEN_FOR_REPO: + return self.GITHUB_HEADERS + headers = {} + # 格式:{user1}/{repo1}:ghp_****,{user2}/{repo2}:github_pat_**** + token_pairs = self.GITHUB_TOKEN_FOR_REPO.split(",") + for token_pair in token_pairs: + try: + parts = token_pair.split(":") + if len(parts) != 2: + print(f"无效的令牌格式: {token_pair}") + continue + repo_info = parts[0].strip() + token = parts[1].strip() + if not repo_info or not token: + print(f"无效的令牌或仓库信息: {token_pair}") + continue + headers[repo_info] = { + "Authorization": f"Bearer {token}" + } + except Exception as e: + print(f"处理令牌对 '{token_pair}' 时出错: {e}") + # 如果传入了指定的仓库名称,则返回该仓库的请求头信息,否则返回默认请求头 + return headers.get(repo, self.GITHUB_HEADERS) + @property def DEFAULT_DOWNLOADER(self): """ diff --git a/app/helper/plugin.py b/app/helper/plugin.py index e68849e8..e65a1800 100644 --- a/app/helper/plugin.py +++ b/app/helper/plugin.py @@ -51,7 +51,8 @@ class PluginHelper(metaclass=Singleton): if not user or not repo: return {} raw_url = self._base_url % (user, repo) - res = RequestUtils(proxies=self.proxies, headers=settings.GITHUB_HEADERS, + res = RequestUtils(proxies=self.proxies, + headers=settings.GITHUB_HEADERS_FOR_REPO(repo=f"{user}/{repo}"), timeout=10).get_res(f"{raw_url}package.json") if res: try: @@ -137,12 +138,16 @@ class PluginHelper(metaclass=Singleton): if not user or not repo: return False, "不支持的插件仓库地址格式" + user_repo = f"{user}/{repo}" + def __get_filelist(_p: str) -> Tuple[Optional[list], Optional[str]]: """ 获取插件的文件列表 """ - file_api = f"https://api.github.com/repos/{user}/{repo}/contents/plugins/{_p}" - r = RequestUtils(proxies=settings.PROXY, headers=settings.GITHUB_HEADERS, timeout=30).get_res(file_api) + file_api = f"https://api.github.com/repos/{user_repo}/contents/plugins/{_p}" + r = RequestUtils(proxies=settings.PROXY, + headers=settings.GITHUB_HEADERS_FOR_REPO(repo=user_repo), + timeout=30).get_res(file_api) if r is None: return None, "连接仓库失败" elif r.status_code != 200: @@ -164,7 +169,8 @@ class PluginHelper(metaclass=Singleton): download_url = f"{settings.GITHUB_PROXY}{item.get('download_url')}" # 下载插件文件 res = RequestUtils(proxies=self.proxies, - headers=settings.GITHUB_HEADERS, timeout=60).get_res(download_url) + headers=settings.GITHUB_HEADERS_FOR_REPO(repo=user_repo), + timeout=60).get_res(download_url) if not res: return False, f"文件 {item.get('name')} 下载失败!" elif res.status_code != 200: