12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GASとSlackで芸能人の結婚ニュースを教えてくれるbotを作る

Last updated at Posted at 2022-01-05

はじめに

  • 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();
  }
}
  1. オリコンニュースをスクレイピング(オリコンさんありがとうございます)
  2. 最新記事のタイトルを取得
  3. 前回取得したタイトルと異なっていれば、Slackで投稿

という感じに処理を組んでいます。
これを任意のタイミングでGASトリガーを設定すれば完成です。

最後に

「とりあえず動けばいいか」というスタンスで作っているので、以下が気に入らない点です。

  • 更新に応じたタイムリーなスクリプト実行ができないので、トリガーをいくつも設定しないといけない。
    • あんまり設定するとクロール先のサイトの迷惑になるので、日に2,3回にとどめたい
  • 一度スプレッドシートを挟むところがブサイク
  • 最新の記事しか取得しないので、実行のインターバルに2つ結婚発表があると投稿から漏れる
    • 投稿時にURLも一緒に投稿して逃げてる

気が向いたら改善するかも?

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?