5
8

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 1 year has passed since last update.

Google Apps Scriptで、Slackに(またはLINE BotやTwitterにも)ネコチャンをpostする

Last updated at Posted at 2021-03-26

Teamsにネコチャンの画像を定期postする を作成されたという話に倣い、Slackにネコチャンを定期postする。The Cat APIというCaas(Cats as a Service)を利用する。

The Cat APIとは?

ネコチャンの画像のURLをランダムに渡してくれるAPI。ドキュメントがある。API自体はこれだけ。

  1. https://api.thecatapi.com/v1/images/search にGET
  2. 受け取ったJSONの最初の配列を取りだして
  3. .urlのURLにアクセス
  4. Enjoy the ネコチャン 😺

保守対応で心が傷み分報を荒らしている。今回はこのネコチャンと、Google Apps Script(以降GASと表記する)を用い、以下フローを達成することで当該問題の解決を目論む(そんなすごい話じゃない)。

  1. GASからThe Cat APIに接続しネコチャン画像を取得
  2. n時間おきにSlackの私の分報チャンネルにネコチャンpost
  3. 「殺伐としたSlack channelにネコチャンがにゃーん」

GASからCat APIに接続する

UrlFetchApp.fetch を用います。
GASでHTTPクライアント処理を実施する(URL Fetch Service) 等参考に。Cat APIはAPIアクセスの手習いにシンプルでオススメです。
https://api.thecatapi.com/v1/images/search にGetリクエストを投げると以下が取得できます。

[{"breeds":[],"id":"bbv","url":"https://cdn2.thecatapi.com/images/bbv.jpg","width":500,"height":334}]

よってこれをGAS的スクリプトにすると以下。

function myFunction() {
  var json = UrlFetchApp.fetch('https://api.thecatapi.com/v1/images/search').getContentText();
  var jsonData = JSON.parse(json);
  var url = jsonData[0].url;
  console.log(url);
 }

json形式のデータの取り出し方は 【GAS GoogleAppsScript | 基礎コード】JSONデータを扱うためのJSONオブジェクト の例などが分かりやすい。以下引用。

function test() {
  // JSON形式の文字列を用意する
  var str = '[{"name":"ひらちん","age":30,"like":["game","basketball","eat"]},{"name":"ひらこ","age":28,"like":["nail","cooking"]}]'
  
  // JSON.stringifyでJSON形式の文字列に変換する
  var obj = JSON.parse(str)
  
  // ログに書き出す
  Logger.log(obj[0].name)     // ひらちん
  Logger.log(obj[1].name)     // ひらこ
  Logger.log(obj[0].like[1])  // basketball
  Logger.log(obj[1].age)      // 28.0
  Logger.log(obj[1].like)     // [nail, cooking]
}

n時間おきにSlackのチャンネルにネコチャンpost

さてこれをSlackのチャンネルに定期ポストしたい。ここではSlackのワークフロービルダーにおける、Webhookを用います。

変数を設定しておきます。ここでは text

任意のチャンネルに送信することにします。ここでは個人の分報を指定しました。
image.png
メッセージには先に設定しておいた変数、text を利用します。

ワークフローを保存するとURLが表示されます。GAS側にて使います。GASに戻り、以下のようにしておきました。

//Workflowで定義したURLです
var postUrl = 'https://hooks.slack.com/workflows/ZZZZZZZZZ/YYYYYYYYYYY/0000000000/xxxxxxxxxxxxxxxxxxxxxxxx'; 
var username = 'ねこです';  // 通知時に表示されるユーザー名

function sendMessage(text) {
  var jsonData =
  {
     "text" : text,
     "username" : username
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

function がデバッグ、実行できることを確認したら、GASでTriggerを Time-Driven で設定します。今回は8時間おきに起動するようにしました。

完成

スクリプトエディタ上でデバッグの例。
image.png

全体としてこんな感じです。

neko.gs
var postUrl = 'https://hooks.slack.com/workflows/ZZZZZZZZZ/YYYYYYYYYYY/0000000000/xxxxxxxxxxxxxxxxxxxxxxxx'; //Workflowで定義されています
var username = 'ねこです';  // 通知時に表示されるユーザー名

function myFunctionJSON() {
  var json = UrlFetchApp.fetch('https://api.thecatapi.com/v1/images/search').getContentText();
  var jsonData = JSON.parse(json);
  var url = jsonData[0].url;
  console.log(url);
 sendMessage(url);
 } 

function sendMessage(text) {
  var jsonData =
  {
     "text" : text,
     "username" : username
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

殺伐とした channel にネコチャン登場。
image.png
にゃーん!!

追記: LINE Bot

同じ要領でネコチャンを応答するLINE Botもできる~。
Google Apps ScriptでLINE BOTつくったら30分で動かせた件 - Qiita を設定部分は参考。

LINE.gs
// LINE developersのメッセージ送受信設定に記載のアクセストークン
const CHANNEL_ACCESS_TOKEN = {アクセストークン};

var line_endpoint = 'https://api.line.me/v2/bot/message/reply';

//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
  var json = JSON.parse(e.postData.contents);

  //返信するためのトークン取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  //messageは送られたメッセージ内容
  var message = json.events[0].message.text;  
  //猫API
  var json = UrlFetchApp.fetch('https://api.thecatapi.com/v1/images/search').getContentText();
  var jsonData = JSON.parse(json);
  var url = jsonData[0].url;
  // メッセージを返信    
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
        'text': url , //URL
      }],
    }),
  });

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

追記: Twitter

Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる - Qiita

Twitter.gs
// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
  '{API Key}',       // 作成したアプリケーションのConsumer Key(API Key)
  '(API Secret)'  // 作成したアプリケーションのConsumer Secret(API Secret)
);

// 認証
function authorize() {
  twitter.authorize();
}

// 認証解除
function reset() {
  twitter.reset();
}

// 認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}

function sendMessage(text) {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: text }
  });
}

function myFunctionJSON() {
  var json = UrlFetchApp.fetch('https://api.thecatapi.com/v1/images/search?mime_types=gif').getContentText();
  var jsonData = JSON.parse(json);
  var url = jsonData[0].url;
  console.log(url);
 sendMessage(url);
 } 

参考

GAS活用

総務がGASで請求書業務を半自動化してみた。
Google Apps Script (GAS) で Slack 連携を実装する前に知っておくとよい 5 つのこと

API

Teamsにネコチャンの画像を定期postする
無料で使える (癒やされたいだけの) 公開APIリスト: ねこ、いぬ、キツネ、柴犬、ジブリ

以上なにがしか参考になればさいわいです。
Happy 猫ing !

5
8
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
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?