Created
November 22, 2022 20:29
-
-
Save aoirint/6f0ce03b5ab3a5a9143109401017eb91 to your computer and use it in GitHub Desktop.
uguisu用の没コード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:http/http.dart' as http; | |
import 'package:logging/logging.dart'; | |
import 'package:sweet_cookie_jar/sweet_cookie_jar.dart'; | |
import 'package:uguisu/niconico_live/cookie_util.dart'; | |
class NiconicoLoginData { | |
SweetCookieJar cookieJar; | |
String? userId; | |
bool mfaRequired; | |
Uri? mfaFormActionUri; | |
NiconicoLoginData({ | |
required this.cookieJar, | |
this.userId, | |
required this.mfaRequired, | |
this.mfaFormActionUri, | |
}); | |
} | |
enum NiconicoLoginErrorReason { | |
invalidCredentials, | |
invalidResponse, | |
unknown, | |
} | |
class NiconicoLoginError { | |
NiconicoLoginErrorReason reason; | |
String message; | |
NiconicoLoginError({ | |
required this.reason, | |
required this.message, | |
}); | |
} | |
class NiconicoLoginResult { | |
NiconicoLoginData? data; | |
NiconicoLoginError? error; | |
NiconicoLoginResult({ | |
this.data, | |
this.error, | |
}); | |
} | |
class NiconicoLoginException { | |
String message; | |
http.Response response; | |
http.Response? redirectedResponse; | |
NiconicoLoginException({ | |
required this.message, | |
required this.response, | |
this.redirectedResponse, | |
}); | |
} | |
Future<NiconicoLoginResult> niconicoLogin({ | |
required Uri loginUri, | |
required String mailTel, | |
required String password, | |
required String userAgent, | |
}) async { | |
final request = http.Request('POST', loginUri); | |
request.headers.addAll({ | |
'user-agent': userAgent, | |
'content-type': 'application/x-www-form-urlencoded', | |
}); | |
request.followRedirects = false; | |
request.bodyFields = { | |
'mail_tel': mailTel, | |
'password': password, | |
}; | |
final httpClient = http.Client(); | |
final streamedResponse = await httpClient.send(request); | |
final response = await http.Response.fromStream(streamedResponse); | |
if (response.statusCode != 302) { | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.invalidCredentials, | |
message: 'Request failed. Status ${response.statusCode}', | |
), | |
); | |
} | |
final cookieJar = SweetCookieJar.from(response: response); | |
final location = response.headers['location']; | |
if (location == null) { | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.invalidResponse, | |
message: 'Location header must be defined', | |
), | |
); | |
} | |
final redirectedToUri = Uri.parse(location); | |
// if (redirectedToUri.origin != uri.origin) { | |
// throw Exception('URL origin must be the same between the redirection for security reason'); | |
// } | |
if (redirectedToUri.path == '/mfa') { | |
// 確認コード | |
final mfaFormActionUri = redirectedToUri; | |
if (redirectedToUri.origin != mfaFormActionUri.origin) { | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.invalidResponse, | |
message: 'URL origin must be the same between the redirected uri and the mfa form action uri for security reason', | |
), | |
); | |
} | |
return NiconicoLoginResult( | |
data: NiconicoLoginData(cookieJar: cookieJar, userId: null, mfaRequired: true, mfaFormActionUri: mfaFormActionUri), | |
); | |
} | |
if (redirectedToUri.path == '/') { | |
// ログイン成功 | |
// x-niconico-id from / | |
final redirectedRequestHeaders = {'user-agent': userAgent}; | |
redirectedRequestHeaders['cookie'] = formatCookieJarForRequestHeader(cookieJar); | |
final redirectedResponse = await http.get(redirectedToUri, headers: redirectedRequestHeaders); | |
if (redirectedResponse.statusCode != 200) { | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.invalidResponse, | |
message: 'Redirected request failed. Status ${redirectedResponse.statusCode}', | |
), | |
); | |
} | |
var userId = redirectedResponse.headers['x-niconico-id']; | |
if (userId == null) { | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.invalidResponse, | |
message: 'Redirected response does not contains x-niconico-id header', | |
), | |
); | |
} | |
return NiconicoLoginResult( | |
data: NiconicoLoginData(cookieJar: cookieJar, userId: userId, mfaRequired: false), | |
); | |
} | |
return NiconicoLoginResult( | |
error: NiconicoLoginError( | |
reason: NiconicoLoginErrorReason.unknown, | |
message: 'Unexpected login response. Login failed.', | |
), | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment