酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#を使って楽天証券にログインしてセッションIDを取得する

大納会に近付きつつある今日この頃です。

過去に株売買の自動システムを作ろうとしていた時期がありました。プロジェクトからソースコードを切り出して下記のようにいくつかブログにも書いてたことがありました。

最近、また少し株を触るようになりました。マケマケ続きですが……それはさておき、取引結果を記録しているのですが自動化したいと考えています。

取引結果を取得する前段階として、まずは楽天証券にC#を使ってログインさせる方法を考えてみましょう。

楽天証券にログインする

ちなみに楽天証券ではWebAPIは提供されていないため、スクレイピングでの実装となります。htmlをパースしたりとかなりツラそうですが……。

クラス名はなんでもよかったので、ここではRakutenApiクラスということにしましょう。RakutenApi.csを作成します。

楽天証券にログインしてURLを見ていると気付くと思いますがログインした際のセッションIDを保持していています。

RakutenApiクラスにセッションIDを保持するプロパティとCookie情報を保持するプロパティを追加します。そしてLoginメソッドを追加しましょう。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
 
namespace Softbuild.Net.RakutenSecurities
{
    public class RakutenApi
    {
        // セッションID
        public string SessionId { get; set; }
 
        // ログイン情報を保持するクッキーコンテナー
        private CookieContainer Cookie { get; set; }

        // 楽天証券へログインする
        public void Login(string userId, string password)
        {
            // ここにログイン処理を実装する
        }
    }
}

Loginメソッドの中身の処理を実装していきましょう。

/// <summary>
/// 楽天証券へログインする
/// </summary>
/// <param name="userId"></param>
/// <param name="password"></param>
public void Login(string userId, string password)
{
    Cookie = new CookieContainer();

    var postData = string.Format("loginid={0}&passwd={1}", userId, password);
    var req = HttpWebRequestExtensions.CreateHttpPost("https://member.rakuten-sec.co.jp/bv/app/Login.do", postData, Cookie);

    var text = req.DownloadString();

    // なぜか楽天証券のサイトの文字コードはEUC-JPだったりする
    var enc = Encoding.GetEncoding("EUC-JP");

    var match = Regex.Match(text, "{\\sreturn\\s\"(?<sessionId>.*)\";}");
    if (match.Success && match.Groups["sessionId"].Success)
    {
        SessionId = match.Groups["sessionId"].Value;
    }
    else
    {
        throw new InvalidOperationException("ログインに失敗しました");
    }
}

このRakutenApiクラスのLoginメソッドは以下のように使用することが可能です。

var rakuten = new Softbuild.Net.RakutenSecurities.RakutenApi();
rakuten.Login("USER_ID", "PASSWORD");