Skip to content

Instantly share code, notes, and snippets.

@aoirint
Created November 22, 2022 20:29
Show Gist options
  • Save aoirint/6f0ce03b5ab3a5a9143109401017eb91 to your computer and use it in GitHub Desktop.
Save aoirint/6f0ce03b5ab3a5a9143109401017eb91 to your computer and use it in GitHub Desktop.
uguisu用の没コード
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