fascinated with tofu

豆腐に魅せられて

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 作成画面へ。

スプレッドシートの解説

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