C# AngleSharp ログイン後の画面遷移を行う


発生した問題

AngleSharpでスクレイピングをしてみたのだが、どうもログイン後の画面遷移がうまくいっていないっぽい。

ログインしてトップページまで表示させることはできたのだが、別ページに遷移しようとすると以下のエラーメッセージが表示されてしまう。

※ちなみにこれは某証券サイトのエラーメッセージ

ログイン画面から再度入力して下さい。(エラーコード)
何らかの原因によりXXXXXから自動的にログアウトいたしました。
ご利用を継続される場合は、再度ログインをお願いいたします。
・最後にXXXXXを操作してから、30分以上経過した
・ブックマークからログイン後のページにアクセスした
・インターネットから一旦切断された後、再度アクセスされた等

問題のコード

using System.Diagnostics;
using AngleSharp.Dom;
using AngleSharp;
using AngleSharp.Html.Dom;

namespace SampleFormApp
{
    public class ScrapingMain
    {
        const string HOST_URL = "https://xxxxx.co.jp";

        public async Task<System.Collections.Generic.IEnumerable<string>> Exec()
        {
            var config = Configuration.Default.WithDefaultLoader().WithJs();
            var context = BrowsingContext.New(config);

            await context.OpenAsync($"{HOST_URL}/xxxxx/");

            var topPage = await context.Active.QuerySelector<IHtmlFormElement>("form[name='form_TopPage']").SubmitAsync(new
            {
                koza1 = "[支店コード]",
                koza2 = "[口座番号]",
                passwd = "[パスワード]",
            });

            var topPageHeaderMenu = context.Active.QuerySelectorAll("table");
            var transactionPageUrl = topPageHeaderMenu[3].Children[0].Children[0].Children[2].Children[0].Attributes["href"].Value;

            // この遷移がうまくいっていないっぽい
            await context.OpenAsync($"{HOST_URL}{transactionPageUrl}");
            // ここはとりあえず適当・・・。
            return (IEnumerable<string>)topPageHeaderMenu;
        }
    }
}

解決方法

色々調べたところ、デフォルトではCookieを保持するような設定になっていないみたい。
そりゃセッション維持できないよね・・・。

ということで WithDefaultCookies() を追加したら、問題なく画面遷移できた。

using System.Diagnostics;
using AngleSharp.Dom;
using AngleSharp;
using AngleSharp.Html.Dom;

namespace SampleFormApp
{
    public class ScrapingMain
    {
        const string HOST_URL = "https://xxxxx.co.jp";

        public async Task<System.Collections.Generic.IEnumerable<string>> Exec()
        {
            var config = Configuration.Default.WithDefaultLoader().WithJs().WithDefaultCookies(); // WithDefaultCookies()を追加
            var context = BrowsingContext.New(config);

            await context.OpenAsync($"{HOST_URL}/xxxxx/");

            var topPage = await context.Active.QuerySelector<IHtmlFormElement>("form[name='form_TopPage']").SubmitAsync(new
            {
                koza1 = "[支店コード]",
                koza2 = "[口座番号]",
                passwd = "[パスワード]",
            });

            var topPageHeaderMenu = context.Active.QuerySelectorAll("table");
            var transactionPageUrl = topPageHeaderMenu[3].Children[0].Children[0].Children[2].Children[0].Attributes["href"].Value;

            await context.OpenAsync($"{HOST_URL}{transactionPageUrl}");

            return (IEnumerable<string>)topPageHeaderMenu;
        }
    }
}

バージョン情報

Visual Studio 2022 Version 17.1.3
.NET 6.0
AngleSharp 0.16.1
AngleSharp.Js 0.15.0