diff --git a/js/Bangumi_Topic_Share.js b/js/Bangumi Topic Share/Bangumi_Topic_Share.js similarity index 99% rename from js/Bangumi_Topic_Share.js rename to js/Bangumi Topic Share/Bangumi_Topic_Share.js index f6e4ce1..5fdf552 100644 --- a/js/Bangumi_Topic_Share.js +++ b/js/Bangumi Topic Share/Bangumi_Topic_Share.js @@ -2,7 +2,7 @@ // @name Bangumi Topic Share // @namespace http://tampermonkey.net/ // @version 6.2 -// @description Bangumi 话题/日志分享工具:生成分享卡片,支持图片复制/下载、一键复制分享文案、可选 AI 标签 +// @description Bangumi 分享工具:生成分享卡片,支持图片复制/下载、一键复制分享文案、可选 AI 标签 // @author Stardream // @contributor Chang ji, Mewtw0 // @match *://bgm.tv/group/topic/* diff --git a/js/Bangumi Topic Share/worker/src/Bangumi_Topic_Share_API_Oauth.js b/js/Bangumi Topic Share/worker/src/Bangumi_Topic_Share_API_Oauth.js new file mode 100644 index 0000000..a0d56c7 --- /dev/null +++ b/js/Bangumi Topic Share/worker/src/Bangumi_Topic_Share_API_Oauth.js @@ -0,0 +1,97 @@ +export default { + async fetch(request, env) { + if (request.method === 'OPTIONS') { + return corsResp(null, 204); + } + + const url = new URL(request.url); + if (request.method === 'GET' && url.pathname === '/debug') { + return jsonResp({ + ok: true, + hasClientId: !!env.BGM_CLIENT_ID, + hasClientSecret: !!env.BGM_CLIENT_SECRET, + redirectUri: env.BGM_REDIRECT_URI || null, + }); + } + + if (request.method !== 'POST') { + return corsResp('Method Not Allowed', 405); + } + + let body; + try { + body = await request.text(); + } catch { + return corsResp('Bad Request', 400); + } + + const params = new URLSearchParams(body); + const grantType = params.get('grant_type'); + + if (grantType !== 'authorization_code' && grantType !== 'refresh_token') { + return corsResp('Invalid grant_type', 400); + } + + const redirectUri = params.get('redirect_uri') || env.BGM_REDIRECT_URI; + const tokenParams = new URLSearchParams({ + grant_type: grantType, + client_id: env.BGM_CLIENT_ID || '', + client_secret: env.BGM_CLIENT_SECRET || '', + redirect_uri: redirectUri || '', + }); + + if (grantType === 'authorization_code') { + const code = params.get('code'); + if (!code) return corsResp('Missing code', 400); + tokenParams.set('code', code); + } else { + const refreshToken = params.get('refresh_token'); + if (!refreshToken) return corsResp('Missing refresh_token', 400); + tokenParams.set('refresh_token', refreshToken); + } + + const resp = await fetch('https://bgm.tv/oauth/access_token', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: tokenParams.toString(), + }); + + const text = await resp.text(); + if (!resp.ok) { + return jsonResp({ + ok: false, + status: resp.status, + bangumi: parseMaybeJson(text), + hasClientId: !!env.BGM_CLIENT_ID, + hasClientSecret: !!env.BGM_CLIENT_SECRET, + redirectUri, + }, resp.status); + } + + return corsResp(text, resp.status, 'application/json'); + } +}; + +function parseMaybeJson(text) { + try { + return JSON.parse(text); + } catch { + return text; + } +} + +function jsonResp(data, status = 200) { + return corsResp(JSON.stringify(data, null, 2), status, 'application/json'); +} + +function corsResp(body, status = 200, contentType = 'text/plain') { + return new Response(body, { + status, + headers: { + 'Content-Type': contentType, + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type', + } + }); +} diff --git a/js/Bangumi Topic Share/worker/wrangler.toml b/js/Bangumi Topic Share/worker/wrangler.toml new file mode 100644 index 0000000..a3ec6c7 --- /dev/null +++ b/js/Bangumi Topic Share/worker/wrangler.toml @@ -0,0 +1,7 @@ +name = "bgm-oauth-proxy" +main = "src/Bangumi_Topic_Share_API_Oauth.js" +compatibility_date = "2024-01-01" + +# Set these as secrets via: wrangler secret put BGM_CLIENT_ID +# wrangler secret put BGM_CLIENT_SECRET +# wrangler secret put BGM_REDIRECT_URI diff --git a/js/U2_FL_Helper.js b/js/U2 FL Helper/U2_FL_Helper.js similarity index 100% rename from js/U2_FL_Helper.js rename to js/U2 FL Helper/U2_FL_Helper.js diff --git a/js/VGMdb_Album_Downloader.js b/js/VGMDB Album Downloader/VGMdb_Album_Downloader.js similarity index 100% rename from js/VGMdb_Album_Downloader.js rename to js/VGMDB Album Downloader/VGMdb_Album_Downloader.js diff --git a/py/stress_test.py b/py/Stress test/stress_test.py similarity index 100% rename from py/stress_test.py rename to py/Stress test/stress_test.py