見出し画像

Google App Script 風俗サイトをスクレイピングして出勤情報に更新があった場合メール通知

こんにちは!
FooSystems と申します。

風俗店利用する時このキャストいつも埋まってるなと思うことありませんか? 私はあります。

ただ性欲は突然湧いてくるもので、そんな前もって予約なんてできませんよね。私もいつも見切り発車的に発射しています。

そこで、本課題に対して技術的な解決ができないかと思い記事書かせていただきました。


※ スクレイピングする際は対象のサイトの利用規約に準拠しつつ、高負荷がかからないようしましょう。
※ 記事中にアダルトな表現を含む場合がございますので閲覧する際はご注意ください。

ではイキます🚀

🎯 やりたいこと

風俗情報サイトの出勤情報を Google スプレッドシートのスクレイピングで定期取得して、更新があった場合にメール通知

📋 実装の流れ

  1. AppScript でプログラムを定期実行

  2. AppScript で出勤情報をスクレイピングして抽出

  3. 差分があった場合保存してメール通知

🧑🏻‍💻 Appscript でプログラムを定期実行

1. Google スプレッドシート を作成

Google スプレッドシートを新規作成して下記のような表を用意します。

Google スプレッドシート

テンプレートは以下に公開していますのでコピペでOKです。

2. AppScript を作成

Google スプレッドシートのメニューから「拡張機能」→ 「AppScript」を選択してください。

すると AppScript のプロジェクト画面が新規に立ち上がります。

AppScript プロジェクト編集画面

コードエディタ上の myFunction を以下のように書き換えてください。

function myFunction() {
  const sheet = SpreadsheetApp.getActiveSheet()
  const lastRow = sheet.getLastRow();
  const newRow = lastRow + 1

  // 実行日時を記録
  const date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss');
  sheet.getRange(newRow, 1).setValue(date);
}

簡単に解説するとスプレッドシートの一番最後の列に日付けを追加するプログラムになります。最後に Save アイコンを押してこのステップは完了です。

AppScript プロジェクト編集画面 - コード記入済

タイトルを適当なものに変えておきましょう。
「風俗情報スクレイピング」だと家族に見れらるとまずいので、若干濁して 「Fooスク」とします。

さて、次はプログラムを定期実行を設定していきます。

3. AppSheet でプログラムの定期実行を設定

AppScript では定期実行を「トリガー」という機能で実現できます。
サイドメニューの「時計のマーク」から設定が可能です。

AppScript トリガーメニュー

トリガーの画面上で「トリガーを追加」を選択します。
ポップアップ画面が立ち上がりますので、以下の内容で登録します。

App Script トリガー新規作成

時間間隔はユースケースに合わせて柔軟に変えてください。
最後に「保存」を押します。

Google 認証画面が立ち上がるので承認を押して、テーブルに列が追加されていれば完了です。

AppScript 登録済トリガー一覧

動作確認を行います。
最初に作成した Google スプレッドシート上に実行日時が記録されていれば成功です。

Google スプレッドシート実行日時の記録画面

🥢 AppScript でスクレイピングして抽出

次に実際にサイトをスクレイピングして勤怠情報を抽出します。
↓ テンプレートはこちら

1. スプレッドシートの準備

まずスクレイピング対象のURLをシートに登録します。
今回「デリヘルタウン」というサイトを解析に使います。
勤怠情報はキャストの詳細ページに記載があるので、詳細ページのURLを「サイトURL」の欄に登録します。

次に、B3 の欄に「.weekly_schedules」と記述します。
今回のスクレイピング対象のサイトは、勤怠情報が「.weekly_schedules」のブロックにあるためこの設定をしています。
抽出条件は対象のサイトごとに変更してお使いください。

勤怠情報を含むサイトブロックをインスペクターで表示

2. Cheerio ライブラリのセットアップ

次に解析に使うライブラリ Cheerio のセットアップを行います。

Cheerioとは?
CheerioとはHTMLを読み込んで、jQuery 方式でタグを指定で対象要素を取り出すことができるライブラリになります。

const $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');

こんな感じでHTMLデータからタグ、クラス指定で欲しいデータの取り出しが可能です。
Cheerio の詳しい使い方はこちら

では早速設定に移ります。

App Script に Cheerio のライブラリを追加

サイドメニュー中の「ライブラリ+」より以下のスクリプトIDを入力して追加を選択してください。これで Cheerio が利用できるようになります。

Script ID: 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0

3. 対象の要素をスクレイピングで取り出して保存

次に実際にサイトをスクレイピングして対象のタグを取り出したいと思います。

まず、以下のコードをコピペで myFunction 内に貼り付けます。
各コードの説明はコメント欄に記載しましたのでご欄ください。

function myFunction() {
  const sheet = SpreadsheetApp.getActiveSheet()
  const email = sheet.getRange("B1").getValue()
  const url = sheet.getRange("B2").getValue()
  const ref = sheet.getRange("B3").getValue()
  const lastRow = sheet.getLastRow();
  const lastText = sheet.getRange(lastRow, 2).getValue()
  const newRow = lastRow + 1

  // 実行日時
  const date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss');
  sheet.getRange(newRow, 1).setValue(date);

  // 勤怠データ取得
  const html = UrlFetchApp.fetch(url).getContentText();
  const $ = Cheerio.load(html);

  // 最後の取得結果と一致していた場合は通知処理
  const targetText = $(ref).text()
  let result;
  if (targetText === lastText) {
    result = "更新まだ"
  } else {
    result = "更新!!"
  }
  sheet.getRange(newRow, 2).setValue(targetText); 
  sheet.getRange(newRow, 3).setValue(result); 
  return
}

対象の要素を取り出し、更新の有無をチェック、結果をシートに書き込みます。こんな感じで対象サイトのソースと、更新の有無が保存されていれば成功です。

📩 AppScript でメール配信

ここまで来たらほぼ完成です。
次は更新があった場合のメール配信を実装します。
GmailApp.sendEmail の一行を以下の箇所に追記します。

if (targetText === lastText) {
  result = "更新まだ"
} else {
  GmailApp.sendEmail(email, "Fooシス", "サイトに更新がありました"); // ← 追加
  result = "更新!!"
}

プログラムを実行すると、Google の認証画面が立ち上がるので承認します。
テスト実行してメールが届けば実装完了です。

👋🏼 最後に、カスタマイズ方法や次回予告など

今回は「デリヘルタウン」を利用して実装しましたが、
スクレイピング対象のURLやタグを、スプレッドシート上でカスタムできるようにしているので、目的に合わせて変更して利用してみて下さい。

また機会があれば他サイトの対応や、勤怠情報のデータベース化、LINE通知など更新していきたいと思いますのでお楽しみに。

この記事が気に入ったらサポートをしてみませんか?