feat: cookie login

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-24 20:00:37 +08:00
parent 9223f40f6d
commit 5eed75e353
3 changed files with 104 additions and 4 deletions

View File

@@ -2,7 +2,11 @@ import 'dart:async';
import 'dart:io';
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:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -16,6 +20,7 @@ class LoginPageController extends GetxController
final TextEditingController usernameTextController = TextEditingController();
final TextEditingController passwordTextController = TextEditingController();
final TextEditingController smsCodeTextController = TextEditingController();
final TextEditingController cookieTextController = TextEditingController();
Rx<Map<String, dynamic>> codeInfo = Rx<Map<String, dynamic>>({});
@@ -40,7 +45,7 @@ class LoginPageController extends GetxController
@override
void onInit() {
super.onInit();
tabController = TabController(length: 3, vsync: this)
tabController = TabController(length: 4, vsync: this)
..addListener(_handleTabChange);
}
@@ -54,6 +59,7 @@ class LoginPageController extends GetxController
usernameTextController.dispose();
passwordTextController.dispose();
smsCodeTextController.dispose();
cookieTextController.dispose();
super.onClose();
}
@@ -197,6 +203,50 @@ class LoginPageController extends GetxController
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端密码登录
void loginByPassword() async {
String username = usernameTextController.text;

View File

@@ -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() {
return Column(
children: [
@@ -450,7 +493,7 @@ class _LoginPageState extends State<LoginPage> {
Tab(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [Icon(Icons.sms), Text(' 短信')],
children: [Icon(Icons.sms_outlined), Text(' 短信')],
),
),
Tab(
@@ -459,6 +502,12 @@ class _LoginPageState extends State<LoginPage> {
children: [Icon(Icons.qr_code), Text(' 扫码')],
),
),
Tab(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [Icon(Icons.cookie_outlined), Text(' Cookie')],
),
),
],
controller: _loginPageCtr.tabController,
))
@@ -468,8 +517,9 @@ class _LoginPageState extends State<LoginPage> {
? TabBar(
tabs: const [
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.cookie_outlined), text: 'Cookie'),
],
controller: _loginPageCtr.tabController,
)
@@ -491,6 +541,7 @@ class _LoginPageState extends State<LoginPage> {
tabViewOuter(loginByPassword()),
tabViewOuter(loginBySmS()),
tabViewOuter(loginByQRCode()),
tabViewOuter(loginByCookie()),
],
),
),