Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-06-22 20:57:21 +08:00
parent bc3ce66322
commit c6a377b9d4
15 changed files with 175 additions and 165 deletions

View File

@@ -21,16 +21,17 @@ class Constants {
static const String traceId = static const String traceId =
'11111111111111111111111111111111:1111111111111111:0:0'; '11111111111111111111111111111111:1111111111111111:0:0';
static const String userAgent = static const String userAgent =
'Mozilla/5.0 BiliDroid/1.46.2 (bbcallen@gmail.com) os/android model/vivo mobi_app/android_hd build/2001100 channel/yingyongbao innerVer/2001100 osVer/14 network/2'; 'Mozilla/5.0 BiliDroid/2.0.1 (bbcallen@gmail.com) os/android model/android_hd mobi_app/android_hd build/2001100 channel/master innerVer/2001100 osVer/15 network/2';
static const String statistics = static const String statistics =
'{"appId":5,"platform":3,"version":"1.46.2","abtest":""}'; '{"appId":5,"platform":3,"version":"2.0.1","abtest":""}';
// 请求时会自动encodeComponent // 请求时会自动encodeComponent
// app // app
static const String userAgentApp = static const String userAgentApp =
'Mozilla/5.0 BiliDroid/8.43.0 (bbcallen@gmail.com) os/android model/android mobi_app/android build/8430300 channel/bili innerVer/8430300 osVer/15 network/2'; 'Mozilla/5.0 BiliDroid/8.43.0 (bbcallen@gmail.com) os/android model/android mobi_app/android build/8430300 channel/master innerVer/8430300 osVer/15 network/2';
static const String statisticsApp = static const String statisticsApp =
'{"appId":5,"platform":3,"version":"8.43.0","abtest":""}'; '{"appId":1,"platform":3,"version":"8.43.0","abtest":""}';
static const urlPattern = static const urlPattern =
r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'; r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]';

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart'; import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
@@ -9,7 +10,7 @@ class DmGrpc {
required int segmentIndex, required int segmentIndex,
int type = 1, int type = 1,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.dmSegMobile, GrpcUrl.dmSegMobile,
DmSegMobileReq( DmSegMobileReq(
oid: Int64(cid), oid: Int64(cid),

View File

@@ -1,5 +1,11 @@
import 'package:PiliPlus/grpc/bilibili/app/dynamic/v1.pb.dart'; import 'package:PiliPlus/grpc/bilibili/app/dynamic/v1.pb.dart'
import 'package:PiliPlus/grpc/grpc_repo.dart'; show DynRedReq, TabOffset, DynRedReply;
import 'package:PiliPlus/grpc/bilibili/app/dynamic/v2.pb.dart'
show OpusType, OpusDetailReq, OpusDetailResp;
import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:fixnum/fixnum.dart';
class DynGrpc { class DynGrpc {
// static Future dynSpace({ // static Future dynSpace({
@@ -19,11 +25,25 @@ class DynGrpc {
// } // }
static Future<int?> dynRed() async { static Future<int?> dynRed() async {
final res = await GrpcRepo.request( final res = await GrpcReq.request(
GrpcUrl.dynRed, GrpcUrl.dynRed,
DynRedReq(tabOffset: [TabOffset(tab: 1)]), DynRedReq(tabOffset: [TabOffset(tab: 1)]),
DynRedReply.fromBuffer, DynRedReply.fromBuffer,
); );
return res.dataOrNull?.dynRedItem.count.toInt(); return res.dataOrNull?.dynRedItem.count.toInt();
} }
static Future<LoadingState<OpusDetailResp>> opusDetail({
OpusType? opusType,
required int oid,
}) async {
return GrpcReq.request(
GrpcUrl.opusDetail,
OpusDetailReq(
opusType: opusType,
oid: Int64(oid),
),
OpusDetailResp.fromBuffer,
);
}
} }

View File

@@ -7,7 +7,6 @@ import 'package:PiliPlus/grpc/bilibili/metadata/device.pb.dart';
import 'package:PiliPlus/grpc/bilibili/metadata/fawkes.pb.dart'; import 'package:PiliPlus/grpc/bilibili/metadata/fawkes.pb.dart';
import 'package:PiliPlus/grpc/bilibili/metadata/locale.pb.dart'; import 'package:PiliPlus/grpc/bilibili/metadata/locale.pb.dart';
import 'package:PiliPlus/grpc/bilibili/metadata/network.pb.dart' as network; import 'package:PiliPlus/grpc/bilibili/metadata/network.pb.dart' as network;
import 'package:PiliPlus/grpc/bilibili/metadata/restriction.pb.dart';
import 'package:PiliPlus/grpc/google/rpc/status.pb.dart'; import 'package:PiliPlus/grpc/google/rpc/status.pb.dart';
import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/init.dart';
@@ -18,64 +17,16 @@ import 'package:PiliPlus/utils/login_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:archive/archive.dart'; import 'package:archive/archive.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:protobuf/protobuf.dart' show GeneratedMessage; import 'package:protobuf/protobuf.dart' show GeneratedMessage;
class GrpcUrl { class GrpcReq {
// static const playerOnline =
// '/bilibili.app.playeronline.v1.PlayerOnline/PlayerOnline';
// static const popular = '/bilibili.app.show.v1.Popular/Index';
// dynamic
static const dynV1 = '/bilibili.app.dynamic.v1.Dynamic';
static const dynV2 = '/bilibili.app.dynamic.v2.Dynamic';
static const opusV2 = '/bilibili.app.dynamic.v2.Opus';
static const dynRed = '$dynV1/DynRed';
static const opusSpaceFlow = '$opusV2/OpusSpaceFlow';
// static const dynSpace = '$dynV2/DynSpace';
// danmaku
static const dmSegMobile = '/bilibili.community.service.dm.v1.DM/DmSegMobile';
// reply
static const reply = '/bilibili.main.community.reply.v1.Reply';
static const mainList = '$reply/MainList';
static const detailList = '$reply/DetailList';
static const dialogList = '$reply/DialogList';
// static const replyInfo = '$reply/ReplyInfo';
// im
static const im = '/bilibili.im.interface.v1.ImInterface';
static const im2 = '/bilibili.app.im.v1.im';
static const sendMsg = '$im/SendMsg';
static const shareList = '$im/ShareList';
static const sessionMain = '$im2/SessionMain';
static const sessionSecondary = '$im2/SessionSecondary';
static const clearUnread = '$im2/ClearUnread';
static const sessionUpdate = '$im2/SessionUpdate';
static const pinSession = '$im2/PinSession';
static const unpinSession = '$im2/UnpinSession';
static const deleteSessionList = '$im2/DeleteSessionList';
static const getImSettings = '$im2/GetImSettings';
static const setImSettings = '$im2/SetImSettings';
static const keywordBlockingList = '$im2/KeywordBlockingList';
static const keywordBlockingAdd = '$im2/KeywordBlockingAdd';
static const keywordBlockingDelete = '$im2/KeywordBlockingDelete';
static const syncFetchSessionMsgs = '$im/SyncFetchSessionMsgs';
static const getTotalUnread = '$im/GetTotalUnread';
// view
static const viewunite = '/bilibili.app.viewunite.v1.View';
static const view = '$viewunite/View';
}
class GrpcRepo {
static String? _accessKey = Accounts.main.accessKey; static String? _accessKey = Accounts.main.accessKey;
static const _build = 2001100; static const _build = 2001100;
static const _biliChannel = 'bili'; static const _versionName = '2.0.1';
static const _biliChannel = 'master';
static const _mobiApp = 'android_hd'; static const _mobiApp = 'android_hd';
static const _phone = 'phone'; static const _device = 'android';
static final _buvid = LoginUtils.buvid; static final _buvid = LoginUtils.buvid;
static final _traceId = IdUtils.genTraceId(); static final _traceId = IdUtils.genTraceId();
@@ -91,19 +42,20 @@ class GrpcRepo {
headers['x-bili-metadata-bin'] = base64Encode(Metadata( headers['x-bili-metadata-bin'] = base64Encode(Metadata(
accessKey: _accessKey ?? '', accessKey: _accessKey ?? '',
mobiApp: _mobiApp, mobiApp: _mobiApp,
device: _phone, device: _device,
build: _build, build: _build,
channel: _biliChannel, channel: _biliChannel,
buvid: _buvid, buvid: _buvid,
platform: _mobiApp, platform: _device,
).writeToBuffer()); ).writeToBuffer());
options = Options(headers: headers, responseType: ResponseType.bytes);
} }
static final Map<String, String> headers = { static final Map<String, String> headers = {
Headers.contentTypeHeader: 'application/grpc', Headers.contentTypeHeader: 'application/grpc',
'grpc-encoding': 'gzip', 'grpc-encoding': 'gzip',
'gzip-accept-encoding': 'gzip,identity', 'gzip-accept-encoding': 'gzip,identity',
'user-agent': '${Constants.userAgent} grpc-java-cronet/1.36.1', 'user-agent': Constants.userAgent,
'x-bili-gaia-vtoken': '', 'x-bili-gaia-vtoken': '',
'x-bili-aurora-zone': '', 'x-bili-aurora-zone': '',
'x-bili-trace-id': _traceId, 'x-bili-trace-id': _traceId,
@@ -111,58 +63,45 @@ class GrpcRepo {
'buvid': _buvid, 'buvid': _buvid,
'bili-http-engine': 'cronet', 'bili-http-engine': 'cronet',
'te': 'trailers', 'te': 'trailers',
'x-bili-fawkes-req-bin': base64Encode( 'x-bili-fawkes-req-bin': base64Encode(FawkesReq(
FawkesReq(appkey: _mobiApp, env: 'prod', sessionId: _sessionId) appkey: _mobiApp,
.writeToBuffer()), env: 'prod',
sessionId: _sessionId,
).writeToBuffer()),
'x-bili-metadata-bin': base64Encode(Metadata( 'x-bili-metadata-bin': base64Encode(Metadata(
accessKey: _accessKey ?? '', accessKey: _accessKey ?? '',
mobiApp: _mobiApp, mobiApp: _mobiApp,
device: _phone, device: _device,
build: _build, build: _build,
channel: _biliChannel, channel: _biliChannel,
buvid: _buvid, buvid: _buvid,
platform: _mobiApp, platform: _device,
).writeToBuffer()), ).writeToBuffer()),
'x-bili-device-bin': base64Encode(Device( 'x-bili-device-bin': base64Encode(Device(
appId: 1, appId: 5,
build: _build, build: _build,
buvid: _buvid, buvid: _buvid,
mobiApp: _mobiApp, mobiApp: _mobiApp,
platform: _mobiApp, platform: _device,
device: _phone,
channel: _biliChannel, channel: _biliChannel,
brand: _phone, brand: _device,
model: _phone, model: _device,
osver: '14', osver: '15',
fpLocal: '', versionName: _versionName,
fpRemote: '', ).writeToBuffer()),
versionName: _build.toString(),
fp: '',
fts: Int64())
.writeToBuffer()),
'x-bili-network-bin': base64Encode(network.Network( 'x-bili-network-bin': base64Encode(network.Network(
type: network.NetworkType.WIFI, type: network.NetworkType.WIFI,
tf: network.TFType.TF_UNKNOWN, ).writeToBuffer()),
oid: '')
.writeToBuffer()),
'x-bili-restriction-bin': base64Encode(Restriction(
teenagersMode: false,
lessonsMode: false,
mode: ModeType.NORMAL,
review: false,
disableRcmd: false,
basicMode: false)
.writeToBuffer()),
'x-bili-locale-bin': base64Encode(Locale( 'x-bili-locale-bin': base64Encode(Locale(
cLocale: LocaleIds(language: 'zh', region: 'CN'), cLocale: LocaleIds(language: 'zh', region: 'CN', script: 'Hans'),
sLocale: LocaleIds(language: 'zh', region: 'CN'), sLocale: LocaleIds(language: 'zh', region: 'CN', script: 'Hans'),
simCode: '', timezone: 'Asia/Shanghai',
timezone: 'Asia/Shanghai') ).writeToBuffer()),
.writeToBuffer()),
'x-bili-exps-bin': '', 'x-bili-exps-bin': '',
}; };
static final _unprintableRegExp = RegExp(r"[^\u4e00-\u9fa5UP]"); static Options options =
Options(headers: headers, responseType: ResponseType.bytes);
static Uint8List compressProtobuf(Uint8List proto) { static Uint8List compressProtobuf(Uint8List proto) {
proto = const GZipEncoder().encodeBytes(proto); proto = const GZipEncoder().encodeBytes(proto);
@@ -186,8 +125,7 @@ class GrpcRepo {
static Future<LoadingState<T>> request<T>(String url, static Future<LoadingState<T>> request<T>(String url,
GeneratedMessage request, T Function(Uint8List) grpcParser) async { GeneratedMessage request, T Function(Uint8List) grpcParser) async {
final response = await Request().post(HttpString.appBaseUrl + url, final response = await Request().post(HttpString.appBaseUrl + url,
data: compressProtobuf(request.writeToBuffer()), data: compressProtobuf(request.writeToBuffer()), options: options);
options: Options(headers: headers, responseType: ResponseType.bytes));
if (response.data is Map) { if (response.data is Map) {
return Error(response.data['message']); return Error(response.data['message']);
@@ -219,9 +157,7 @@ class GrpcRepo {
? 'CODE: ${grpcMsg.code}(${grpcMsg.message})\nMSG: $errMsg' ? 'CODE: ${grpcMsg.code}(${grpcMsg.message})\nMSG: $errMsg'
: errMsg; : errMsg;
} catch (e) { } catch (e) {
msg = utf8 msg = utf8.decode(msgBytes, allowMalformed: true);
.decode(msgBytes, allowMalformed: true)
.replaceAll(_unprintableRegExp, '');
} }
} }
return Error(msg); return Error(msg);

View File

@@ -1,7 +1,8 @@
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'; import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';
import 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart'; import 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart';
import 'package:PiliPlus/grpc/bilibili/im/type.pb.dart'; import 'package:PiliPlus/grpc/bilibili/im/type.pb.dart';
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
import 'package:protobuf/protobuf.dart' show PbMap; import 'package:protobuf/protobuf.dart' show PbMap;
@@ -14,7 +15,7 @@ class ImGrpc {
required String content, required String content,
MsgType msgType = MsgType.EN_MSG_TYPE_TEXT, MsgType msgType = MsgType.EN_MSG_TYPE_TEXT,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.sendMsg, GrpcUrl.sendMsg,
ReqSendMsg( ReqSendMsg(
msg: Msg( msg: Msg(
@@ -34,7 +35,7 @@ class ImGrpc {
} }
static Future<LoadingState<RspShareList>> shareList({int size = 10}) { static Future<LoadingState<RspShareList>> shareList({int size = 10}) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.shareList, GrpcUrl.shareList,
ReqShareList(size: size), ReqShareList(size: size),
RspShareList.fromBuffer, RspShareList.fromBuffer,
@@ -46,7 +47,7 @@ class ImGrpc {
Int64? endSeqno, Int64? endSeqno,
Int64? beginSeqno, Int64? beginSeqno,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.syncFetchSessionMsgs, GrpcUrl.syncFetchSessionMsgs,
ReqSessionMsg( ReqSessionMsg(
talkerId: Int64(talkerId), talkerId: Int64(talkerId),
@@ -63,7 +64,7 @@ class ImGrpc {
static Future<LoadingState<SessionMainReply>> sessionMain({ static Future<LoadingState<SessionMainReply>> sessionMain({
PbMap<int, Offset>? offset, PbMap<int, Offset>? offset,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.sessionMain, GrpcUrl.sessionMain,
SessionMainReq( SessionMainReq(
paginationParams: PaginationParams(offsets: offset), paginationParams: PaginationParams(offsets: offset),
@@ -76,7 +77,7 @@ class ImGrpc {
PbMap<int, Offset>? offset, PbMap<int, Offset>? offset,
SessionPageType? pageType, SessionPageType? pageType,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.sessionSecondary, GrpcUrl.sessionSecondary,
SessionSecondaryReq( SessionSecondaryReq(
paginationParams: PaginationParams(offsets: offset), paginationParams: PaginationParams(offsets: offset),
@@ -90,7 +91,7 @@ class ImGrpc {
SessionPageType? pageType, SessionPageType? pageType,
SessionId? sessionId, SessionId? sessionId,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.clearUnread, GrpcUrl.clearUnread,
ClearUnreadReq( ClearUnreadReq(
pageType: pageType, pageType: pageType,
@@ -104,7 +105,7 @@ class ImGrpc {
SessionPageType? pageType, SessionPageType? pageType,
SessionId? sessionId, SessionId? sessionId,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.sessionUpdate, GrpcUrl.sessionUpdate,
SessionUpdateReq( SessionUpdateReq(
pageType: pageType, pageType: pageType,
@@ -118,7 +119,7 @@ class ImGrpc {
SessionId? sessionId, SessionId? sessionId,
Int64? topTimeMicros, Int64? topTimeMicros,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.pinSession, GrpcUrl.pinSession,
PinSessionReq( PinSessionReq(
sessionId: sessionId, sessionId: sessionId,
@@ -131,7 +132,7 @@ class ImGrpc {
static Future<LoadingState<UnPinSessionReply>> unpinSession({ static Future<LoadingState<UnPinSessionReply>> unpinSession({
SessionId? sessionId, SessionId? sessionId,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.unpinSession, GrpcUrl.unpinSession,
UnPinSessionReq( UnPinSessionReq(
sessionId: sessionId, sessionId: sessionId,
@@ -143,7 +144,7 @@ class ImGrpc {
static Future<LoadingState<DeleteSessionListReply>> deleteSessionList({ static Future<LoadingState<DeleteSessionListReply>> deleteSessionList({
SessionPageType? pageType, SessionPageType? pageType,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.deleteSessionList, GrpcUrl.deleteSessionList,
DeleteSessionListReq( DeleteSessionListReq(
pageType: pageType, pageType: pageType,
@@ -154,7 +155,7 @@ class ImGrpc {
static Future<LoadingState<GetImSettingsReply>> getImSettings( static Future<LoadingState<GetImSettingsReply>> getImSettings(
{IMSettingType? type}) { {IMSettingType? type}) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.getImSettings, GrpcUrl.getImSettings,
GetImSettingsReq( GetImSettingsReq(
type: type, type: type,
@@ -165,7 +166,7 @@ class ImGrpc {
static Future<LoadingState<SetImSettingsReply>> setImSettings( static Future<LoadingState<SetImSettingsReply>> setImSettings(
{PbMap<int, Setting>? settings}) { {PbMap<int, Setting>? settings}) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.setImSettings, GrpcUrl.setImSettings,
SetImSettingsReq( SetImSettingsReq(
settings: settings, settings: settings,
@@ -175,7 +176,7 @@ class ImGrpc {
} }
static Future<LoadingState<KeywordBlockingListReply>> keywordBlockingList() { static Future<LoadingState<KeywordBlockingListReply>> keywordBlockingList() {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.keywordBlockingList, GrpcUrl.keywordBlockingList,
KeywordBlockingListReq(), KeywordBlockingListReq(),
KeywordBlockingListReply.fromBuffer, KeywordBlockingListReply.fromBuffer,
@@ -184,7 +185,7 @@ class ImGrpc {
static Future<LoadingState<KeywordBlockingAddReply>> keywordBlockingAdd( static Future<LoadingState<KeywordBlockingAddReply>> keywordBlockingAdd(
String keyword) { String keyword) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.keywordBlockingAdd, GrpcUrl.keywordBlockingAdd,
KeywordBlockingAddReq(keyword: keyword), KeywordBlockingAddReq(keyword: keyword),
KeywordBlockingAddReply.fromBuffer, KeywordBlockingAddReply.fromBuffer,
@@ -193,7 +194,7 @@ class ImGrpc {
static Future<LoadingState<KeywordBlockingDeleteReply>> keywordBlockingDelete( static Future<LoadingState<KeywordBlockingDeleteReply>> keywordBlockingDelete(
String keyword) { String keyword) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.keywordBlockingDelete, GrpcUrl.keywordBlockingDelete,
KeywordBlockingDeleteReq(keyword: keyword), KeywordBlockingDeleteReq(keyword: keyword),
KeywordBlockingDeleteReply.fromBuffer, KeywordBlockingDeleteReply.fromBuffer,
@@ -202,7 +203,7 @@ class ImGrpc {
static Future<LoadingState<RspTotalUnread>> getTotalUnread( static Future<LoadingState<RspTotalUnread>> getTotalUnread(
{int? unreadType}) { {int? unreadType}) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.getTotalUnread, GrpcUrl.getTotalUnread,
ReqTotalUnread(unreadType: unreadType, showUnfollowList: 1), ReqTotalUnread(unreadType: unreadType, showUnfollowList: 1),
RspTotalUnread.fromBuffer, RspTotalUnread.fromBuffer,

View File

@@ -1,7 +1,8 @@
import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'; import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart';
import 'package:PiliPlus/grpc/bilibili/pagination.pb.dart'; import 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
@@ -45,7 +46,7 @@ class ReplyGrpc {
required String? offset, required String? offset,
required Int64? cursorNext, required Int64? cursorNext,
}) async { }) async {
final res = await GrpcRepo.request( final res = await GrpcReq.request(
GrpcUrl.mainList, GrpcUrl.mainList,
MainListReq( MainListReq(
oid: Int64(oid), oid: Int64(oid),
@@ -87,7 +88,7 @@ class ReplyGrpc {
required Mode mode, required Mode mode,
required String? offset, required String? offset,
}) async { }) async {
final res = await GrpcRepo.request( final res = await GrpcReq.request(
GrpcUrl.detailList, GrpcUrl.detailList,
DetailListReq( DetailListReq(
oid: Int64(oid), oid: Int64(oid),
@@ -111,7 +112,7 @@ class ReplyGrpc {
required int dialog, required int dialog,
required String? offset, required String? offset,
}) async { }) async {
final res = await GrpcRepo.request( final res = await GrpcReq.request(
GrpcUrl.dialogList, GrpcUrl.dialogList,
DialogListReq( DialogListReq(
oid: Int64(oid), oid: Int64(oid),

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/grpc/bilibili/app/dynamic/v2.pb.dart'; import 'package:PiliPlus/grpc/bilibili/app/dynamic/v2.pb.dart';
import 'package:PiliPlus/grpc/bilibili/pagination.pb.dart'; import 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
@@ -10,7 +11,7 @@ class SpaceGrpc {
String? next, String? next,
required String filterType, required String filterType,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.opusSpaceFlow, GrpcUrl.opusSpaceFlow,
OpusSpaceFlowReq( OpusSpaceFlowReq(
hostMid: Int64(hostMid), hostMid: Int64(hostMid),

48
lib/grpc/url.dart Normal file
View File

@@ -0,0 +1,48 @@
class GrpcUrl {
// static const playerOnline =
// '/bilibili.app.playeronline.v1.PlayerOnline/PlayerOnline';
// static const popular = '/bilibili.app.show.v1.Popular/Index';
// dynamic
static const dynV1 = '/bilibili.app.dynamic.v1.Dynamic';
// static const dynV2 = '/bilibili.app.dynamic.v2.Dynamic';
static const opusV2 = '/bilibili.app.dynamic.v2.Opus';
static const dynRed = '$dynV1/DynRed';
static const opusSpaceFlow = '$opusV2/OpusSpaceFlow';
static const opusDetail = '$opusV2/OpusDetail';
// static const dynSpace = '$dynV2/DynSpace';
// danmaku
static const dmSegMobile = '/bilibili.community.service.dm.v1.DM/DmSegMobile';
// reply
static const reply = '/bilibili.main.community.reply.v1.Reply';
static const mainList = '$reply/MainList';
static const detailList = '$reply/DetailList';
static const dialogList = '$reply/DialogList';
// static const replyInfo = '$reply/ReplyInfo';
// im
static const im = '/bilibili.im.interface.v1.ImInterface';
static const im2 = '/bilibili.app.im.v1.im';
static const sendMsg = '$im/SendMsg';
static const shareList = '$im/ShareList';
static const sessionMain = '$im2/SessionMain';
static const sessionSecondary = '$im2/SessionSecondary';
static const clearUnread = '$im2/ClearUnread';
static const sessionUpdate = '$im2/SessionUpdate';
static const pinSession = '$im2/PinSession';
static const unpinSession = '$im2/UnpinSession';
static const deleteSessionList = '$im2/DeleteSessionList';
static const getImSettings = '$im2/GetImSettings';
static const setImSettings = '$im2/SetImSettings';
static const keywordBlockingList = '$im2/KeywordBlockingList';
static const keywordBlockingAdd = '$im2/KeywordBlockingAdd';
static const keywordBlockingDelete = '$im2/KeywordBlockingDelete';
static const syncFetchSessionMsgs = '$im/SyncFetchSessionMsgs';
static const getTotalUnread = '$im/GetTotalUnread';
// view
static const viewunite = '/bilibili.app.viewunite.v1.View';
static const view = '$viewunite/View';
}

View File

@@ -1,13 +1,14 @@
import 'package:PiliPlus/grpc/bilibili/app/viewunite/v1.pb.dart' import 'package:PiliPlus/grpc/bilibili/app/viewunite/v1.pb.dart'
show ViewReq, ViewReply; show ViewReq, ViewReply;
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/grpc/url.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
class ViewGrpc { class ViewGrpc {
static Future<LoadingState<ViewReply>> view({ static Future<LoadingState<ViewReply>> view({
required String bvid, required String bvid,
}) { }) {
return GrpcRepo.request( return GrpcReq.request(
GrpcUrl.view, GrpcUrl.view,
ViewReq( ViewReq(
bvid: bvid, bvid: bvid,

View File

@@ -164,10 +164,10 @@ class LiveHttp {
if (isLogin) 'access_key': Accounts.main.accessKey, if (isLogin) 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'device_name': 'vivo', 'device_name': 'android',
'device_type': '0', 'device_type': '0',
'fnval': '912', 'fnval': '912',
'disable_rcmd': '0', 'disable_rcmd': '0',
@@ -180,7 +180,7 @@ class LiveHttp {
if (isLogin) 'relation_page': '1', if (isLogin) 'relation_page': '1',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'scale': '2', 'scale': '2',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
}; };
AppSign.appSign( AppSign.appSign(
@@ -229,10 +229,10 @@ class LiveHttp {
'actionKey': 'appkey', 'actionKey': 'appkey',
if (areaId != null) 'area_id': areaId, if (areaId != null) 'area_id': areaId,
if (parentAreaId != null) 'parent_area_id': parentAreaId, if (parentAreaId != null) 'parent_area_id': parentAreaId,
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'device_name': 'vivo', 'device_name': 'android',
'device_type': '0', 'device_type': '0',
'fnval': '912', 'fnval': '912',
'disable_rcmd': '0', 'disable_rcmd': '0',
@@ -248,7 +248,7 @@ class LiveHttp {
'tag_version': '1', 'tag_version': '1',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'scale': '2', 'scale': '2',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(), 'ts': (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(),
}; };
AppSign.appSign( AppSign.appSign(
@@ -274,14 +274,14 @@ class LiveHttp {
if (isLogin) 'access_key': Accounts.main.accessKey, if (isLogin) 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'disable_rcmd': '0', 'disable_rcmd': '0',
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
}; };
AppSign.appSign( AppSign.appSign(
@@ -309,14 +309,14 @@ class LiveHttp {
if (isLogin) 'access_key': Accounts.main.accessKey, if (isLogin) 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'disable_rcmd': '0', 'disable_rcmd': '0',
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
}; };
AppSign.appSign( AppSign.appSign(
@@ -347,14 +347,14 @@ class LiveHttp {
'access_key': Accounts.main.accessKey, 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'disable_rcmd': '0', 'disable_rcmd': '0',
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
}; };
AppSign.appSign( AppSign.appSign(
@@ -385,7 +385,7 @@ class LiveHttp {
if (isLogin) 'access_key': Accounts.main.accessKey, if (isLogin) 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'disable_rcmd': '0', 'disable_rcmd': '0',
@@ -395,7 +395,7 @@ class LiveHttp {
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
}; };
AppSign.appSign( AppSign.appSign(
@@ -426,7 +426,7 @@ class LiveHttp {
if (isLogin) 'access_key': Accounts.main.accessKey, if (isLogin) 'access_key': Accounts.main.accessKey,
'appkey': Constants.appKey, 'appkey': Constants.appKey,
'actionKey': 'appkey', 'actionKey': 'appkey',
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'device': 'pad', 'device': 'pad',
'page': page, 'page': page,
@@ -436,7 +436,7 @@ class LiveHttp {
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
'statistics': Constants.statistics, 'statistics': Constants.statisticsApp,
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000, 'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
'type': type.name, 'type': type.name,
}; };

View File

@@ -98,7 +98,7 @@ class LoginHttp {
'build': '2001100', 'build': '2001100',
'buvid': buvid, 'buvid': buvid,
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'channel': 'yingyongbao', 'channel': 'master',
'cid': cid, 'cid': cid,
// if (deviceTouristId != null) 'device_tourist_id': deviceTouristId, // if (deviceTouristId != null) 'device_tourist_id': deviceTouristId,
'disable_rcmd': '0', 'disable_rcmd': '0',
@@ -147,7 +147,7 @@ class LoginHttp {
// 'build': '2001100', // 'build': '2001100',
// 'buvid': buvid, // 'buvid': buvid,
// 'c_locale': 'zh_CN', // 'c_locale': 'zh_CN',
// 'channel': 'yingyongbao', // 'channel': 'master',
// 'deviceInfo': 'xxxxxx', // 'deviceInfo': 'xxxxxx',
// 'disable_rcmd': '0', // 'disable_rcmd': '0',
// 'dt': Uri.encodeComponent(Encrypter(RSA(publicKey: publicKey)) // 'dt': Uri.encodeComponent(Encrypter(RSA(publicKey: publicKey))
@@ -199,7 +199,7 @@ class LoginHttp {
'build': '2001100', 'build': '2001100',
'buvid': buvid, 'buvid': buvid,
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'channel': 'yingyongbao', 'channel': 'master',
'device': 'phone', 'device': 'phone',
'device_id': deviceId, 'device_id': deviceId,
//'device_meta': '', //'device_meta': '',
@@ -267,7 +267,7 @@ class LoginHttp {
'buvid': buvid, 'buvid': buvid,
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'captcha_key': captchaKey, 'captcha_key': captchaKey,
'channel': 'yingyongbao', 'channel': 'master',
'cid': cid, 'cid': cid,
'code': code, 'code': code,
'device': 'phone', 'device': 'phone',
@@ -441,7 +441,7 @@ class LoginHttp {
'build': '2001100', 'build': '2001100',
'buvid': buvid, 'buvid': buvid,
// 'c_locale': 'zh_CN', // 'c_locale': 'zh_CN',
// 'channel': 'yingyongbao', // 'channel': 'master',
'code': code, 'code': code,
// 'device': 'phone', // 'device': 'phone',
// 'device_id': deviceId, // 'device_id': deviceId,

View File

@@ -245,7 +245,7 @@ class SearchHttp {
final res = await Request().get( final res = await Request().get(
Api.searchRecommend, Api.searchRecommend,
queryParameters: { queryParameters: {
'build': '8350200', 'build': '8430300',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'mobi_app': 'android', 'mobi_app': 'android',
'platform': 'android', 'platform': 'android',

View File

@@ -76,10 +76,10 @@ class VideoHttp {
Map<String, String> data = { Map<String, String> data = {
'build': '2001100', 'build': '2001100',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'channel': 'yingyongbao', 'channel': 'master',
'column': '4', 'column': '4',
'device': 'pad', 'device': 'pad',
'device_name': 'vivo', 'device_name': 'android',
'device_type': '0', 'device_type': '0',
'disable_rcmd': '0', 'disable_rcmd': '0',
'flush': '5', 'flush': '5',

View File

@@ -64,9 +64,9 @@ class _EditProfilePageState extends State<EditProfilePage> {
Future<void> _getInfo() async { Future<void> _getInfo() async {
Map<String, String> data = { Map<String, String> data = {
'build': '1462100', 'build': '2001100',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'channel': 'yingyongbao', 'channel': 'master',
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',
@@ -336,9 +336,9 @@ class _EditProfilePageState extends State<EditProfilePage> {
} }
Map<String, String> data = { Map<String, String> data = {
'access_key': accessKey!, 'access_key': accessKey!,
'build': '1462100', 'build': '2001100',
'c_locale': 'zh_CN', 'c_locale': 'zh_CN',
'channel': 'yingyongbao', 'channel': 'master',
'mobi_app': 'android_hd', 'mobi_app': 'android_hd',
'platform': 'android', 'platform': 'android',
's_locale': 'zh_CN', 's_locale': 'zh_CN',

View File

@@ -1,6 +1,6 @@
import 'dart:math'; import 'dart:math';
import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart'; import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
@@ -26,7 +26,7 @@ class LoginUtils {
static Future<void> onLoginMain() async { static Future<void> onLoginMain() async {
final account = Accounts.main; final account = Accounts.main;
GrpcRepo.updateHeaders(account.accessKey); GrpcReq.updateHeaders(account.accessKey);
try { try {
final cookies = account.cookieJar.toList(); final cookies = account.cookieJar.toList();
final webManager = web.CookieManager(); final webManager = web.CookieManager();
@@ -105,7 +105,7 @@ class LoginUtils {
..face.value = '' ..face.value = ''
..isLogin.value = false; ..isLogin.value = false;
GrpcRepo.updateHeaders(null); GrpcReq.updateHeaders(null);
await Future.wait([ await Future.wait([
web.CookieManager().deleteAllCookies(), web.CookieManager().deleteAllCookies(),