share facebook facebook twitter menu hatena pocket slack

2019.07.24 WED

LINE WORKS トークBot をPythonで実装してみる 〜前編: API認証〜

はじめに

 ビジネス版LINEという位置付けのLINE WORKSにチャットボットを実装できます。
 最近、LINE WORKSのチャットボットを開発することになったので、その実装方法についてまとめようと思います。

LINEボットと同じ?

 LINEのチャットボットのAPIは Messaging APIと言いますが、LINE WORKSのAPIは LINE WORKS Bot Platform APIと言うそうです。
 私自身、これまでLINEのチャットボット開発をいくつか経験してきましたのでLINE WORKSの方もすぐ使えると思いましたが、やはりAPI仕様としてはほぼ別物という印象です。返答の仕方やメッセージの種類も異なります。
 ただ、UIは似たものですので使う側は馴染みやすいと思います。

LINE WORKS Developersドキュメント: https://developers.worksmobile.com/jp/document/300130001?lang=ja

サービスAPIとサーバーAPI

LINE WORKSのAPIには「サービスAPI」と「サーバーAPI」の2種類があります。

サービスAPI

ユーザーのログインが必要なAPIです。本人のデータへのみアクセスできます。

サーバーAPI

ユーザーのログインが不要な APIです。

API共通ガイド:https://developers.worksmobile.com/jp/document/3002001?lang=ja

APIそれぞれの説明にどちらの種類なのか記載されてます。
LINE WORKS トークBotで利用するAPIは「サーバーAPI」になります。なので、Token発行などはサーバーAPIの利用手順に沿って行います。

検証環境

言語: Python 3.7

0. 前準備

0.1. アカウント権限

対象のLINE WORKSのテナントへBotを設定するために、開発用のアカウントが必要です。

  • 管理画面の「メンバー > 管理者権限」で開発用の権限の作成 (権限は “サービス>Bot” および “developers”)
  • 作った管理者権限にメンバーを紐付け

0.2. LINE WORKS Developer Consoleで各種キーの発行

LINE WORKSのAPIを利用するために必要なキーをLINE WORKS Developer Consoleで発行します。

LINE WORKS Developer Console: https://developers.worksmobile.com/jp/console/openapi/main

項目 説明
API ID API認証用のAPI ID
Server API Consumer Key サーバー APIのConsumer Key
Server List ID Server List(ID登録タイプ) のID
Server List 認証キー 上のServer List IDに対応する認証キー (秘密鍵)

0.3. Botの登録

BotをLINE WORKS Developer Consoleで登録します。

Bot – LINE WORKS Developer Console: https://developers.worksmobile.com/jp/console/bot/view

1.「登録」をクリックし登録画面を開く
2. 必須となっている情報を入力
※ 「Callback URL」はボットのサーバーを構築後に「修正」から登録。
3. 「保存」をクリックし、Botリストへ戻る
4. 登録したBotを選択し、情報表示。記載されている Bot Noを控える。

0.4. 環境変数へ設定

上記で発行した各種キーを環境変数へ設定する。

0.5. Token 発行

トークBotのAPIを利用するにあたって、Tokenを発行する必要があります。

API認証の準備: https://developers.worksmobile.com/jp/document/1002002?lang=ja

JWT生成

使うもの

  • Server List ID
  • Server List 認証キー
import os
import jwt
import datetime

SERVER_LIST_ID = os.environ.get("SERVER_LIST_ID")  # Server List ID
SERVER_LIST_PRIVATEKEY = os.environ.get("SERVER_LIST_PRIVATEKEY")  # Server List 認証キー

def get_jwt():
    """
    JWTの生成
    """
    current_time = datetime.datetime.now().timestamp()

    iss = SERVER_LIST_ID
    iat = current_time
    exp = current_time + 3600 # 1時間有効
    secret = SERVER_LIST_PRIVATEKEY

    jwstoken = jwt.encode(
        {
            "iss": iss,
            "iat": iat,
            "exp": exp
        }, secret, algorithm="RS256")

    return jwstoken.decode('utf-8')

Token 発行

使うもの

  • 生成したJWT
  • API ID
import os
import json
import requests
import urllib

API_ID = os.environ.get("API_ID")  # API ID

def get_server_token(jwttoken):
    """
    Token発行
    """
    url = 'https://authapi.worksmobile.com/b/' + API_ID + '/server/token'
    headers = {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
    params = {
        "grant_type" : urllib.parse.quote("urn:ietf:params:oauth:grant-type:jwt-bearer"),
        "assertion" : jwttoken
    }

    form_data = params

    r = requests.post(url=url, data=form_data, headers=headers)

    body = json.loads(r.text)
    access_token = body["access_token"]

    return access_token

生成されたTokenを控えておく。

※ 注意

発行された access_token が 24 時間以内利用されない場合には自動的に失効しますので、ID 登録タイプの場合は必ず一日に一回 Token を発行してください。
access_token の発行時間を token 情報と共に保存し、 Server API の利用時には token の有効期限を確認することを推奨します。
access_token の有効期限内であっても、token の再発行を行うと以前の token は無効になります。

https://developers.worksmobile.com/jp/document/1002002?lang=ja

まとめ

上記のToken発行をまとめると、こんな感じです。

publish_token.py

import os
import json
import jwt
import requests
import urllib
import datetime


SERVER_LIST_ID = os.environ.get("SERVER_LIST_ID")  # Server List ID
SERVER_LIST_PRIVATEKEY = os.environ.get("SERVER_LIST_PRIVATEKEY")  # Server List 認証キー
API_ID = os.environ.get("API_ID")  # API ID


def get_jwt():
    """
    JWTの生成
    """
    current_time = datetime.datetime.now().timestamp()

    iss = SERVER_LIST_ID
    iat = current_time
    exp = current_time + 3600 # 1時間有効
    secret = SERVER_LIST_PRIVATEKEY

    jwstoken = jwt.encode(
        {
            "iss": iss,
            "iat": iat,
            "exp": exp
        }, secret, algorithm="RS256")

    return jwstoken.decode('utf-8')


def get_server_token(jwttoken):
    """
    Token発行
    """
    url = 'https://authapi.worksmobile.com/b/' + API_ID + '/server/token'
    headers = {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
    params = {
        "grant_type" : urllib.parse.quote("urn:ietf:params:oauth:grant-type:jwt-bearer"),
        "assertion" : jwttoken
    }

    form_data = params

    r = requests.post(url=url, data=form_data, headers=headers)

    body = json.loads(r.text)
    access_token = body["access_token"]

    return access_token


if __name__ == "__main__":
    jwttoken = get_jwt()
    access_token = get_server_token(jwttoken)

    print(access_token)

後編へ続く

次は実際のチャットボットの部分をまとめます。

後編:https://cloudpack.media/48211

参考

https://qiita.com/leo1109/items/2e82c899891f8e771315
https://qiita.com/tokotan/items/f615f4a62219d655436f

元記事はこちら

LINE WORKS トークBot をPythonで実装してみる 〜前編: API認証〜

山﨑 慎太郎

山﨑 慎太郎

2018/04 Join。サーバーレスやりがちなバックエンドエンジニア。大阪オフィス所属。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。