とあるレビューのSlack通知機能を周り道してやった話

# はじめに

iOSエンジニアの[@Nao_RandD](https://twitter.com/Nao_RandD)です

この記事では**とあるサイトのレビューをSlackに通知すること**を実現するために、色々と回り道して実装した内容を紹介しようと思います🙋‍♀️

:::note info
エンジニアでない方も雰囲気がわかるように作成したため、**具体的なGCPの設定やPythonコード**は記事にはありません 🙇‍♀️
:::


# 関連
- Zapier
- Google Cloud Platform(GCP)
	- Cloud Functions
	- Cloud Scheduler
- Python
	- BeautifulSoup4
	- Selenium

:::message
**GCP**の設定や**Python**のスクレイピング実装でも色々書きたいことがありましたが、本記事では詳細な内容にはふれずにどういったことを試したかに集中して書いていきます
:::

# きっかけ
ある休日に大学からの友人（小規模なホステルを経営している）と一緒にご飯食べていて

![](https://storage.googleapis.com/zenn-user-upload/1989d4fe83fd-20231216.png)

友人
「従業員にレビュー評価を意識してもらいたくて、
	新規レビューがあったらスクショしてSlackに投稿してるー」

私
（小規模なホステルでは、ホテル予約サイトの評価はとても大切なんだなー。。）

友人
「お試しでやってることだけど割と面倒なのよねー」

私
「そのくらいなら自動化できるよー、サクッとー、多分...」
（Zapierだけでいけそう、、）

よし！やっていこうっ！

# 要件

つまり、次のような要件を満たすように、赤枠の部分を実装することになります

![](https://storage.googleapis.com/zenn-user-upload/4c02ca1e51b6-20231216.png)
*実装部の整理*


# 実現までの旅路

色々と回り道した軌跡をここから書いていきます

## 案①：　Zapierだけでやる（コードなし）

話を聞きながら想定していた方法から試していきます

Zapierを用いてノーコードで実現することを目指します
先ほどの図に当てはめると次のようになります

![](https://storage.googleapis.com/zenn-user-upload/46cf981a520a-20231216.png)
*Zapier導入時の整理*

Zapierでデータの整形・複数のステップは無料ではできません
https://zapier.com/pricing

![](https://storage.googleapis.com/zenn-user-upload/70477080b94b-20231216.png)
*Zapierのプランについて*

友人に交渉していきます

私
「Zapierの有料会員なってもらっていい？
　今後どこかの自動化とかにも使えるよ、多分...」

友人
「そのくらい全然いいよ！、ありがとう〜」

![](https://storage.googleapis.com/zenn-user-upload/558d2c4c8e69-20231216.png)


しかし、この案は失敗に終わります

![](https://storage.googleapis.com/zenn-user-upload/5393e1e60579-20231216.png)
*悲劇! トリガーができない*

図に想定していた、Zapierのトリガー想定のGmail通知ができなかったのです

## 案②： Zapier + スクレイピングでやる

友人にZapierの有料アカウントに切り替えてもらい、料金が発生している以上後には引けません！

次はコードも少し書いてやります。

コードはPythonの**BeautifulSoap4**と**Selenium**を用いてスクレイピングします
https://pypi.org/project/beautifulsoup4/

https://www.selenium.dev/about/


### スクレイピングしていいか確認（ざっくり）

スクレイピングをするので一様対象サイトが問題ないかを確認しておきます

**問題になる場合**
- サーバーに負荷をかけてしまった場合
	- （刑法233条偽計業務妨害罪、同234条電子計算機損壊等業務妨害罪）
- 個人情報を同意なく取得、公開、売買してしまった場合
	- （個人情報保護法違反）
- WebスクレイピングするWebサイトの利用規約に違反する場合
- 著作権を無視した利用、複製等を行ってしまった場合
	- （著作権法21条など）

「**WebスクレイピングするWebサイトの利用規約に違反する場合」**が怪しかったですが、スクレイピングするページは利用規約などの同意なく（ログインも不要で）閲覧できるページだから大丈夫そうです🤔

参考：https://pig-data.jp/blog_news/blog/scraping-crawling/scrapinglaw/

### 実装

その場合には以下の構成で進めることを目指します。
![](https://storage.googleapis.com/zenn-user-upload/6fb43a1ebdde-20231216.png)

ローカルで動作確認して問題なさそうだったので、ZapierのCode by Zapierにコードをのせていきます
https://help.zapier.com/hc/en-us/articles/8496326417549-Use-Python-code-in-Zaps#h_01H9FNT4XP4YQFSFCYDMZXG73T
*Zapier + スクレイピング時の整理*

しかし、この案も失敗に終わります

Zapierで実行すると次のエラーが出ました
```
Error:
Traceback (most recent call last): File "", line 10, in the_function ModuleNotFoundError: No module named 'bs4'

Please suggest me a solution for this. Thanks in advance.
```

BeautifulSoap4がimportできていないということですね

では、入れればいいよねとおもっていたのですが、ZapierのPython実行環境では標準ライブラリしか使用できないようでした🫠
https://community.zapier.com/code-webhooks-52/can-t-import-urllib-request-and-bs4-beautifulsoup-into-zapier-8646


## 案③： Zapirゼロでやる

「もうZapierいいかな、、、」、になってきたので、結局次の構成でゴリっとやりました、、、

GCP Cloud Schedulerで毎朝9時にトリガーし、GCP Cloud FunctionsでPub/Subを設定してからSlack AppからSlackに通知してもらいます

![](https://storage.googleapis.com/zenn-user-upload/8ac582b6f7f9-20231216.png)
*Zapierなし+GCPでの実現時の整理*

Slack Appを通知したいワークスペースに追加👏

![](https://storage.googleapis.com/zenn-user-upload/305644758550-20231216.png)


無事にSlackにレビューを通知することができました🎉

![](https://storage.googleapis.com/zenn-user-upload/58a98f77894d-20231216.png)


# まとめ

### 💪 Motto
- 下調べが甘くZapierひと月分の料金が完全に無駄な出費に
   - それぞれのレビューサイトでGmail通知ができない
   - ZapierはPythonの標準ライブラリしか実行できない
- 初めの発想からZapierに囚われたこと

### 👍 Good 
- GCPのトライアルが3ヶ月あったため成果物のランニングコストは無料（ただの幸運）
- 友人が美味しいご飯をご馳走してくれた
- 今回のネタになった

Zennの記事でも紹介させていただきましたが、Qiitaにも投稿させて頂きました。