* ログイン処理します * あまりパスワード文字列を引き回したくないので、この中で標準入力からユーザー名とパスワードを尋ねる
()
| 60 | * あまりパスワード文字列を引き回したくないので、この中で標準入力からユーザー名とパスワードを尋ねる |
| 61 | */ |
| 62 | async login(): Promise<boolean> { |
| 63 | if (await this.checkSession()) { |
| 64 | console.error("you logged-in already"); |
| 65 | return true; |
| 66 | } |
| 67 | return this.session.transaction(async ()=> { |
| 68 | const {csrf_token} = await this.getCSRFToken(); |
| 69 | |
| 70 | // ユーザーネームとパスワードを入力させる |
| 71 | const inquirer = await import("inquirer"); |
| 72 | const {username, password} = await inquirer.prompt([{ |
| 73 | type: "input", |
| 74 | message: "username:", |
| 75 | name: "username" |
| 76 | }, { |
| 77 | type: "password", |
| 78 | message: "password:", |
| 79 | name: "password" |
| 80 | }]) as { username: string, password: string }; |
| 81 | |
| 82 | const response = await this.session.post( |
| 83 | AtCoder.login_url, |
| 84 | querystring.stringify({username, password, csrf_token}), |
| 85 | { |
| 86 | maxRedirects: 0, |
| 87 | validateStatus: (status) => (status >= 200 && status < 300) || status === 302, |
| 88 | } |
| 89 | ) |
| 90 | |
| 91 | |
| 92 | // ログインページ以外にリダイレクトされていればログイン成功とみなす |
| 93 | const result = response.headers.location !== "/login"; |
| 94 | if (result) { |
| 95 | // ログインに成功していた場合はセッション情報を保存する |
| 96 | await response.saveSession() |
| 97 | } |
| 98 | return result; |
| 99 | }); |
| 100 | } |
| 101 | |
| 102 | /** |
| 103 | * ログインページにアクセスしてCSRFトークンを取得 |
no test coverage detected