Google Chat に自動投稿する方法

Google ChatPythonJavaScript

Google Chat のルームにプログラムで自動投稿する方法についてです。 事前に想像したよりかんたんであっけなかったですが、また次久しぶりにやるときに少し時間がかかるかもしれないので、かんたんに方法をまとめておきます。

Google Chat をプログラムから利用するパターンは大きく 2 つがありますが

  • 呼びかけに応答する bot を作る
  • 一方的に投稿だけする bot を作る

今回は後者の「投稿だけする方法」について扱います。

実装の選択肢

選択肢は大きく 3 つあります。

これらのうち、だんぜん手っ取り早くてかんたんなのは A です。 今回はこの方法を説明します(私は A しかやったことがありません)。

ちなみに、 Google Cloud Platform を利用している場合は B の選択肢もありですが、 B は下準備として「サービスアカウントを作って認証キーをダウンロードして」ということが必要なので、やりたいことに対してやや大がかりな感じがします。 C は B の選択肢が採れないとき(クライアントライブラリが提供されていない言語を使うとき)に仕方なく採る選択肢といった位置づけでしょうか。

以下かんたんな A の方法について説明します。

流れ

大きく次の流れで進めます。

  1. ルームを作成する
  2. ウェブフック URL を生成する
  3. ウェブフック URL を使って投稿を行う

1. ルームを作成する

Google Chat の使える Google アカウントでログインした状態で Google Chat のページを開き、ルームを追加します。 すでにルームを作成済みであればこのステップは不要です。

Google Chat でルームを作成

2. ウェブフック URL を生成する

ルームが作成できたら、ルームのメニューの「 Manage webhooks 」を選択して「 incoming webhooks 」を追加します。

Google Chat のルームで incoming webhook を追加

(このスクリーンショットでは「 Notifications 」というルームに incomming webhook を追加しようとしています)

参考: Using incoming webhooks  |  Google Chat API  |  Google Developers

3. ウェブフック URL を使って投稿を行う

ウェブフックが用意できたら、実際にその URL に対して POST リクエストをかけて投稿を行います。

POST リクエストさえできればよいので、言語やツールは馴染みのものを使えばよいかと思います。 ふだんプログラミングをしない方には環境のセットアップが不要な Google App Script がよいかもしれません。

投稿のフォーマットは 2 つあります(公式ドキュメントでは「 message formats 」と呼ばれています)(本記事執筆時点のものです、将来的に変わる可能性があります)。

  1. シンプルテキスト
  2. カード

シンプルテキストは Markdown 風のマークアップが可能なテキストの投稿です。

カードメッセージは画像やボタンを含むリッチな UI を提供するものです。カードには「テキストパラグラフ」「キーバリュー」「画像」「ボタン(リンク)」などの「ウィジェット」を複数個含めることができます。

参考: Google Chat message formats  |  Google Chat API  |  Google Developers

以下実装サンプルです。

Python のサンプル

Python 3 と requests を使ったサンプルです。 実行する前に requests をインストールしておく必要があります。

$ python -V
Python 3.9.4

$ pip install requests

$ python -m pip freeze | grep '^requests='
requests==2.25.1

シンプルテキスト simple_text.py:

import os

import requests

# 環境変数 `WEBHOOK_URL` を介して incoming webhook URL を受け取る
WEBHOOK_URL = os.environ['WEBHOOK_URL']

text = 'こんにちは。通知です。'
res = requests.post(WEBHOOK_URL, json={'text': text})
print(res.json())

カード card.py:

import os

import requests

# 環境変数 `WEBHOOK_URL` を介して incoming webhook URL を受け取る
WEBHOOK_URL = os.environ['WEBHOOK_URL']

title = 'こんにちは'
subtitle = 'これは通知です。'
paragraph = 'これは通知ですよね。'
widget = {'textParagraph': {'text': paragraph}}
res = requests.post(
    WEBHOOK_URL,
    json={
        'cards': [
            {
                'header': {
                    'title': title,
                    'subtitle': subtitle,
                },
                'sections': [{'widgets': [widget]}],
            }
        ]
    },
)
print(res.json())

参考: Incoming webhook with Python  |  Google Chat API  |  Google Developers

Node.js のサンプル

Node v14 と axios を使ったサンプルです。 実行する前に axios をインストールして置く必要があります。

$ node --version
v14.16.1

$ npm install --no-save axios

$ node -e 'console.log(require(`axios/package.json`).version)'
0.21.1

シンプルテキスト simple_text.js:

const axios = require(`axios`)

// 環境変数 `WEBHOOK_URL` を介して incoming webhook を受け取る
const WEBHOOK_URL = process.env.WEBHOOK_URL

const text = `こんにちは。通知です。`
axios.post(WEBHOOK_URL, {
  text: text,
})
.then((res) => {
  console.log(res)
})
.catch((err) => {
  console.error(err.toJSON())
})

カード card.js:

const axios = require(`axios`)

// 環境変数 `WEBHOOK_URL` を介して incoming webhook を受け取る
const WEBHOOK_URL = process.env.WEBHOOK_URL

const title = `こんにちは`
const subtitle = `これは通知です。`
const paragraph = `これは通知ですよね。`

axios.post(WEBHOOK_URL, {
  cards: [
    {
      header: {
        title: title,
        subtitle, subtitle,
      },
      sections: [
        {
          widgets: [
            {
              textParagraph: { text: paragraph },
            },
          ],
        },
      ],
    },
  ],
})
.then((res) => {
  console.log(res)
})
.catch((err) => {
  console.error(err.toJSON())
})

参考: Incoming webhook with Node  |  Google Chat API  |  Google Developers

どちらのパターンでも次のような感じで環境変数を渡して実行すると、実際に Google Chat に投稿が作成されることが確認できます。

WEBHOOK_URL='(取得した incoming webhook URL )' python simple_text.py
WEBHOOK_URL='(取得した incoming webhook URL )' node simple_text.js

以上です。

リンク

GitHub Gist にコードを置いたので試したい方は使ってみてください。


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら