C#でWebサイトにログインする方法
前回の記事で書くといった某サイトへのログイン方法です。
まずログインするための情報を探します。
記事を書いた時点でのログインページのフォーム部分のhtmlが以下になります。
inputタグの部分にログインに必要な情報があります。
<h2 class="title">pixivへログイン</h2> <form class="login-form" action="/login.php" method="post" data-time="1431493025" data-text-confirm="お使いのPCの時刻設定がずれているため、正常にログインできない場合があります。
※時刻設定を変更した後は、このページを再読み込みしてください。

続行しますか?"> <input type="hidden" name="mode" value="login" /> <fieldset> <label for="pixiv_id">pixiv ID、またはメールアドレス</label> <input type="text" class="js-placeholder form-login-input" id="login_pixiv_id" maxlength="255" name="pixiv_id" value="" autofocus> <label for="pass">パスワード</label> <input type="password" class="js-placeholder form-login-input" id="login_password" maxlength="32" name="pass" value=""> <label> <input name="skip" value="1" type="checkbox" value="" checked="checked" />次回から自動的にログイン </label> <button id="login_submit" style="font-size:18px; margin:10px 0;padding:4px 50px;" type="submit" value="ログイン" >ログイン</button> <span style="float: right;"> <span id="ss_gmo_img_wrapper_100-50_image_ja" style="float: right;"> <a href="https://jp.globalsign.com/" target="_blank" rel="nofollow"> <img alt="SSL GMOグローバルサインのサイトシール" border="0" id="ss_img" src="//seal.globalsign.com/SiteSeal/images/gs_noscript_100-50_ja.gif" style="float: right;" /> </a> </span> <script type="text/javascript" src="//seal.globalsign.com/SiteSeal/gmogs_image_100-50_ja.js" defer="defer"></script> </span> </fieldset> </form>
ログインするためには上記で見つけた全てのinputタグ内のname属性とvalue属性のセットをログインページへ送信する必要があるので、FormUrlEncodedContentクラスでそのセットを作ります。
これとログインページのURLをPostAsyncメソッドに渡してやればあとは勝手にログイン処理してくれます。
ログイン処理するとHttpClientHandlerクラス*1のCookieContainerプロパティにクッキーが取得されます。
あとはこのクッキーを使ってマイページ処理とかごにょごにょと。
以下コードです。例外処理はしてません。
using System; using System.Collections.Generic; using System.Net.Http; using System.Net; using System.Threading.Tasks; namespace LoginSample { class Program { const string ID = "hogehoge@gmail.com";//ログインID const string PASSWORD = "piyopiyo";//ログインパスワード const string LOGIN_ADDRESS = "https://www.secure.pixiv.net/login.php"; static void Main(string[] args) { var p = new Program(); var temp = p.LoginAsync().Result; Console.ReadLine(); } public async Task<CookieContainer> LoginAsync() { CookieContainer cc; using (var handler = new HttpClientHandler()) { using (var client = new HttpClient(handler)) { //ログイン用のPOSTデータ生成 var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"mode","login"}, { "pixiv_id", ID }, { "pass", PASSWORD }, {"skip","1"} }); //ログイン await client.PostAsync(LOGIN_ADDRESS, content); //クッキー保存 cc = handler.CookieContainer; } } CookieCollection cookies = cc.GetCookies(new Uri(LOGIN_ADDRESS)); foreach (Cookie c in cookies) { Console.WriteLine("クッキー名:" + c.Name.ToString()); Console.WriteLine("クッキーを使うサイトのドメイン名:" + c.Domain.ToString()); Console.WriteLine("クッキー発行日時:" + c.TimeStamp.ToString() + Environment.NewLine); } Console.WriteLine("ログイン処理完了!"); return cc; } } }
出力結果
クッキー名:PHPSESSID
クッキーを使うサイトのドメイン名:.pixiv.net
クッキー発行日時:2015/06/10 13:45:46
クッキー名:device_token
クッキーを使うサイトのドメイン名:.pixiv.net
クッキー発行日時:2015/06/10 13:45:46
クッキー名:module_orders_mypage
クッキーを使うサイトのドメイン名:.pixiv.net
クッキー発行日時:2015/06/10 13:45:46
クッキー名:p_ab_id
クッキーを使うサイトのドメイン名:.pixiv.net
クッキー発行日時:2015/06/10 13:45:46
ログイン処理完了!
pixivのマイページでログイン履歴を確認するとクッキー取得時間とほぼ同じなので、ログインできたことがわかります。
参考サイトterry-u16.hatenablog.com
www.kekyo.net
*1:HttpClientHandlerはその名の通りHttpClientを取り扱うための手段が詰まったクラスで、クッキーとかプロキシとかを取得設定したりできます。