mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-03 01:28:17 +08:00
feat: webview geetest (#1342)
* feat: webview geetest * opt: geetest * fix: linux * remove pwd mobile check * fix linux check
This commit is contained in:
committed by
GitHub
parent
ee8af925be
commit
e3e6bb0e39
135
lib/pages/login/geetest/geetest_webview_dialog.dart
Normal file
135
lib/pages/login/geetest/geetest_webview_dialog.dart
Normal file
@@ -0,0 +1,135 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:PiliPlus/http/init.dart';
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/http/ua_type.dart';
|
||||
import 'package:PiliPlus/main.dart';
|
||||
import 'package:PiliPlus/utils/accounts/account.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class GeetestWebviewDialog extends StatelessWidget {
|
||||
const GeetestWebviewDialog(this.gt, this.challenge, {super.key});
|
||||
|
||||
final String gt;
|
||||
final String challenge;
|
||||
|
||||
static const _geetestJsUri =
|
||||
'https://static.geetest.com/static/js/fullpage.0.0.0.js';
|
||||
|
||||
static Future<LoadingState<String>> _getConfig(
|
||||
String gt,
|
||||
String challenge,
|
||||
) async {
|
||||
final res = await Request().get<String>(
|
||||
'https://api.geetest.com/gettype.php',
|
||||
queryParameters: {'gt': gt},
|
||||
options: Options(
|
||||
responseType: ResponseType.plain,
|
||||
extra: {'account': const NoAccount()},
|
||||
),
|
||||
);
|
||||
if (res.data case String data) {
|
||||
if (data.startsWith('(') && data.endsWith(')')) {
|
||||
final Map<String, dynamic> config;
|
||||
try {
|
||||
config = jsonDecode(data.substring(1, data.length - 1));
|
||||
} catch (e) {
|
||||
return Error(e.toString());
|
||||
}
|
||||
if (config['status'] == 'success') {
|
||||
return Success(
|
||||
jsonEncode(
|
||||
config['data'] as Map<String, dynamic>..addAll({
|
||||
"gt": gt,
|
||||
"challenge": challenge,
|
||||
"offline": false,
|
||||
"new_captcha": true,
|
||||
"product": "bind",
|
||||
"width": "100%",
|
||||
"https": true,
|
||||
"protocol": "https://",
|
||||
}),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return Error(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Error(res.data['message']);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final future = _getConfig(gt, challenge);
|
||||
return AlertDialog(
|
||||
title: const Text('验证码'),
|
||||
content: SizedBox(
|
||||
width: 300,
|
||||
height: 400,
|
||||
child: InAppWebView(
|
||||
webViewEnvironment: webViewEnvironment,
|
||||
initialSettings: InAppWebViewSettings(
|
||||
clearCache: true,
|
||||
javaScriptEnabled: true,
|
||||
forceDark: ForceDark.AUTO,
|
||||
useHybridComposition: false,
|
||||
algorithmicDarkeningAllowed: true,
|
||||
useShouldOverrideUrlLoading: true,
|
||||
userAgent: UaType.mob.ua,
|
||||
mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW,
|
||||
),
|
||||
initialData: InAppWebViewInitialData(
|
||||
data:
|
||||
'<!DOCTYPE html><html><head></head><body><script src="$_geetestJsUri"></script><script>function R(n,o){flutter_inappwebview.callHandler(n,o)}</script></body></html>',
|
||||
),
|
||||
onWebViewCreated: (ctr) {
|
||||
ctr
|
||||
..addJavaScriptHandler(
|
||||
handlerName: 'success',
|
||||
callback: (args) {
|
||||
if (args.isNotEmpty) {
|
||||
if (args[0] case Map<String, dynamic> data) {
|
||||
Get.back(result: data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
debugPrint('geetest invalid result: $args');
|
||||
},
|
||||
)
|
||||
..addJavaScriptHandler(
|
||||
handlerName: 'error',
|
||||
callback: (args) {
|
||||
debugPrint('geetest error: $args');
|
||||
},
|
||||
);
|
||||
},
|
||||
onLoadStop: (ctr, _) async {
|
||||
final config = await future;
|
||||
if (config.isSuccess) {
|
||||
ctr.evaluateJavascript(
|
||||
source:
|
||||
'let t=Geetest(${config.data}).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));t.onReady(()=>t.verify());',
|
||||
);
|
||||
} else {
|
||||
config.toast();
|
||||
Get.back();
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: Get.back,
|
||||
child: Text(
|
||||
'取消',
|
||||
style: TextStyle(color: ColorScheme.of(context).outline),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user