From 5eed75e35391d9c0e80198d6478b5544f0982604 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 24 Dec 2024 20:00:37 +0800 Subject: [PATCH] feat: cookie login Signed-off-by: bggRGjQaUbCoE --- lib/pages/login/controller.dart | 52 ++++++++++++++++++++++++++++++- lib/pages/login/view.dart | 55 +++++++++++++++++++++++++++++++-- lib/utils/utils.dart | 1 - 3 files changed, 104 insertions(+), 4 deletions(-) diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index dd970dfa..d12e6082 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -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> codeInfo = Rx>({}); @@ -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; diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index ed26def8..7cc6f059 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -148,6 +148,49 @@ class _LoginPageState extends State { ); } + 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 { 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 { 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 { ? 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 { tabViewOuter(loginByPassword()), tabViewOuter(loginBySmS()), tabViewOuter(loginByQRCode()), + tabViewOuter(loginByCookie()), ], ), ), diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index cd469ec4..16c1348d 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -78,7 +78,6 @@ class Utils { '${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web')}' '端」推荐'); await GStorage.userInfo.put('userInfoCache', result['data']); - try { final HomeController homeCtr = Get.find(); homeCtr.updateLoginStatus(true);