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分のずれは当たり前)