Skip to content

Commit 7bf1303

Browse files
Howard20181ipcjs
andauthored
perf(balh): 新 API 获取 access_token (#1295)
* perf(balh): 新 API 获取 access_token * perf(balh): access_token 失效时删除 * wip: 整理代码 * chore: biliplus_login -> bilibili_login --------- Co-authored-by: ipcjs <[email protected]>
1 parent 76f61df commit 7bf1303

File tree

10 files changed

+181
-166
lines changed

10 files changed

+181
-166
lines changed

packages/unblock-area-limit/src/api/biliplus.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { bilibili_login } from "../feature/bili/bilibili_login";
12
import { balh_config } from "../feature/config";
23
import { Async } from "../util/async";
34
import { Converters, uposMap } from "../util/converters";
@@ -407,6 +408,8 @@ export async function fixThailandPlayUrlJson(originJson: object) {
407408
}
408409

409410
let origin: OriginResult = JSON.parse(JSON.stringify(originJson))
411+
if (origin.code === 401)
412+
bilibili_login.clearLoginFlag()
410413
interface LooseObject {
411414
[key: string]: any
412415
}

packages/unblock-area-limit/src/feature/bili/area_limit_for_vue.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ifNotNull } from "../../util/utils"
1212
import { balh_config, isClosed } from "../config"
1313
import { util_page } from "../page"
1414
import pageTemplate from './bangumi-play-page-template.html'
15+
import { bilibili_login } from "./bilibili_login"
1516

1617
export function modifyGlobalValue<T = any>(
1718
name: string,
@@ -117,7 +118,8 @@ async function fixThailandSeason(ep_id: string, season_id: string) {
117118
// https://github.com/yujincheng08/BiliRoaming/issues/112
118119
const thailandApi = new BiliBiliApi(balh_config.server_custom_th)
119120
const origin = await thailandApi.getSeasonInfoByEpSsIdOnThailand(ep_id, season_id)
120-
121+
if (origin.code === 401)
122+
bilibili_login.clearLoginFlag()
121123
origin.result.actors = origin.result.actor.info
122124
origin.result.is_paster_ads = 0
123125
origin.result.jp_title = origin.result.origin_name

packages/unblock-area-limit/src/feature/bili/area_limit_xhr_.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { Strings } from '../../util/strings'
1616
import { util_init } from '../../util/initiator'
1717
import { util_ui_msg } from '../../util/message'
1818
import { RegExps } from '../../util/regexps'
19-
import { biliplus_login } from './biliplus_login';
19+
import { bilibili_login } from './bilibili_login';
2020
import { injectFetch, injectFetch4Mobile } from '../../feature/bili/area_limit_fetch'
2121
import space_account_info_map from '../../feature/bili/space_account_info_map'
2222
import * as OpenCC from 'opencc-js'
@@ -812,11 +812,11 @@ export const area_limit_xhr = (() => {
812812
} else {
813813
return Promise.reject(new AjaxException(`服务器错误: ${JSON.stringify(data)}`, data ? data.code : 0))
814814
}
815-
} else if (isAreaLimitForPlayUrl(data)) {
815+
} else if (isAreaLimitForPlayUrl(data) || data.code === 401) {
816816
util_error('>>area limit');
817817
ui.pop({
818-
content: `突破黑洞失败\n需要登录\n点此确定进行登录`,
819-
onConfirm: biliplus_login.showLogin
818+
content: `突破黑洞失败\n${data.message}\n需要登录\n点此确定进行登录`,
819+
onConfirm: bilibili_login.showLogin
820820
})
821821
} else {
822822
if (balh_config.flv_prefer_ws) {
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
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+
}

packages/unblock-area-limit/src/feature/bili/biliplus_login.ts

Lines changed: 0 additions & 144 deletions
This file was deleted.

packages/unblock-area-limit/src/feature/bili/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export * from './biliplus_check_area_limit'
66
export * from './fill_season_page'
77
export * from './redirect_to_bangumi_or_insert_player'
88
export * from './area_limit_for_vue'
9-
export * from './biliplus_login'
9+
export * from './bilibili_login'
1010
export * from './settings'
1111
export * from './remove_pre_ad'
1212
export * from './hide_adblock_tips'

packages/unblock-area-limit/src/feature/bili/settings.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { balh_config } from "../config"
66
import { util_page } from "../page"
77
import { r } from "../r"
88
import { util_ui_msg } from '../../util/message'
9-
import { biliplus_login } from "./biliplus_login"
9+
import { bilibili_login } from "./bilibili_login"
1010
import css from './settings.scss'
1111

1212
const balh_feature_runPing = function () {
@@ -171,10 +171,10 @@ export function settings() {
171171
switch ((event.target as any).attributes['data-sign'].value) {
172172
default:
173173
case 'in':
174-
biliplus_login.showLogin();
174+
bilibili_login.showLogin();
175175
break;
176176
case 'out':
177-
biliplus_login.showLogout();
177+
bilibili_login.showLogout();
178178
break;
179179
}
180180
}
@@ -390,7 +390,7 @@ export function settings() {
390390
]), _('br'),
391391
_('a', { href: 'javascript:', 'data-sign': 'in', event: { click: onSignClick } }, [_('text', '帐号授权')]),
392392
_('text', ' '),
393-
_('a', { href: 'javascript:', 'data-sign': 'out', event: { click: onSignClick } }, [_('text', '取消授权')]),
393+
bilibili_login.isLogin() ? _('a', { href: 'javascript:', 'data-sign': 'out', event: { click: onSignClick } }, [_('text', '取消授权')]) : _('span'),
394394
_('text', '  '),
395395
_('a', { href: 'javascript:', event: { click: function () { util_ui_msg.show(window.$(this), '如果你的帐号进行了付费,不论是大会员还是承包,\n进行授权之后将可以在解除限制时正常享有这些权益\n\n你可以随时在这里授权或取消授权\n\n不进行授权不会影响脚本的正常使用,但可能会缺失1080P', 1e4); } } }, [_('text', '(这是什么?)')]),
396396
_('br'), _('br'),

0 commit comments

Comments
 (0)