Python

【Python】LineworksのAPI経由でメッセージ送信や固定メニュー作成を行う

この記事は約11分で読めます。

 

LineworksのAPIドキュメントは以下になります

https://developers.worksmobile.com/jp/docs/introduction

 

今回はAPIの仕様がV2で変更になっていたようなので修正依頼を受け、その際の調査結果をメモしておきます

 

事前準備

 

まず必要な情報は以下になります。

 

client_id = "xxxx"
client_secret = "xxxx"
service_account_id = "xxxx.serviceaccount@xxxxx"
bot_id = "111111"
privatekey =
また認証情報作成には「pyjwt」というライブラリが必要なのでインストールしてください
!pip install pyjwt -q

アクセストークンの取得

 

APIを叩くための認証情報としてアクセストークンが必要になります

 

import jwt
from datetime import datetime
import urllib
import json
import requests

BASE_AUTH_URL = "https://auth.worksmobile.com/oauth2/v2.0"

def __get_jwt(client_id: str, service_account: str, privatekey: str) -> str:
    """Generate JWT for access token

    :param client_id: Client ID
    :param service_account: Service Account
    :param privatekey: Private Key
    :return: JWT
    """
    current_time = datetime.now().timestamp()
    iss = client_id
    sub = service_account
    iat = current_time
    exp = current_time + (60 * 60) # 1 hour

    jws = jwt.encode(
        {
            "iss": iss,
            "sub": sub,
            "iat": iat,
            "exp": exp
        }, privatekey, algorithm="RS256")

    return jws


def get_access_token(client_id: str, client_secret: str, service_account: str, privatekey: str, scope: str) -> dict:
    """Get Access Token

    :param client_id: Client ID
    :param client_secret: Client ID
    :param service_account: Service Account
    :param privatekey: Private Key
    :param scope: OAuth Scope
    :return: response
    """
    # Get JWT
    jwt = __get_jwt(client_id, service_account, privatekey)

    # Get Access Token
    url = '{}/token'.format(BASE_AUTH_URL)

    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    params = {
        "assertion": jwt,
        "grant_type": urllib.parse.quote("urn:ietf:params:oauth:grant-type:jwt-bearer"),
        "client_id": client_id,
        "client_secret": client_secret,
        "scope": scope,
    }

    form_data = params

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

    body = json.loads(r.text)

    return body
# get_jwt(client_id, service_account_id, privatekey)
outh_data = get_access_token(client_id, client_secret, service_account_id, privatekey, scope='bot, bot.read')
access_token = outh_data['access_token']
print(access_token)

 

botに譲渡する権限するは’bot, bot.read’ みたいな感じで文字列で,区切りで指定します。

 

上記を実行するとアクセストークンが取得できます。

参照:https://qiita.com/mmclsntr/items/5ee3b7f2422b05bc256c

 

メッセージ送信(ユーザー)

 

参照: https://developers.worksmobile.com/jp/docs/bot-user-message-send

 

import json
import requests

# 送信内容
content = {
  "content": {
    "type": "text",
    "text": "テストメッセージ" # 送信するテキスト内容
  }
}

# 送信先
user_id = 'xxxx@xxxx'


BASE_API_URL = "https://www.worksapis.com/v1.0"

def send_message_to_user(content: dict, bot_id: str, user_id: str, access_token: str):
    """Send message to a user

    :param content: Message content
    :param bot_id: Bot ID
    :param user_id: User ID
    :param access_token: Access Token
    """
    url = "{}/bots/{}/users/{}/messages".format(BASE_API_URL, bot_id, user_id)
    headers = {
          'Content-Type' : 'application/json',
          'Authorization': 'Bearer ' + access_token
        }

    params = content
    form_data = json.dumps(params)
    print(url)
    r = requests.post(url=url, data=form_data, headers=headers)
    print(r,r.text)
    r.raise_for_status()
send_message_to_user(content, bot_id, user_id, access_token)
print('メッセージを送信しました!')

 

メッセージ送信(ルーム)

 

ドキュメント: https://developers.worksmobile.com/jp/docs/bot-channel-message-send

 

import json
import requests

# 送信内容
content = {
  "content": {
    "type": "text",
    "text": "hello" # 送信するテキスト内容
  }
}

# 送信先
channel_id = '<チャンネルID>'


BASE_API_URL = "https://www.worksapis.com/v1.0"

def send_message_to_user(content: dict, bot_id: str, channel_id: str, access_token: str):
    """Send message to a user

    :param content: Message content
    :param bot_id: Bot ID
    :param channel_id: channel ID
    :param access_token: Access Token
    """

    url = "{}/bots/{}/channels/{}/messages".format(BASE_API_URL, bot_id, channel_id)
    # print("Bearer {}".format(access_token))
    headers = {
          'Content-Type' : 'application/json',
          'Authorization': 'Bearer ' + access_token
        }

    params = content
    form_data = json.dumps(params)
    r = requests.post(url=url, data=form_data, headers=headers)
    print(r,r.text)
    r.raise_for_status()
send_message_to_user(content, bot_id, channel_id, access_token)
print('メッセージを送信しました')

 

 

固定メニュー作成

 

ドキュメント: https://developers.worksmobile.com/jp/docs/bot-persistentmenu-create#PersistentMenuActionStruct

 

import json
import requests

BASE_API_URL = "https://www.worksapis.com/v1.0"


def create_menu(content: dict, bot_id: str, access_token: str):
    """Send message to a user

    :param content: Message content
    :param bot_id: Bot ID
    :param access_token: Access Token
    """

    url = "{}/bots/{}/persistentmenu".format(BASE_API_URL, bot_id)

    # print("Bearer {}".format(access_token))
    headers = {
          'Content-Type' : 'application/json',
          'Authorization': 'Bearer ' + access_token
        }

    params = content
    form_data = json.dumps(params)
    r = requests.post(url=url, data=form_data, headers=headers)
    print(r,r.text)
    r.raise_for_status()

create_menu(
   {
  "content": {
    "actions": [
      {
        "type": "message", #メニュータイプ
        "label": "Example label", #項目に表示されるラベル
        "text": "Example text",
        "postback": "Example postback",
      },
            {
        "type": "message", #メニュータイプ
        "label": "Example label", # 項目に表示されるラベル
        "text": "Example text",
        "postback": "Example postback",
      },      {
        "type": "message", #メニュータイプ
        "label": "Example label", # 項目に表示されるラベル
        "text": "Example text",
        "postback": "Example postback",
      },
      {
        "type": "uri", #メニュータイプ
        "label": "Example Homepage", # 項目に表示されるラベル
        "uri": "https://example.com",
        
      }
    ]
  }
}
, bot_id, access_token)

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました