GAS で公開中/予定の映画情報をスクレイピングして Slack へ定期的にポストする
プライベート用スマホにしている Android のパフォーマンスがどんどん劣化しており、結果 Line があまり使いこなせず、家庭内(=個人向け) Slack を導入したいと思いはじめいろいろ調べている。
そうするうちに Twitter Bot の Cron Job としてのみ使っていた(放置していた) Google App Script 環境との相性が良さそうとだなとわかり、何か自分向けサービスめいたものを画策している。
服でも道具でもなんでも、カスタムできるという点が愛着につながると思う。
まずは簡単な定期実行ものを作ってみた。
参考たち
主にこちらを活用させていただいた。
スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた
市井に根付く Slack
家族間の連絡手段をLINEからSlackにしてみた話(追記あり)
パンチの効いた…
Slackがカップル専用アプリだった件
尊敬
割と本気で家庭用Slack Botを作ってみた
成果物イメージ
Slack 内のあるチャネルに対して、時間を決めて映画タイトル+詳細URLを流し込むことができた。
*コンマは消せなかった・・・orz
以下やったことを羅列していきます。
GAS サンプル
var slack = { postUrl: 'https://slack.com/api/chat.postMessage', token: 'xoxp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', channelId: "hogehoge", userName: "映画bot", icon_Emoji: ":whale:", // テキスト量が多いと表示されなかったりする・・・ } var postMessage = function(text) { UrlFetchApp.fetch(slack["postUrl"], { "method" : "post", "payload" : { token: slack["token"], channel: slack["channelId"], username: slack["userName"], icon_emoji: slack["icon_Emoji"], text: text } }); } function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; var titlenow = sheet.getSheetValues(4,2,20,4); var titleupcoming = sheet.getSheetValues(4,7,20,6); // 抜き出したいエクセルの範囲指定方法。詳しくは https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetValues(Integer,Integer,Integer,Integer) postMessage("いま公開中の映画:movie_camera:は"+ String.fromCharCode(10) + titlenow + String.fromCharCode(10) + "だよ:movie_camera:"); postMessage("近日公開予定の映画:movie_camera:は"+ String.fromCharCode(10) + titleupcoming + String.fromCharCode(10) + ":movie_camera:以上"); }
GAS 作成の前提条件
元となる Google Spreadsheet を作成し、次に解説している「スプレッドシートサンプル」のような情報を記載しておく。
次に、ツール > スクリプトエディタ
から GAS 作成画面へ。
スプレッドシートの解説
使った関数はIMPORTXML
とCONCATENATE
の2つ。
タイトル
=IMPORTXML(https://filmarks.com/movies/showing/now, "//*[@class='c-movie-item']/h3/a")
注意
・実際にはキャプチャの通り URL および XPATH は別セルに入れておいて、関数の中身は (B2, D2)
といったシンプル設計
・セミコロンとコロンが重複しないよう注意
映画詳細リンク
=CONCATENATE("https://filmarks.com", IMPORTXML(https://filmarks.com/movies/showing/now, "//*[@class='c-movie-item']/h3/a/@href")
)`
注意
・「タイトル」同様関数の中身は直打ちしていない。
・一旦 F 列に相対リンク (/movies/62215)などを生成し、その後CONCATENATE
関数で合体させている
Slack Token 情報取得
事前に Your app を作成しておく必要あり。
https://api.slack.com/apps
新し目の記事でないと、Slack 側の GUI が変わっており戸惑った。
Slack APIのTokenの取得・場所
Features > OAuth & Permissions
というタブで何を許可したら最小限か正直わからなかったが、Post するという目的からして
OTHER > Post to specific channels in Slack. > incoming-webhook
かなと思ってそれ以外は追加していない。
Features Incoming Webhooks
でも Activate してある。
Redirect URL
も空欄のままでよかった。
Slack チャネル情報取得
プライベートのチャネル https://api.slack.com/methods/groups.list/test
パブリックのチャネル https://api.slack.com/methods/channels.list/test
"id": "HOGEHOGE",
という情報だけが必要
仕上げ
トリガーの設定(GAS における Cron 的なもの)を作成。 N時間おきだったり、ある週のある時間だったり(ただし1時間おきに設定しても2~30分のずれは当たり前)