|
| 1 | +import { Async } from "../../util/async" |
| 2 | +import { Converters } from "../../util/converters" |
| 3 | +import { cookieStorage } from "../../util/cookie" |
| 4 | +import { util_init } from "../../util/initiator" |
| 5 | +import { _ } from "../../util/react" |
| 6 | +import { ui } from "../../util/ui" |
| 7 | +import { balh_config } from "../config" |
| 8 | +import { util_page } from "../page" |
| 9 | +import { FALSE, TRUE, r } from "../r" |
| 10 | + |
| 11 | + |
| 12 | +function isLogin() { |
| 13 | + return localStorage.access_key && localStorage.oauth_expires_at && Date.now() < +localStorage.oauth_expires_at |
| 14 | +} |
| 15 | + |
| 16 | +function clearLoginFlag() { |
| 17 | + // 只要清除过期时间, isLogin()就会返回false |
| 18 | + delete localStorage.oauth_expires_at |
| 19 | +} |
| 20 | + |
| 21 | +function showLogout() { |
| 22 | + ui.alert('确定取消授权登出?', () => { |
| 23 | + // 登出, 则应该清除所有授权相关的字段 |
| 24 | + delete localStorage.oauth_expires_at |
| 25 | + delete localStorage.access_key |
| 26 | + delete localStorage.refresh_token |
| 27 | + }) |
| 28 | +} |
| 29 | + |
| 30 | +function isLoginBiliBili() { |
| 31 | + return cookieStorage['DedeUserID'] !== undefined |
| 32 | +} |
| 33 | +// 当前在如下情况才会弹一次登录提示框: |
| 34 | +// 1. 第一次使用 |
| 35 | +// 2. 主站+服务器都退出登录后, 再重新登录主站 |
| 36 | +function checkLoginState() { |
| 37 | + // 给一些状态,设置初始值 |
| 38 | + localStorage.balh_must_remind_login_v3 === undefined && (localStorage.balh_must_remind_login_v3 = TRUE) |
| 39 | + |
| 40 | + if (isLoginBiliBili()) { |
| 41 | + if (!localStorage.balh_old_isLoginBiliBili // 主站 不登录 => 登录 |
| 42 | + || localStorage.balh_pre_server !== balh_config.server // 代理服务器改变了 |
| 43 | + || localStorage.balh_must_remind_login_v3) { // 设置了"必须提醒"flag |
| 44 | + if (!isLogin()) { |
| 45 | + // 保证一定要交互一次, 才不提醒 |
| 46 | + localStorage.balh_must_remind_login_v3 = TRUE; |
| 47 | + ui.pop({ |
| 48 | + content: [ |
| 49 | + _('text', `${GM_info.script.name}\n要不要考虑进行一下授权?\n\n授权后可以观看区域限定番剧的1080P\n(如果你是大会员或承包过这部番的话)\n\n你可以随时在设置中打开授权页面`) |
| 50 | + ], |
| 51 | + onConfirm: () => { |
| 52 | + localStorage.balh_must_remind_login_v3 = FALSE; |
| 53 | + showLogin(); |
| 54 | + document.querySelector('#AHP_Notice')?.remove() |
| 55 | + }, |
| 56 | + closeBtn: '不再提醒', |
| 57 | + onClose: () => { |
| 58 | + localStorage.balh_must_remind_login_v3 = FALSE; |
| 59 | + } |
| 60 | + }) |
| 61 | + } |
| 62 | + } |
| 63 | + } |
| 64 | + localStorage.balh_old_isLoginBiliBili = isLoginBiliBili() ? TRUE : FALSE |
| 65 | + localStorage.balh_pre_server = balh_config.server |
| 66 | +} |
| 67 | + |
| 68 | +async function showLogin() { |
| 69 | + const balh_auth_window = window.open('about:blank')!; |
| 70 | + balh_auth_window.document.title = 'BALH - 授权'; |
| 71 | + balh_auth_window.document.body.innerHTML = '<meta charset="UTF-8" name="viewport" content="width=device-width">正在获取授权,请稍候……'; |
| 72 | + window.balh_auth_window = balh_auth_window; |
| 73 | + |
| 74 | + try { |
| 75 | + const { sign, params } = Converters.generateSign({ |
| 76 | + appkey: '27eb53fc9058f8c3', |
| 77 | + local_id: "0", |
| 78 | + ts: (Date.now() / 1000).toFixed(0) |
| 79 | + }, 'c2ed53a74eeefe3cf99fbd01d8c9c375') |
| 80 | + const data1 = await (await fetch('https://passport.bilibili.com/x/passport-tv-login/qrcode/auth_code?' + params + '&sign=' + sign, { |
| 81 | + method: 'POST' |
| 82 | + })).json() |
| 83 | + |
| 84 | + if (data1.code === 0 && data1.data.auth_code) { |
| 85 | + let authCode = data1.data.auth_code |
| 86 | + balh_auth_window.document.body.innerHTML += '<br/>正在确认…… auth_code=' + authCode; |
| 87 | + const bili_jct = cookieStorage.get('bili_jct') |
| 88 | + const { params } = Converters.generateSign({ |
| 89 | + auth_code: authCode, |
| 90 | + build: "7082000", |
| 91 | + csrf: bili_jct |
| 92 | + }, 'c2ed53a74eeefe3cf99fbd01d8c9c375') |
| 93 | + const data2 = await (await fetch(('https://passport.bilibili.com/x/passport-tv-login/h5/qrcode/confirm?' + params), { |
| 94 | + method: 'POST', |
| 95 | + credentials: 'include', |
| 96 | + headers: { |
| 97 | + 'Content-Type': 'application/x-www-form-urlencoded', |
| 98 | + } |
| 99 | + })).json() |
| 100 | + |
| 101 | + if (data2.code === 0 && data2.message === "0") { |
| 102 | + balh_auth_window.document.body.innerHTML += '<br/>授权成功,正在获取token……'; |
| 103 | + const { sign, params } = Converters.generateSign({ |
| 104 | + appkey: '27eb53fc9058f8c3', |
| 105 | + local_id: "0", |
| 106 | + auth_code: authCode, |
| 107 | + ts: (Date.now() / 1000).toFixed(0) |
| 108 | + }, 'c2ed53a74eeefe3cf99fbd01d8c9c375') |
| 109 | + const data3 = await (await fetch('https://passport.bilibili.com/x/passport-tv-login/qrcode/poll?' + params + '&sign=' + sign, { |
| 110 | + method: "POST", |
| 111 | + })).json() |
| 112 | + |
| 113 | + const access_token = data3.data.token_info.access_token |
| 114 | + const oauth_expires_at = (Date.now() / 1000 + data3.data.token_info.expires_in) * 1000 |
| 115 | + balh_auth_window.document.body.innerHTML += '<br/>正在保存…… access_token=' + access_token + ', 过期于 ' + new Date(oauth_expires_at).toLocaleString(); |
| 116 | + if (data3.code === 0 && data3.message === "0") { |
| 117 | + localStorage.access_key = access_token |
| 118 | + localStorage.refresh_token = data3.data.token_info.refresh_token |
| 119 | + localStorage.oauth_expires_at = oauth_expires_at |
| 120 | + balh_auth_window.document.body.innerHTML += '<br/>保存成功!3秒后关闭'; |
| 121 | + await Async.timeout(3000) |
| 122 | + } |
| 123 | + } else { |
| 124 | + ui.alert(data2.message, () => { |
| 125 | + location.href = 'https://passport.bilibili.com/login' |
| 126 | + }) |
| 127 | + } |
| 128 | + } else { |
| 129 | + ui.alert('必须登录B站才能正常授权', () => { |
| 130 | + location.href = 'https://passport.bilibili.com/login' |
| 131 | + }) |
| 132 | + } |
| 133 | + } catch (e: any) { |
| 134 | + ui.alert(e.message ?? '授权出错') |
| 135 | + } finally { |
| 136 | + balh_auth_window.close() |
| 137 | + } |
| 138 | +} |
| 139 | + |
| 140 | +util_init(() => { |
| 141 | + if (!(util_page.player() || util_page.av())) { |
| 142 | + checkLoginState() |
| 143 | + } |
| 144 | +}, util_init.PRIORITY.DEFAULT, util_init.RUN_AT.DOM_LOADED_AFTER) |
| 145 | + |
| 146 | +export const bilibili_login = { |
| 147 | + showLogin, |
| 148 | + showLogout, |
| 149 | + isLogin, |
| 150 | + isLoginBiliBili, |
| 151 | + clearLoginFlag, |
| 152 | +} |
0 commit comments