AWS

Mattermost API でメッセージ投稿を試してみた

はじめに

こんにちは、エンジニアの 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

Mattermost
Mattermost導入サービス

Recruit

ディーメイクでは各ポジションで一緒に働く仲間を募集中! エンジニア、デザイナー、ディレクターなど、多彩な職種があります。
一緒に成長していきましょう!

最新記事

おすすめ記事リンク

-AWS
-, , , , ,