はじめに
- Slackで遊びたい
- 業務の都合上、芸能人の結婚ニュースをいち早く知りたい(パパラッチではない)
という理由から、botを作ってみました。
自分のメモ用なので、説明雑です。すいません。
作り方
Slackアプリを作る
以下の記事を参考にさせてもらいました。
https://qiita.com/njn0te/items/097086f378873fca0510
https://qiita.com/kakakaori830/items/660f0d78435bfd60dcc9
マニフェストを編集
SeetingsのApp Manifestを編集。
botの権限を設定する(試行錯誤しながらだったので不要な権限入ってるかも)
manifest.yml
_metadata:
major_version: 1
minor_version: 1
display_information:
name: Gossip Madam
features:
bot_user:
display_name: Gossip Madam
always_online: true
oauth_config:
scopes:
bot:
- channels:history
- chat:write
- incoming-webhook
settings:
org_deploy_enabled: false
socket_mode_enabled: false
token_rotation_enabled: false
ワークスペースに追加
同じくSettingsのIncoming WebhookからURLを作成。
ここでbotが投稿する対象チャンネルを指定します。
生成したURLは後で使う
スクリプト作成
GASを使います。
gossipMadam.js
function gossipMadam() {
// オリコンニュースをスクレイピング
var url = "https://www.oricon.co.jp/news/tag/id/news_marriage/";
var content = UrlFetchApp.fetch(url).getContentText("Shift-JIS");
var title = Parser.data(content).from('<h2 class="title">').to('</h2>').build();
// スプレッドシートから前回実行時のタイトルを取得
var id = "XXX"; // スプレッドシートのID
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheetByName("title");
var preTitle = sheet.getRange("a1").getValue();
// 異なるタイトルだったらSlack投稿
if(preTitle != title){
sheet.getRange("a1").setValue(title);
var slackUrl = "https://hooks.slack.com/services/XXX"; // SlackのWebhook URL
var greeting = "ねえ聞いた?また芸能人が結婚したらしいわよ\n"
var ending = "\n他にも私が知らないニュースがあるかもしれないわ\n"
var options = {
"method" : "POST",
"headers": {"Content-type": "application/json"},
"payload" : '{"text":"' + greeting + title + ending + url + '"}'
};
UrlFetchApp.fetch(slackUrl, options).getContentText();
}
}
- オリコンニュースをスクレイピング(オリコンさんありがとうございます)
- 最新記事のタイトルを取得
- 前回取得したタイトルと異なっていれば、Slackで投稿
という感じに処理を組んでいます。
これを任意のタイミングでGASトリガーを設定すれば完成です。
最後に
「とりあえず動けばいいか」というスタンスで作っているので、以下が気に入らない点です。
- 更新に応じたタイムリーなスクリプト実行ができないので、トリガーをいくつも設定しないといけない。
- あんまり設定するとクロール先のサイトの迷惑になるので、日に2,3回にとどめたい
- 一度スプレッドシートを挟むところがブサイク
- 最新の記事しか取得しないので、実行のインターバルに2つ結婚発表があると投稿から漏れる
- 投稿時にURLも一緒に投稿して逃げてる
気が向いたら改善するかも?