GAS で公開中/予定の映画情報をスクレイピングして Slack へ定期的にポストする

Index

  1. 参考たち
  2. 成果物イメージ
  3. GAS サンプル
  4. GAS 作成の前提条件
  5. スプレッドシートの解説
    1. タイトル
    2. 映画詳細リンク
    3. Slack Token 情報取得
    4. Slack チャネル情報取得
  6. 仕上げ

プライベート用スマホにしている 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分のずれは当たり前)。