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 サンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 作成画面へ。

スプレッドシートの解説

使った関数はIMPORTXMLCONCATENATEの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分のずれは当たり前)。