はじめに
こんにちは、エンジニアの mori です。
先日、メーリングリスト宛てに届いたメールのサブジェクト、本文を抜き出して、Mattermost APIでMattermostに投稿するということをやりました。
チャットでメールの共有できたら便利かなという思いで、試作してみたのですが、最終的にメールはメーラーの方が見やすく、検索もしやすいという結論に至り、残念ながら採用されませんでした。
せっかく、MattermostのAPIを使ってみたので、APIの使い方について少しまとめたいと思います。。
今回はAWSのLambda上でpythonを使用し、Mattermostのチャネルにメッセージ投稿とファイルを添付をやってみたいと思います。
準備
まず、MattermostAPIを利用するための準備として、パーソナルアクセストークンの作成と投稿するチャネルのIDを確認します。
パーソナルアクセストークン作成方法について
Mattermostのメニューから「アカウント設定」を開き、パーソナルアクセストークンを生成します。
トークンIDとアクセストークンが表示されます。(アクセストークンは再表示できませんので、必ずメモしてください)
(補足1)デフォルトでパーソナルアクセストークンは有効ではないかもしれません。アカウント設定に表示されない場合はシステムコンソールの統合機能からパーソナルアクセストークンを有効にしてください。
(補足2)また、メンバーに実施させたい場合は、「役割の管理」から特定のユーザに対してパーソナルアクセストークンを発行させる権限を設定する必要があります。
チャネルIDの確認方法
投稿したいチャネルの「情報を表示する」からチャネルIDを確認します。
PythonでのMattermostAPIを使ってみる
MattermostDriver
pythonからMattermost APIをたたくために、MattermostDriverのモジュールを使用します。
mattermostdriverはAWSのLambdaの標準モジュールではないので、カスタムレイヤーを利用しています。カスタムレイヤーの手順はここでは割愛します。
メッセージ投稿のサンプル
mattermostdriverを利用したメッセージ投稿はこんな感じで投稿できます。
(URL/ID/トークン/チャネルIDはサンプルなので環境に合わせて修正ください)
from mattermostdriver import Driver
# Mattermost Driver Setting
md = Driver({
'url': 'test.test.com',
'login_id': 'e6yqmj5qsiyz8n3eqrrrrgyaiw',
'token': 'mhf93gudnxbnifjh451w1q6ugwy',
'scheme': 'https',
'port': 443,
'veryfy': False
})
def lambda_handler(event, context):
# mattermostへのログイン処理
md.login()
# チャネルへのメッセージ投稿
md.posts.create_post(options={
'channel_id': '3bkmgw15gi84dq6p5tdt1oyc8w',
'message': 'post message'
})
# mattermostへのログアウト処理
md.logout()
ファイルを添付してみる
それでは、ファイルの添付も試してみたいと思います。
ファイルの添付は先にファイルをアップロード処理をします。
ファイルアップロードのfile_idをメッセージ投稿時にfile_idsをに指定することで、投稿メッセージへのファイルの添付ができます。
googleのTopをローカルにダウンロードしてからファイル添付する処理を書いてみました。
import json
import os
import urllib.request
from mattermostdriver import Driver
# 環境変数定義
mm_url = os.environ['MM_URL']
p_token = os.environ['MM_TOKEN']
login_id = os.environ['MM_TOKEN_USER']
channel_id = os.environ['MM_CHANNEL_ID']
# Mattermost Driver Setting
md = Driver({
'url': mm_url,
'login_id': login_id,
'token': p_token,
'scheme': 'https',
'port': 443,
'veryfy': False
})
# 投稿するメッセージ
post_msg = '============== ============== ============== \n' \
+ 'googleのトップをダウンロードし、\n' \
+ 'index.htmlを添付します。\n' \
+ '============== ============== ============== \n'
# 添付するファイルの保存
# lambdaのため/tmp配下に保存
url = "https://google.co.jp"
file_path = "/tmp/index.html"
urllib.request.urlretrieve(url, file_path)
def lambda_handler(event, context):
# mattermostへのログイン処理
md.login()
# ファイルをmattermostにアップロード
file_id = md.files.upload_file(
channel_id=channel_id,
files={'files': (file_path, open(file_path, errors='ignore'))}
)['file_infos'][0]['id']
# チャネルへのメッセージ投稿
md.posts.create_post(options={
'channel_id': channel_id,
'message': post_msg,
'file_ids': [file_id]
})
# mattermostへのログアウト処理
md.logout()
投稿結果
こんな感じになります。
まとめ
投稿する部分のソースはシンプルで簡単かと思いますので、いろいろ応用ができそうですね。
BotやWebhookなど、別の方法でも投稿はできますね。それらについても後日、ブログにまとめていければと思っています。
最後にMattermostの公式ブログでもMattermostAPIの利用方法が公開されていました。英語の記事ですが、わかりやすいかと、ぜひ、ご参考にしてください。
Mattermost integrations: Sending and receiving data with the Mattermost API