プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

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の時刻設定がずれているため、正常にログインできない場合があります。&#x0A;※時刻設定を変更した後は、このページを再読み込みしてください。&#x0A;&#x0A;続行しますか?">
  <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のマイページでログイン履歴を確認するとクッキー取得時間とほぼ同じなので、ログインできたことがわかります。
f:id:shirakamisauto:20150610134836p:plain


参考サイトterry-u16.hatenablog.com
www.kekyo.net

*1:HttpClientHandlerはその名の通りHttpClientを取り扱うための手段が詰まったクラスで、クッキーとかプロキシとかを取得設定したりできます。