diff --git a/lib/common/constants.dart b/lib/common/constants.dart index 93d5572ec..993aac28d 100644 --- a/lib/common/constants.dart +++ b/lib/common/constants.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/http/constants.dart'; import 'package:flutter/material.dart'; class StyleString { @@ -37,6 +38,15 @@ class Constants { static const String statisticsApp = '{"appId":1,"platform":3,"version":"8.43.0","abtest":""}'; + static const baseHeaders = { + 'connection': 'keep-alive', + 'accept-encoding': 'br,gzip', + 'referer': HttpString.baseUrl, + 'env': 'prod', + 'app-key': 'android64', + 'x-bili-aurora-zone': 'sh001', + }; + static final urlRegex = RegExp( r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]', ); diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index 856d3b47e..4e184713a 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -3,6 +3,7 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart'; import 'package:PiliPlus/models/common/reply/reply_option_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; @@ -19,7 +20,6 @@ import 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_card_list.dart' import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart'; import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart'; import 'package:PiliPlus/utils/accounts.dart'; -import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; @@ -232,9 +232,7 @@ class DynamicsHttp { '{"platform":"web","device":"pc","spmid":"333.1330"}', if (!clearCookie && Accounts.main.isLogin) 'csrf': Accounts.main.csrf, }, - options: clearCookie - ? Options(extra: {'account': AnonymousAccount(), 'checkReply': true}) - : null, + options: clearCookie ? ReplyHttp.options : null, ); if (res.data['code'] == 0) { try { diff --git a/lib/http/init.dart b/lib/http/init.dart index 527aa6af4..ec79fb785 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -115,13 +115,7 @@ class Request { receiveTimeout: const Duration(milliseconds: 10000), //Http请求头. headers: { - 'connection': 'keep-alive', - 'accept-encoding': 'br,gzip', 'user-agent': 'Dart/3.6 (dart:io)', // Http2Adapter不会自动添加标头 - 'referer': HttpString.baseUrl, - 'env': 'prod', - 'app-key': 'android64', - 'x-bili-aurora-zone': 'sh001', }, responseDecoder: responseDecoder, // Http2Adapter没有自动解压 persistentConnection: true, @@ -205,14 +199,7 @@ class Request { Map? queryParameters, Options? options, CancelToken? cancelToken, - String? uaType, }) async { - if (uaType != null) { - options ??= Options(); - options.headers ??= {}; - options.headers!['user-agent'] = headerUa(type: uaType); - } - try { return await dio.get( url, diff --git a/lib/http/reply.dart b/lib/http/reply.dart index 52155a05f..2e4e5ffcb 100644 --- a/lib/http/reply.dart +++ b/lib/http/reply.dart @@ -12,8 +12,9 @@ import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:dio/dio.dart'; class ReplyHttp { - static final Options _options = Options( - extra: {'account': AnonymousAccount(), 'checkReply': true}, + static final Options options = Options( + headers: {...Constants.baseHeaders, 'cookie': ''}, + extra: {'account': NoAccount()}, ); static Future replyList({ @@ -36,7 +37,7 @@ class ReplyHttp { '{"offset":"${nextOffset.replaceAll('"', '\\"')}"}', 'mode': sort + 2, //2:按时间排序;3:按热度排序 }, - options: !isLogin ? _options : null, + options: !isLogin ? options : null, ) : await Request().get( Api.replyList, @@ -47,7 +48,7 @@ class ReplyHttp { 'pn': page, 'ps': 20, }, - options: !isLogin ? _options : null, + options: !isLogin ? options : null, ); if (res.data['code'] == 0) { ReplyData replyData = ReplyData.fromJson(res.data['data']); @@ -155,7 +156,7 @@ class ReplyHttp { 'sort': 1, if (isLogin) 'csrf': Accounts.main.csrf, }, - options: !isLogin ? _options : null, + options: !isLogin ? options : null, ); if (res.data['code'] == 0) { ReplyReplyData replyData = ReplyReplyData.fromJson(res.data['data']); diff --git a/lib/utils/accounts/account.dart b/lib/utils/accounts/account.dart index 4e6cbcba8..668066f61 100644 --- a/lib/utils/accounts/account.dart +++ b/lib/utils/accounts/account.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/models/common/account_type.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -48,9 +49,11 @@ class LoginAccount implements Account { @override late final Map headers = { + ...Constants.baseHeaders, 'x-bili-mid': _midStr, 'x-bili-aurora-eid': IdUtils.genAuroraEid(mid), }; + @override late String csrf = cookieJar.domainCookies['bilibili.com']!['/']!['bili_jct']!.cookie.value; @@ -120,7 +123,7 @@ class AnonymousAccount implements Account { @override String csrf = ''; @override - final Map headers = const {}; + final Map headers = Constants.baseHeaders; @override bool activited = false; @@ -204,3 +207,53 @@ extension BiliCookieJar on DefaultCookieJar { }, }; } + +class NoAccount implements Account { + @override + String? accessKey; + + @override + bool activited = false; + + @override + DefaultCookieJar cookieJar = DefaultCookieJar(); + + @override + String csrf = ''; + + @override + String? refresh; + + @override + Set type = const {}; + + @override + Future delete() { + return Future.value(); + } + + @override + final Map headers = const {}; + + @override + bool isLogin = false; + + @override + int mid = 0; + + @override + Future onChange() { + return Future.value(); + } + + @override + Map? toJson() { + return null; + } + + NoAccount._(); + + static final _instance = NoAccount._(); + + factory NoAccount() => _instance; +} diff --git a/lib/utils/accounts/account_manager/account_mgr.dart b/lib/utils/accounts/account_manager/account_mgr.dart index 69d190ddd..48040c8a9 100644 --- a/lib/utils/accounts/account_manager/account_mgr.dart +++ b/lib/utils/accounts/account_manager/account_mgr.dart @@ -95,19 +95,19 @@ class AccountManager extends Interceptor { void onRequest(RequestOptions options, RequestInterceptorHandler handler) { final path = options.path; - if (_skipCookie(path)) return handler.next(options); + late final Account account = options.extra['account'] ?? _findAccount(path); - final Account account = options.extra['account'] ?? _findAccount(path); + if (_skipCookie(path) || account is NoAccount) return handler.next(options); - if (account.isLogin) { - options.headers.addAll(account.headers); - } else if (path == Api.heartBeat) { + if (!account.isLogin && path == Api.heartBeat) { return handler.reject( DioException.requestCancelled(requestOptions: options, reason: null), false, ); } + options.headers.addAll(account.headers); + // app端不需要管理cookie if (path.startsWith(HttpString.appBaseUrl)) { // if (kDebugMode) debugPrint('is app: ${options.path}'); @@ -130,11 +130,6 @@ class AccountManager extends Interceptor { } return handler.next(options); } else { - if (account is AnonymousAccount && options.extra['checkReply'] == true) { - options.headers[HttpHeaders.cookieHeader] = ''; - handler.next(options); - return; - } account.cookieJar .loadForRequest(options.uri) .then((cookies) { diff --git a/lib/utils/update.dart b/lib/utils/update.dart index 3e5f1921a..5750d60b4 100644 --- a/lib/utils/update.dart +++ b/lib/utils/update.dart @@ -3,10 +3,12 @@ import 'dart:io' show Platform; import 'package:PiliPlus/build_config.dart'; import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; +import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -17,7 +19,13 @@ class Update { if (kDebugMode) return; SmartDialog.dismiss(); try { - final res = await Request().get(Api.latestApp, uaType: 'mob'); + final res = await Request().get( + Api.latestApp, + options: Options( + headers: {'user-agent': Request.headerUa()}, + extra: {'account': NoAccount()}, + ), + ); if (res.data is Map || res.data.isEmpty) { if (!isAuto) { SmartDialog.showToast('检查更新失败,GitHub接口未返回数据,请检查网络');