CefSharpを使ってのWebデータの自動取得、自動ログインのサンプルとして、今回はアマゾンへの自動ログインを行ってみます。
1.これまでの以下1、2、3をおさらいして、新しくプロジェクトを作成します。
- WinFormsアプリを作成して、NuGetパッケージを使ってCefSharpを追加する。
- プラットフォーム構成を変更して、AnyCPUで使用できるようにする。
- 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();
}
}
}




