6.CefSharpを使って、Webデータの自動取得、自動ログイン等をしてみる。

CefSharpを使ってのWebデータの自動取得、自動ログインのサンプルとして、今回はアマゾンへの自動ログインを行ってみます。

 

1.これまでの以下1、2、3をおさらいして、新しくプロジェクトを作成します。

  1. WinFormsアプリを作成して、NuGetパッケージを使ってCefSharpを追加する。
  2. プラットフォーム構成を変更して、AnyCPUで使用できるようにする。
  3. CefSharpを使って、通常のブラウザを表示する。

2.フォーム(Form1.cs)を変更します。

WebBrowser コントロールの WebBrowser.DocumentCompleted イベントに当たるのが、
chromeBrowser.LoadingStateChanged イベントです。これを追加します。

画面の表示内容を取得したり、データをセットしたりするには、WebBrowser コントロールとは違って、
全て JavaScript を介して行います。JavaScript を理解していないと、この辺は難しいのかもしれません。(簡単ですけど。。)

3.ここまで出来たら、実行してみます。無事にログイン出来ました。

 

【フォーム(Form1.cs)】

using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace WindowsFormsApp19
{
    public partial class Form1 : Form
    {
        public ChromiumWebBrowser chromeBrowser;

        private string naviGate = "https://www.amazon.co.jp/";
        private string riyousyaId = "test@abc.co.jp";
        private string password = "aiueo";

        private int navi_cnt = 1;

        public Form1()
        {
            InitializeComponent();

            // Start the browser after initialize global component
            InitializeChromium();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            chromeBrowser.ShowDevTools();
        }

        public void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            settings.Locale = "ja";
            settings.AcceptLanguageList = "ja-JP";

            // Initialize cef with the provided settings
            Cef.Initialize(settings);

            // Create a browser component
            chromeBrowser = new ChromiumWebBrowser(naviGate);

            // Add it to the form and fill it to the form window.
            this.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;

            // Allow the use of local resources in the browser
            BrowserSettings browserSettings = new BrowserSettings();
            browserSettings.FileAccessFromFileUrls = CefState.Enabled;
            browserSettings.UniversalAccessFromFileUrls = CefState.Enabled;
            chromeBrowser.BrowserSettings = browserSettings;

            chromeBrowser.LoadingStateChanged += ChromeBrowser_LoadingStateChanged;
        }

        private void ChromeBrowser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
        {
            try
            {
                if (!e.IsLoading)
                {
                    if (chromeBrowser != null)
                    {
                        //ニュートラル状態
                        if (navi_cnt == 3)
                        {
                            //別に何もしない
                        }

                        //サインイン画面でログイン
                        if (navi_cnt == 2)
                        {
                            //ログインID
                            chromeBrowser.ExecuteScriptAsync(string.Format("document.getElementById('ap_email').value = '{0}';", riyousyaId));

                            //パスワード
                            chromeBrowser.ExecuteScriptAsync(string.Format("document.getElementById('ap_password').value = '{0}';", password));

                            //submit
                            string jsScript = "var inputs = document.getElementsByTagName('input'); " +
                                              "for(var i = 0; i < inputs.length; i++){ " +
                                              "  if(inputs[i].getAttribute('type') == 'submit') inputs[i].click(); " +
                                              "}";

                            navi_cnt = 3;
                            chromeBrowser.ExecuteScriptAsync(jsScript);
                        }

                        //サインインボタンをクリック → サインイン画面へ遷移する
                        if (navi_cnt == 1)
                        {
                            //submit
                            string jsScript = "var btn = document.getElementsByTagName('a'); " +
                                              "for(var i = 0; i < btn.length; i++){ " +
                                              "  if(btn[i].getAttribute('id') == 'a-autoid-0-announce') btn[i].click(); " +
                                              "}";

                            navi_cnt = 2;
                            chromeBrowser.ExecuteScriptAsync(jsScript);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.Invoke(new Action(() => { MessageBox.Show(this, ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); }));
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }
    }
}