勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

GASで特定サイトにログインした後にスクレイピングを行う方法

  Google Apps Script Google

Google Apps Scriptの勉強として特定サイトにログインし、その後にスクレイピングを行いたい。スクレイピングに関しては過去記事で対応済みの為、今回はログイン部分を勉強したいと思う。またログインするサイトは「小説家になろう」で試してみる。以下に対応方法のメモ。

 

ソースコード

function routine() {

	//ログインURL
	const url = 'https://ssl.syosetu.com/login/login/';

	//ログイン後の遷移先URL
	const contentUrl = 'https://syosetu.com/user/top/'

	//ログイン時のレスポンスヘッダーにあるSet-Cookieデータを取得
	const cookie = login(url);

	//ログイン後の遷移先ページのHTMLデータを取得
	const content = getContent(contentUrl, cookie)

	console.log(content);
}

function login(url) {

	//ログインID及びパスワード
	const formData = {
		"narouid": "xxxxxxx",
		"pass": "xxxxxxx"
	}

	//UrlFetchAppのオプション
	const options = {
		"method": "POST",
		"payload": formData,
		"followRedirects": false
	};

	//データを取得
	const response = UrlFetchApp.fetch(url, options);

	//レスポンスヘッダーにあるSet-Cookieデータを取得
	return response.getHeaders()["Set-Cookie"]; // cookie
}

function getContent(url, cookie) {

	//Set-Cookieデータをヘッダーに追加
	const headers = { 'Cookie': cookie }; 

	//UrlFetchAppのオプション
	var options = {
		method: 'GET',
		headers: headers,
		followRedirects: false,
	};

	//データを取得
	const response = UrlFetchApp.fetch(url, options);

	return response.getContentText();
}

ほぼ参考サイトのソースコードのまま使用した。

ログインURL

ブラウザ上でなろうのログインページを開くとURLは「https://ssl.syosetu.com/login/input/」になる。しかしログインページからログインを行うと「https://ssl.syosetu.com/login/login/」に「narouid&pass」をPOST送信している為、GASのソースコード上のログインURLは「https://ssl.syosetu.com/login/login/」となる。

Cookie

「https://ssl.syosetu.com/login/login/」にログイン時、応答ヘッダーのSet-Cookieで「userl=xxxxxxxxx; path=/; domain=.syosetu.com; httponly」というデータが返ってくる。この「userl」がログイン後にチェックされているっぽい。なのでgetContent関数でコンテンツを取得する際にheader内にCookieデータを追加する必要がある。

開発ツールでURLやパラメータを確認

ログイン時にPOSTするパラメータ(今回であればnarouid&pass)やURL(https://ssl.syosetu.com/login/login/)はブラウザの開発ツールで確認できる。

Firefoxだと「F12キーで開発ツールを開く」→「ネットワークタブをクリック」→「右上の歯車マークをクリック」→「永続ログにチェックを入れる」→「ブラウザ上でログイン処理を行う」と進むことで各ページのURLやパラメータ、ヘッダー情報が確認できる。

Chromeだと「F12キーで開発ツールを開く」→「Networkタブをクリック」→「Preserve logにチェックを入れる」→「ブラウザ上でログイン処理を行う」で確認可能。

注意点

reCAPTCHAやパズル認証等が設置されているサイトだと今回のような自動ログインは無理と思っておいた方が良さそう。突破する方法もあるようだが、さらに対策されるといたちごっことなるかもしれない。

また、GASではユーザーエージェントの変更(偽装)は出来ないらしい。あまり無いとは思うが「特定のユーザーエージェントからのアクセスは遮断」みたいなことをされるとGASからはアクセスできない可能性あり。

 

参考サイト

https://qiita.com/shikumiya_hata/items/aa7d80a1d17ca48ce079

https://webird-programming.tech/archives/902

 - Google Apps Script Google

  関連記事

GASでNintendo Storeをチェックし指定したソフトが〇円以下の際に通知する方法
GASでNintendo Storeをチェックし指定したソフトが〇円以下の際に通知する方法

Google Apps Scriptを利用してNintendo Storeをスク ...

GASとLINEを連携させて通知メッセージを送る方法のメモ
GASとLINEを連携させて通知メッセージを送る方法のメモ

Google Apps ScriptとLINEを連携させ、LINEに何らかの通知 ...

GASで「カクヨム」の更新状況をスクレイピングで取得する
GASで「カクヨム」の更新状況をスクレイピングで取得する

Google Apps Scriptの勉強として「カクヨム」の指定した小説が更新 ...

GASでGoogleカレンダーと連携してイベントの取得・追加・削除
GASでGoogleカレンダーと連携してイベントの取得・追加・削除

Google Apps Scriptの勉強としてGoogleカレンダーと連携させ ...

GASとChatworkを連携してメッセージを送信する方法
GASとChatworkを連携してメッセージを送信する方法

Google Apps Scriptの勉強として「Chatwork」と連携させて ...