mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: cookie login
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -2,7 +2,11 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:PiliPalaX/common/constants.dart';
|
import 'package:PiliPalaX/common/constants.dart';
|
||||||
|
import 'package:PiliPalaX/http/init.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
|
import 'package:PiliPalaX/utils/storage.dart';
|
||||||
import 'package:PiliPalaX/utils/utils.dart';
|
import 'package:PiliPalaX/utils/utils.dart';
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
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';
|
||||||
@@ -16,6 +20,7 @@ class LoginPageController extends GetxController
|
|||||||
final TextEditingController usernameTextController = TextEditingController();
|
final TextEditingController usernameTextController = TextEditingController();
|
||||||
final TextEditingController passwordTextController = TextEditingController();
|
final TextEditingController passwordTextController = TextEditingController();
|
||||||
final TextEditingController smsCodeTextController = TextEditingController();
|
final TextEditingController smsCodeTextController = TextEditingController();
|
||||||
|
final TextEditingController cookieTextController = TextEditingController();
|
||||||
|
|
||||||
Rx<Map<String, dynamic>> codeInfo = Rx<Map<String, dynamic>>({});
|
Rx<Map<String, dynamic>> codeInfo = Rx<Map<String, dynamic>>({});
|
||||||
|
|
||||||
@@ -40,7 +45,7 @@ class LoginPageController extends GetxController
|
|||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
tabController = TabController(length: 3, vsync: this)
|
tabController = TabController(length: 4, vsync: this)
|
||||||
..addListener(_handleTabChange);
|
..addListener(_handleTabChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,6 +59,7 @@ class LoginPageController extends GetxController
|
|||||||
usernameTextController.dispose();
|
usernameTextController.dispose();
|
||||||
passwordTextController.dispose();
|
passwordTextController.dispose();
|
||||||
smsCodeTextController.dispose();
|
smsCodeTextController.dispose();
|
||||||
|
cookieTextController.dispose();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,6 +203,50 @@ class LoginPageController extends GetxController
|
|||||||
captcha.startCaptcha(registerData);
|
captcha.startCaptcha(registerData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cookie登录
|
||||||
|
void loginByCookie() async {
|
||||||
|
if (cookieTextController.text.isEmpty) {
|
||||||
|
SmartDialog.showToast('cookie不能为空');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
dynamic result = await Request().get(
|
||||||
|
"https://api.bilibili.com/x/member/web/account",
|
||||||
|
options: Options(
|
||||||
|
headers: {
|
||||||
|
"Cookie": cookieTextController.text,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (result.data['code'] == 0) {
|
||||||
|
try {
|
||||||
|
await Utils.afterLoginByApp(
|
||||||
|
{'mid': '${result.data['data']['mid']}'},
|
||||||
|
{
|
||||||
|
'cookies':
|
||||||
|
cookieTextController.text.split(';').toList().map((item) {
|
||||||
|
List list = item.split('=').toList();
|
||||||
|
return {
|
||||||
|
'name': list.firstOrNull,
|
||||||
|
'value': list.getOrNull(1),
|
||||||
|
};
|
||||||
|
}).toList()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (GStorage.isLogin) {
|
||||||
|
Get.back();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
SmartDialog.showToast("登录失败: $e");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SmartDialog.showToast("哔哩哔哩登录已失效,请重新登录");
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
SmartDialog.showToast("获取哔哩哔哩用户信息失败,可前往账号管理重试");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// app端密码登录
|
// app端密码登录
|
||||||
void loginByPassword() async {
|
void loginByPassword() async {
|
||||||
String username = usernameTextController.text;
|
String username = usernameTextController.text;
|
||||||
|
|||||||
@@ -148,6 +148,49 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget loginByCookie() {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
const Text('使用Cookie登录'),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||||
|
child: Text(
|
||||||
|
'使用App端Api实现的功能将不可用',
|
||||||
|
style: Theme.of(context).textTheme.labelMedium!.copyWith(
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
|
||||||
|
child: TextField(
|
||||||
|
minLines: 1,
|
||||||
|
maxLines: 10,
|
||||||
|
controller: _loginPageCtr.cookieTextController,
|
||||||
|
inputFormatters: [FilteringTextInputFormatter.deny(RegExp(r"\s"))],
|
||||||
|
decoration: InputDecoration(
|
||||||
|
prefixIcon: const Icon(Icons.cookie_outlined),
|
||||||
|
border: const UnderlineInputBorder(),
|
||||||
|
labelText: 'Cookie',
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
onPressed: _loginPageCtr.cookieTextController.clear,
|
||||||
|
icon: const Icon(Icons.clear),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
OutlinedButton.icon(
|
||||||
|
onPressed: _loginPageCtr.loginByCookie,
|
||||||
|
icon: const Icon(Icons.login),
|
||||||
|
label: const Text('登录'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget loginByPassword() {
|
Widget loginByPassword() {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
@@ -450,7 +493,7 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
Tab(
|
Tab(
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [Icon(Icons.sms), Text(' 短信')],
|
children: [Icon(Icons.sms_outlined), Text(' 短信')],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Tab(
|
Tab(
|
||||||
@@ -459,6 +502,12 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
children: [Icon(Icons.qr_code), Text(' 扫码')],
|
children: [Icon(Icons.qr_code), Text(' 扫码')],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Tab(
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [Icon(Icons.cookie_outlined), Text(' Cookie')],
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
controller: _loginPageCtr.tabController,
|
controller: _loginPageCtr.tabController,
|
||||||
))
|
))
|
||||||
@@ -468,8 +517,9 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
? TabBar(
|
? TabBar(
|
||||||
tabs: const [
|
tabs: const [
|
||||||
Tab(icon: Icon(Icons.password), text: '密码'),
|
Tab(icon: Icon(Icons.password), text: '密码'),
|
||||||
Tab(icon: Icon(Icons.sms), text: '短信'),
|
Tab(icon: Icon(Icons.sms_outlined), text: '短信'),
|
||||||
Tab(icon: Icon(Icons.qr_code), text: '扫码'),
|
Tab(icon: Icon(Icons.qr_code), text: '扫码'),
|
||||||
|
Tab(icon: Icon(Icons.cookie_outlined), text: 'Cookie'),
|
||||||
],
|
],
|
||||||
controller: _loginPageCtr.tabController,
|
controller: _loginPageCtr.tabController,
|
||||||
)
|
)
|
||||||
@@ -491,6 +541,7 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
tabViewOuter(loginByPassword()),
|
tabViewOuter(loginByPassword()),
|
||||||
tabViewOuter(loginBySmS()),
|
tabViewOuter(loginBySmS()),
|
||||||
tabViewOuter(loginByQRCode()),
|
tabViewOuter(loginByQRCode()),
|
||||||
|
tabViewOuter(loginByCookie()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ class Utils {
|
|||||||
'${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web')}'
|
'${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web')}'
|
||||||
'端」推荐');
|
'端」推荐');
|
||||||
await GStorage.userInfo.put('userInfoCache', result['data']);
|
await GStorage.userInfo.put('userInfoCache', result['data']);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final HomeController homeCtr = Get.find<HomeController>();
|
final HomeController homeCtr = Get.find<HomeController>();
|
||||||
homeCtr.updateLoginStatus(true);
|
homeCtr.updateLoginStatus(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user