mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-08 03:54:49 +08:00
fix: mob geetest (#2341)
* fix: mob geetest * geetest ios patch --------- Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
committed by
GitHub
parent
3b9403a329
commit
b67756c152
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@@ -81,7 +81,6 @@ jobs:
|
|||||||
- name: Apply Patch
|
- name: Apply Patch
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: lib/scripts/patch.ps1 android
|
run: lib/scripts/patch.ps1 android
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Write key
|
- name: Write key
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
|||||||
1
.github/workflows/ios.yml
vendored
1
.github/workflows/ios.yml
vendored
@@ -33,7 +33,6 @@ jobs:
|
|||||||
- name: Apply Patch
|
- name: Apply Patch
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: lib/scripts/patch.ps1 iOS
|
run: lib/scripts/patch.ps1 iOS
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Build iOS
|
- name: Build iOS
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
1
.github/workflows/linux_x64.yml
vendored
1
.github/workflows/linux_x64.yml
vendored
@@ -54,7 +54,6 @@ jobs:
|
|||||||
- name: Apply Patch
|
- name: Apply Patch
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: lib/scripts/patch.ps1 Linux
|
run: lib/scripts/patch.ps1 Linux
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
#TODO: deb and rpm packages need to be build
|
#TODO: deb and rpm packages need to be build
|
||||||
- name: Build Linux
|
- name: Build Linux
|
||||||
|
|||||||
1
.github/workflows/mac.yml
vendored
1
.github/workflows/mac.yml
vendored
@@ -33,7 +33,6 @@ jobs:
|
|||||||
- name: Apply Patch
|
- name: Apply Patch
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: lib/scripts/patch.ps1 macOS
|
run: lib/scripts/patch.ps1 macOS
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Build Mac
|
- name: Build Mac
|
||||||
run: flutter build macos --release --dart-define-from-file=pili_release.json
|
run: flutter build macos --release --dart-define-from-file=pili_release.json
|
||||||
|
|||||||
1
.github/workflows/win_x64.yml
vendored
1
.github/workflows/win_x64.yml
vendored
@@ -29,7 +29,6 @@ jobs:
|
|||||||
- name: Apply Patch
|
- name: Apply Patch
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: lib/scripts/patch.ps1 windows
|
run: lib/scripts/patch.ps1 windows
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Add fastforge and Inno Setup
|
- name: Add fastforge and Inno Setup
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import 'package:flutter/foundation.dart' show kDebugMode;
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart';
|
|
||||||
|
|
||||||
class LoginPageController extends GetxController
|
class LoginPageController extends GetxController
|
||||||
with GetSingleTickerProviderStateMixin {
|
with GetSingleTickerProviderStateMixin {
|
||||||
@@ -34,8 +33,6 @@ class LoginPageController extends GetxController
|
|||||||
|
|
||||||
late final TabController tabController;
|
late final TabController tabController;
|
||||||
|
|
||||||
late final Gt3FlutterPlugin captcha = Gt3FlutterPlugin();
|
|
||||||
|
|
||||||
late final CaptchaDataModel captchaData = CaptchaDataModel();
|
late final CaptchaDataModel captchaData = CaptchaDataModel();
|
||||||
late final RxInt qrCodeLeftTime = 180.obs;
|
late final RxInt qrCodeLeftTime = 180.obs;
|
||||||
late final RxString statusQRCode = ''.obs;
|
late final RxString statusQRCode = ''.obs;
|
||||||
@@ -125,115 +122,19 @@ class LoginPageController extends GetxController
|
|||||||
String geeChallenge,
|
String geeChallenge,
|
||||||
VoidCallback onSuccess,
|
VoidCallback onSuccess,
|
||||||
) {
|
) {
|
||||||
void updateCaptchaData(Map json) {
|
GeetestWebviewDialog.geetest(geeGt, geeChallenge).then((res) {
|
||||||
captchaData
|
if (res is Map) {
|
||||||
..validate = json['geetest_validate']
|
captchaData
|
||||||
..seccode = json['geetest_seccode']
|
..validate = res['geetest_validate']
|
||||||
..geetest = GeetestData(
|
..seccode = res['geetest_seccode']
|
||||||
challenge: json['geetest_challenge'],
|
..geetest = GeetestData(
|
||||||
gt: geeGt,
|
challenge: res['geetest_challenge'],
|
||||||
);
|
gt: geeGt,
|
||||||
SmartDialog.showToast('验证成功');
|
);
|
||||||
onSuccess();
|
SmartDialog.showToast('验证成功');
|
||||||
}
|
onSuccess();
|
||||||
|
}
|
||||||
if (PlatformUtils.isDesktop) {
|
});
|
||||||
showDialog<Map<String, dynamic>>(
|
|
||||||
context: Get.context!,
|
|
||||||
builder: (context) => GeetestWebviewDialog(geeGt, geeChallenge),
|
|
||||||
).then((res) {
|
|
||||||
if (res != null) {
|
|
||||||
updateCaptchaData(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
final registerData = Gt3RegisterData(
|
|
||||||
challenge: geeChallenge,
|
|
||||||
gt: geeGt,
|
|
||||||
success: true,
|
|
||||||
);
|
|
||||||
|
|
||||||
captcha
|
|
||||||
..addEventHandler(
|
|
||||||
onShow: (Map<String, dynamic> message) {},
|
|
||||||
onClose: (Map<String, dynamic> message) {
|
|
||||||
SmartDialog.showToast('关闭验证');
|
|
||||||
},
|
|
||||||
onResult: (Map<String, dynamic> message) {
|
|
||||||
if (kDebugMode) debugPrint("Captcha result: $message");
|
|
||||||
final String code = message["code"];
|
|
||||||
if (code == "1") {
|
|
||||||
// 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询
|
|
||||||
updateCaptchaData(message['result']);
|
|
||||||
} else {
|
|
||||||
// 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried.
|
|
||||||
if (kDebugMode) debugPrint("Captcha result code : $code");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onError: (Map<String, dynamic> message) {
|
|
||||||
SmartDialog.showToast("Captcha onError: $message");
|
|
||||||
String code = message["code"];
|
|
||||||
// 处理验证中返回的错误 Handling errors returned in verification
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
// Android 平台
|
|
||||||
if (code == "-2") {
|
|
||||||
// Dart 调用异常 Call exception
|
|
||||||
} else if (code == "-1") {
|
|
||||||
// Gt3RegisterData 参数不合法 Parameter is invalid
|
|
||||||
} else if (code == "201") {
|
|
||||||
// 网络无法访问 Network inaccessible
|
|
||||||
} else if (code == "202") {
|
|
||||||
// Json 解析错误 Analysis error
|
|
||||||
} else if (code == "204") {
|
|
||||||
// WebView 加载超时,请检查是否混淆极验 SDK Load timed out
|
|
||||||
} else if (code == "204_1") {
|
|
||||||
// WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log
|
|
||||||
} else if (code == "204_2") {
|
|
||||||
// WebView 加载 SSLError
|
|
||||||
} else if (code == "206") {
|
|
||||||
// gettype 接口错误或返回为 null API error or return null
|
|
||||||
} else if (code == "207") {
|
|
||||||
// getphp 接口错误或返回为 null API error or return null
|
|
||||||
} else if (code == "208") {
|
|
||||||
// ajax 接口错误或返回为 null API error or return null
|
|
||||||
} else {
|
|
||||||
// 更多错误码参考开发文档 More error codes refer to the development document
|
|
||||||
// https://docs.geetest.com/sensebot/apirefer/errorcode/android
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Platform.isIOS) {
|
|
||||||
// iOS 平台
|
|
||||||
if (code == "-1009") {
|
|
||||||
// 网络无法访问 Network inaccessible
|
|
||||||
} else if (code == "-1004") {
|
|
||||||
// 无法查找到 HOST Unable to find HOST
|
|
||||||
} else if (code == "-1002") {
|
|
||||||
// 非法的 URL Illegal URL
|
|
||||||
} else if (code == "-1001") {
|
|
||||||
// 网络超时 Network timeout
|
|
||||||
} else if (code == "-999") {
|
|
||||||
// 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation
|
|
||||||
} else if (code == "-21") {
|
|
||||||
// 使用了重复的 challenge Duplicate challenges are used
|
|
||||||
// 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached
|
|
||||||
} else if (code == "-20") {
|
|
||||||
// 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again
|
|
||||||
} else if (code == "-10") {
|
|
||||||
// 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification
|
|
||||||
} else if (code == "-2") {
|
|
||||||
// Dart 调用异常 Call exception
|
|
||||||
} else if (code == "-1") {
|
|
||||||
// Gt3RegisterData 参数不合法 Parameter is invalid
|
|
||||||
} else {
|
|
||||||
// 更多错误码参考开发文档 More error codes refer to the development document
|
|
||||||
// https://docs.geetest.com/sensebot/apirefer/errorcode/ios
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
..startCaptcha(registerData);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static String validateCookie(String cookie) {
|
static String validateCookie(String cookie) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'dart:convert' show jsonDecode, jsonEncode;
|
import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8;
|
||||||
import 'dart:io' show Platform, Directory, File;
|
import 'dart:io' show Platform;
|
||||||
|
|
||||||
import 'package:PiliPlus/http/browser_ua.dart';
|
import 'package:PiliPlus/http/browser_ua.dart';
|
||||||
import 'package:PiliPlus/http/init.dart';
|
import 'package:PiliPlus/http/init.dart';
|
||||||
@@ -20,6 +20,13 @@ class GeetestWebviewDialog extends StatefulWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
State<GeetestWebviewDialog> createState() => _GeetestWebviewDialogState();
|
State<GeetestWebviewDialog> createState() => _GeetestWebviewDialogState();
|
||||||
|
|
||||||
|
static Future geetest(String gt, String challenge) {
|
||||||
|
return showDialog(
|
||||||
|
context: Get.context!,
|
||||||
|
builder: (context) => GeetestWebviewDialog(gt, challenge),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
||||||
@@ -30,6 +37,9 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
Webview? _linuxWebview;
|
Webview? _linuxWebview;
|
||||||
late bool _linuxWebviewLoading = true;
|
late bool _linuxWebviewLoading = true;
|
||||||
|
|
||||||
|
String _showJs(String response) =>
|
||||||
|
't=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError(o=>R("error",o)).onClose(o=>R("close",o));t.onReady(()=>t.verify())';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@@ -122,6 +132,8 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
}
|
}
|
||||||
} else if (msgStr.startsWith("error:")) {
|
} else if (msgStr.startsWith("error:")) {
|
||||||
debugPrint('geetest error: $msgStr');
|
debugPrint('geetest error: $msgStr');
|
||||||
|
} else if (msgStr.startsWith('close:')) {
|
||||||
|
Get.back();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -136,27 +148,15 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
<!DOCTYPE html><html><head></head><body>
|
<!DOCTYPE html><html><head></head><body>
|
||||||
<script src="$_geetestJsUri"></script>
|
<script src="$_geetestJsUri"></script>
|
||||||
<script>
|
<script>
|
||||||
function R(n,o){
|
R=(n,o)=>webkit.messageHandlers.msgToNative.postMessage(n+':'+JSON.stringify(o))
|
||||||
window.webkit.messageHandlers.msgToNative.postMessage(n + ':' + JSON.stringify(o));
|
${_showJs(response)}
|
||||||
}
|
|
||||||
let t=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));
|
|
||||||
t.onReady(()=>t.verify());
|
|
||||||
</script>
|
</script>
|
||||||
</body></html>
|
</body></html>
|
||||||
''';
|
''';
|
||||||
|
|
||||||
final tempDir = Directory.systemTemp;
|
_linuxWebview!.launch(
|
||||||
final file = File(
|
'data:text/html;base64,${base64.encode(utf8.encode(html))}',
|
||||||
'${tempDir.path}/geetest_${DateTime.now().millisecondsSinceEpoch}.html',
|
|
||||||
);
|
);
|
||||||
await file.writeAsString(html);
|
|
||||||
|
|
||||||
if (!mounted) {
|
|
||||||
_closeLinuxWebview();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_linuxWebview!.launch('file://${file.path}');
|
|
||||||
|
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
@@ -205,7 +205,7 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
title: const Text('验证码'),
|
title: const Text('验证码'),
|
||||||
content: SizedBox(
|
content: SizedBox(
|
||||||
width: 300,
|
width: 320,
|
||||||
height: 400,
|
height: 400,
|
||||||
child: InAppWebView(
|
child: InAppWebView(
|
||||||
webViewEnvironment: webViewEnvironment,
|
webViewEnvironment: webViewEnvironment,
|
||||||
@@ -217,11 +217,31 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
algorithmicDarkeningAllowed: true,
|
algorithmicDarkeningAllowed: true,
|
||||||
useShouldOverrideUrlLoading: true,
|
useShouldOverrideUrlLoading: true,
|
||||||
userAgent: BrowserUa.mob,
|
userAgent: BrowserUa.mob,
|
||||||
mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW,
|
mixedContentMode: .MIXED_CONTENT_ALWAYS_ALLOW,
|
||||||
|
|
||||||
|
incognito: true,
|
||||||
|
allowFileAccess: false,
|
||||||
|
allowsLinkPreview: false,
|
||||||
|
allowContentAccess: false,
|
||||||
|
useOnDownloadStart: false,
|
||||||
|
geolocationEnabled: false,
|
||||||
|
thirdPartyCookiesEnabled: false,
|
||||||
|
enterpriseAuthenticationAppLinkPolicyEnabled: false,
|
||||||
|
saveFormData: false,
|
||||||
|
safeBrowsingEnabled: false,
|
||||||
|
isFraudulentWebsiteWarningEnabled: false,
|
||||||
|
domStorageEnabled: false,
|
||||||
|
databaseEnabled: false,
|
||||||
|
cacheEnabled: false,
|
||||||
|
cacheMode: .LOAD_NO_CACHE,
|
||||||
|
|
||||||
|
horizontalScrollBarEnabled: false,
|
||||||
|
verticalScrollBarEnabled: false,
|
||||||
|
overScrollMode: .NEVER,
|
||||||
),
|
),
|
||||||
initialData: InAppWebViewInitialData(
|
initialData: InAppWebViewInitialData(
|
||||||
data:
|
data:
|
||||||
'<!DOCTYPE html><html><head></head><body><script src="$_geetestJsUri"></script><script>function R(n,o){flutter_inappwebview.callHandler(n,o)}</script></body></html>',
|
'<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width"></head><body><script src="$_geetestJsUri"></script><script>R=flutter_inappwebview.callHandler</script></body></html>',
|
||||||
),
|
),
|
||||||
onWebViewCreated: (ctr) {
|
onWebViewCreated: (ctr) {
|
||||||
ctr
|
ctr
|
||||||
@@ -242,16 +262,17 @@ class _GeetestWebviewDialogState extends State<GeetestWebviewDialog> {
|
|||||||
callback: (args) {
|
callback: (args) {
|
||||||
debugPrint('geetest error: $args');
|
debugPrint('geetest error: $args');
|
||||||
},
|
},
|
||||||
|
)
|
||||||
|
..addJavaScriptHandler(
|
||||||
|
handlerName: 'close',
|
||||||
|
callback: (args) => Get.back(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onLoadStop: (ctr, _) async {
|
onLoadStop: (ctr, _) async {
|
||||||
final config = await _future;
|
final config = await _future;
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
if (config case Success(:final response)) {
|
if (config case Success(:final response)) {
|
||||||
ctr.evaluateJavascript(
|
ctr.evaluateJavascript(source: _showJs(response));
|
||||||
source:
|
|
||||||
'let t=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));t.onReady(()=>t.verify());',
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
config.toast();
|
config.toast();
|
||||||
Get.back();
|
Get.back();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ index 58ba68b7c..a6bb398ac 100644
|
|||||||
-import 'package:flutter/gestures.dart' show HorizontalDragGestureRecognizer;
|
-import 'package:flutter/gestures.dart' show HorizontalDragGestureRecognizer;
|
||||||
+import 'package:flutter/gestures.dart'
|
+import 'package:flutter/gestures.dart'
|
||||||
+ show HorizontalDragGestureRecognizer, DeviceGestureSettings;
|
+ show HorizontalDragGestureRecognizer, DeviceGestureSettings;
|
||||||
import 'package:flutter/material.dart' ;
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -142,6 +143,10 @@ class SlideDragGestureRecognizer extends HorizontalDragGestureRecognizer {
|
@@ -142,6 +143,10 @@ class SlideDragGestureRecognizer extends HorizontalDragGestureRecognizer {
|
||||||
|
|||||||
146
lib/scripts/geetest_ios.patch
Normal file
146
lib/scripts/geetest_ios.patch
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
diff --git a/lib/pages/login/geetest/geetest_plugin.dart b/lib/pages/login/geetest/geetest_plugin.dart
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..2823c2188
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/lib/pages/login/geetest/geetest_plugin.dart
|
||||||
|
@@ -0,0 +1,110 @@
|
||||||
|
+import 'dart:async' show Completer;
|
||||||
|
+import 'dart:io' show Platform;
|
||||||
|
+
|
||||||
|
+import 'package:flutter/foundation.dart' show kDebugMode, debugPrint;
|
||||||
|
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
+import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart';
|
||||||
|
+
|
||||||
|
+abstract final class GeetestPlugin {
|
||||||
|
+ static Future geetest(String gt, String challenge) {
|
||||||
|
+ final completer = Completer();
|
||||||
|
+ void complete([result]) {
|
||||||
|
+ if (!completer.isCompleted) {
|
||||||
|
+ completer.complete(result);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ final registerData = Gt3RegisterData(
|
||||||
|
+ challenge: challenge,
|
||||||
|
+ gt: gt,
|
||||||
|
+ success: true,
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ Gt3FlutterPlugin()
|
||||||
|
+ ..addEventHandler(
|
||||||
|
+ onShow: (Map<String, dynamic> message) {},
|
||||||
|
+ onClose: (Map<String, dynamic> message) {
|
||||||
|
+ SmartDialog.showToast('关闭验证');
|
||||||
|
+ complete();
|
||||||
|
+ },
|
||||||
|
+ onResult: (Map<String, dynamic> message) {
|
||||||
|
+ if (kDebugMode) debugPrint("Captcha result: $message");
|
||||||
|
+ final String code = message["code"];
|
||||||
|
+ if (code == "1") {
|
||||||
|
+ // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询
|
||||||
|
+ complete(message['result']);
|
||||||
|
+ return;
|
||||||
|
+ } else {
|
||||||
|
+ // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried.
|
||||||
|
+ if (kDebugMode) debugPrint("Captcha result code : $code");
|
||||||
|
+ }
|
||||||
|
+ complete();
|
||||||
|
+ },
|
||||||
|
+ onError: (Map<String, dynamic> message) {
|
||||||
|
+ SmartDialog.showToast("Captcha onError: $message");
|
||||||
|
+ String code = message["code"];
|
||||||
|
+ // 处理验证中返回的错误 Handling errors returned in verification
|
||||||
|
+ if (Platform.isAndroid) {
|
||||||
|
+ // Android 平台
|
||||||
|
+ if (code == "-2") {
|
||||||
|
+ // Dart 调用异常 Call exception
|
||||||
|
+ } else if (code == "-1") {
|
||||||
|
+ // Gt3RegisterData 参数不合法 Parameter is invalid
|
||||||
|
+ } else if (code == "201") {
|
||||||
|
+ // 网络无法访问 Network inaccessible
|
||||||
|
+ } else if (code == "202") {
|
||||||
|
+ // Json 解析错误 Analysis error
|
||||||
|
+ } else if (code == "204") {
|
||||||
|
+ // WebView 加载超时,请检查是否混淆极验 SDK Load timed out
|
||||||
|
+ } else if (code == "204_1") {
|
||||||
|
+ // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log
|
||||||
|
+ } else if (code == "204_2") {
|
||||||
|
+ // WebView 加载 SSLError
|
||||||
|
+ } else if (code == "206") {
|
||||||
|
+ // gettype 接口错误或返回为 null API error or return null
|
||||||
|
+ } else if (code == "207") {
|
||||||
|
+ // getphp 接口错误或返回为 null API error or return null
|
||||||
|
+ } else if (code == "208") {
|
||||||
|
+ // ajax 接口错误或返回为 null API error or return null
|
||||||
|
+ } else {
|
||||||
|
+ // 更多错误码参考开发文档 More error codes refer to the development document
|
||||||
|
+ // https://docs.geetest.com/sensebot/apirefer/errorcode/android
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (Platform.isIOS) {
|
||||||
|
+ // iOS 平台
|
||||||
|
+ if (code == "-1009") {
|
||||||
|
+ // 网络无法访问 Network inaccessible
|
||||||
|
+ } else if (code == "-1004") {
|
||||||
|
+ // 无法查找到 HOST Unable to find HOST
|
||||||
|
+ } else if (code == "-1002") {
|
||||||
|
+ // 非法的 URL Illegal URL
|
||||||
|
+ } else if (code == "-1001") {
|
||||||
|
+ // 网络超时 Network timeout
|
||||||
|
+ } else if (code == "-999") {
|
||||||
|
+ // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation
|
||||||
|
+ } else if (code == "-21") {
|
||||||
|
+ // 使用了重复的 challenge Duplicate challenges are used
|
||||||
|
+ // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached
|
||||||
|
+ } else if (code == "-20") {
|
||||||
|
+ // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again
|
||||||
|
+ } else if (code == "-10") {
|
||||||
|
+ // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification
|
||||||
|
+ } else if (code == "-2") {
|
||||||
|
+ // Dart 调用异常 Call exception
|
||||||
|
+ } else if (code == "-1") {
|
||||||
|
+ // Gt3RegisterData 参数不合法 Parameter is invalid
|
||||||
|
+ } else {
|
||||||
|
+ // 更多错误码参考开发文档 More error codes refer to the development document
|
||||||
|
+ // https://docs.geetest.com/sensebot/apirefer/errorcode/ios
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ complete();
|
||||||
|
+ },
|
||||||
|
+ )
|
||||||
|
+ ..startCaptcha(registerData);
|
||||||
|
+
|
||||||
|
+ return completer.future;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/lib/pages/login/geetest/geetest_webview_dialog.dart b/lib/pages/login/geetest/geetest_webview_dialog.dart
|
||||||
|
index 7a0461170..da032af1a 100644
|
||||||
|
--- a/lib/pages/login/geetest/geetest_webview_dialog.dart
|
||||||
|
+++ b/lib/pages/login/geetest/geetest_webview_dialog.dart
|
||||||
|
@@ -1,3 +1,5 @@
|
||||||
|
+import 'package:PiliPlus/pages/login/geetest/geetest_plugin.dart';
|
||||||
|
+
|
||||||
|
import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8;
|
||||||
|
import 'dart:io' show Platform;
|
||||||
|
|
||||||
|
@@ -22,6 +24,7 @@ class GeetestWebviewDialog extends StatefulWidget {
|
||||||
|
State<GeetestWebviewDialog> createState() => _GeetestWebviewDialogState();
|
||||||
|
|
||||||
|
static Future geetest(String gt, String challenge) {
|
||||||
|
+ return GeetestPlugin.geetest(gt, challenge);
|
||||||
|
return showDialog(
|
||||||
|
context: Get.context!,
|
||||||
|
builder: (context) => GeetestWebviewDialog(gt, challenge),
|
||||||
|
diff --git a/pubspec.yaml b/pubspec.yaml
|
||||||
|
index 1ec95f9f1..e29e474e0 100644
|
||||||
|
--- a/pubspec.yaml
|
||||||
|
+++ b/pubspec.yaml
|
||||||
|
@@ -34,6 +34,7 @@ dependencies:
|
||||||
|
sdk: flutter
|
||||||
|
flutter_localizations:
|
||||||
|
sdk: flutter
|
||||||
|
+ gt3_flutter_plugin: ^0.1.0
|
||||||
|
|
||||||
|
app_links: ^7.1.1
|
||||||
|
archive: ^4.0.0
|
||||||
@@ -37,11 +37,17 @@ $ModalBarrierPatch = "lib/scripts/modal_barrier.patch"
|
|||||||
# https://github.com/flutter/flutter/issues/182466
|
# https://github.com/flutter/flutter/issues/182466
|
||||||
$MouseCursorPatch = "lib/scripts/mouse_cursor.patch"
|
$MouseCursorPatch = "lib/scripts/mouse_cursor.patch"
|
||||||
|
|
||||||
|
$GeetestIOSPatch = "lib/scripts/geetest_ios.patch"
|
||||||
|
|
||||||
if ($platform.ToLower() -eq "ios") {
|
if ($platform.ToLower() -eq "ios") {
|
||||||
git apply $BottomSheetIOSPiliPlusPatch
|
git apply $BottomSheetIOSPiliPlusPatch
|
||||||
if ($LASTEXITCODE -eq 0) {
|
if ($LASTEXITCODE -eq 0) {
|
||||||
Write-Host "$BottomSheetIOSPiliPlusPatch applied"
|
Write-Host "$BottomSheetIOSPiliPlusPatch applied"
|
||||||
}
|
}
|
||||||
|
git apply $GeetestIOSPatch
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Host "$GeetestIOSPatch applied"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Set-Location $env:FLUTTER_ROOT
|
Set-Location $env:FLUTTER_ROOT
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
@@ -43,7 +42,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;
|
import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart';
|
|
||||||
|
|
||||||
abstract final class RequestUtils {
|
abstract final class RequestUtils {
|
||||||
static Future<void> syncHistoryStatus() async {
|
static Future<void> syncHistoryStatus() async {
|
||||||
@@ -574,118 +572,17 @@ abstract final class RequestUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PlatformUtils.isDesktop) {
|
final json = await GeetestWebviewDialog.geetest(gt!, challenge!);
|
||||||
final json = await showDialog<Map<String, dynamic>>(
|
if (json is Map) {
|
||||||
context: Get.context!,
|
captchaData
|
||||||
builder: (context) => GeetestWebviewDialog(gt!, challenge!),
|
..validate = json['geetest_validate']
|
||||||
);
|
..seccode = json['geetest_seccode']
|
||||||
if (json != null) {
|
..geetest = GeetestData(
|
||||||
captchaData
|
challenge: json['geetest_challenge'],
|
||||||
..validate = json['geetest_validate']
|
gt: gt,
|
||||||
..seccode = json['geetest_seccode']
|
);
|
||||||
..geetest = GeetestData(
|
gaiaVgateValidate();
|
||||||
challenge: json['geetest_challenge'],
|
|
||||||
gt: gt!,
|
|
||||||
);
|
|
||||||
gaiaVgateValidate();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final registerData = Gt3RegisterData(
|
|
||||||
challenge: challenge,
|
|
||||||
gt: gt,
|
|
||||||
success: true,
|
|
||||||
);
|
|
||||||
|
|
||||||
Gt3FlutterPlugin()
|
|
||||||
..addEventHandler(
|
|
||||||
onClose: (Map<String, dynamic> message) {
|
|
||||||
SmartDialog.showToast('关闭验证');
|
|
||||||
},
|
|
||||||
onResult: (Map<String, dynamic> message) {
|
|
||||||
if (kDebugMode) debugPrint("Captcha result: $message");
|
|
||||||
String code = message["code"];
|
|
||||||
if (code == "1") {
|
|
||||||
// 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询
|
|
||||||
SmartDialog.showToast('验证成功');
|
|
||||||
final result = message['result'];
|
|
||||||
captchaData
|
|
||||||
..validate = result?['geetest_validate']
|
|
||||||
..seccode = result?['geetest_seccode']
|
|
||||||
..geetest = GeetestData(
|
|
||||||
challenge: result?['geetest_challenge'],
|
|
||||||
gt: gt!,
|
|
||||||
);
|
|
||||||
gaiaVgateValidate();
|
|
||||||
} else {
|
|
||||||
// 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried.
|
|
||||||
if (kDebugMode) debugPrint("Captcha result code : $code");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onError: (Map<String, dynamic> message) {
|
|
||||||
SmartDialog.showToast("Captcha onError: $message");
|
|
||||||
String code = message["code"];
|
|
||||||
// 处理验证中返回的错误 Handling errors returned in verification
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
// Android 平台
|
|
||||||
if (code == "-2") {
|
|
||||||
// Dart 调用异常 Call exception
|
|
||||||
} else if (code == "-1") {
|
|
||||||
// Gt3RegisterData 参数不合法 Parameter is invalid
|
|
||||||
} else if (code == "201") {
|
|
||||||
// 网络无法访问 Network inaccessible
|
|
||||||
} else if (code == "202") {
|
|
||||||
// Json 解析错误 Analysis error
|
|
||||||
} else if (code == "204") {
|
|
||||||
// WebView 加载超时,请检查是否混淆极验 SDK Load timed out
|
|
||||||
} else if (code == "204_1") {
|
|
||||||
// WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log
|
|
||||||
} else if (code == "204_2") {
|
|
||||||
// WebView 加载 SSLError
|
|
||||||
} else if (code == "206") {
|
|
||||||
// gettype 接口错误或返回为 null API error or return null
|
|
||||||
} else if (code == "207") {
|
|
||||||
// getphp 接口错误或返回为 null API error or return null
|
|
||||||
} else if (code == "208") {
|
|
||||||
// ajax 接口错误或返回为 null API error or return null
|
|
||||||
} else {
|
|
||||||
// 更多错误码参考开发文档 More error codes refer to the development document
|
|
||||||
// https://docs.geetest.com/sensebot/apirefer/errorcode/android
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Platform.isIOS) {
|
|
||||||
// iOS 平台
|
|
||||||
if (code == "-1009") {
|
|
||||||
// 网络无法访问 Network inaccessible
|
|
||||||
} else if (code == "-1004") {
|
|
||||||
// 无法查找到 HOST Unable to find HOST
|
|
||||||
} else if (code == "-1002") {
|
|
||||||
// 非法的 URL Illegal URL
|
|
||||||
} else if (code == "-1001") {
|
|
||||||
// 网络超时 Network timeout
|
|
||||||
} else if (code == "-999") {
|
|
||||||
// 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation
|
|
||||||
} else if (code == "-21") {
|
|
||||||
// 使用了重复的 challenge Duplicate challenges are used
|
|
||||||
// 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached
|
|
||||||
} else if (code == "-20") {
|
|
||||||
// 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again
|
|
||||||
} else if (code == "-10") {
|
|
||||||
// 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification
|
|
||||||
} else if (code == "-2") {
|
|
||||||
// Dart 调用异常 Call exception
|
|
||||||
} else if (code == "-1") {
|
|
||||||
// Gt3RegisterData 参数不合法 Parameter is invalid
|
|
||||||
} else {
|
|
||||||
// 更多错误码参考开发文档 More error codes refer to the development document
|
|
||||||
// https://docs.geetest.com/sensebot/apirefer/errorcode/ios
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
..startCaptcha(registerData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> showUserRealName(String mid) async {
|
static Future<void> showUserRealName(String mid) async {
|
||||||
|
|||||||
@@ -796,14 +796,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.2"
|
||||||
gt3_flutter_plugin:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: gt3_flutter_plugin
|
|
||||||
sha256: "9cf4070f3f1811b7aa7a1daebdec5886dbda8e64f932a713dab21d8128d7dad2"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.1.1"
|
|
||||||
gtk:
|
gtk:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ dependencies:
|
|||||||
git:
|
git:
|
||||||
url: https://github.com/bggRGjQaUbCoE/getx.git
|
url: https://github.com/bggRGjQaUbCoE/getx.git
|
||||||
ref: version_4.7.2
|
ref: version_4.7.2
|
||||||
gt3_flutter_plugin: ^0.1.0
|
|
||||||
hive_ce: ^2.19.3
|
hive_ce: ^2.19.3
|
||||||
html: ^0.15.4
|
html: ^0.15.4
|
||||||
http2: ^2.3.1
|
http2: ^2.3.1
|
||||||
|
|||||||
Reference in New Issue
Block a user