知識の枝

"All is well"

ChatworkAPIでチャット機能を利用する

約72日前 2022年3月6日21:44
デジタル
Django Python API

改訂履歴


2022/3/6 投稿

1. Chatworkとは?


ちまたにはChatworkというクラウド型のビジネス用チャットツールがあるようです。

このサービス自体は利用したことはありませんが、チャットに関係するAPIが提供されているみたいなので面白そうです。

Chatworkで提供されている "Chatwork API" をお試しで使ってみました。


2. 前準備


Chatwork APIの機能を使うには "API Token" と呼ばれるものが必要です。
(APIキーとも呼びますね)

API Tokenは個人が各々で取得する必要があります。

このトークンは無料で取得できますので、API機能を使ってみたい方は取得しましょう。


2.1 - 手順


リンク
Chatwork API へようこそ!

上記がChatwork APIの公式ドキュメントです。


スクロールして読み進めると、「Chatwork APIのご利用開始方法」という項目があります。

今回は個人で使いますので「フリープラン・パーソナルプランのお客様」の手順でAPI Tokenを取得します。


このドキュメントには詳しく載っていませんが、下記の手順でAPI Tokenをゲットします。

  1. アカウント登録
  2. マイチャットページへ移動
  3. サービス連携からTokenを取得



2.2 - Token取得


先程のドキュメントページの下部に "APIの利用申請" というリンクがありますので開きましょう。

リンクが見つからない方は以下からも開けます。
リンク
Chatwork ログイン

右上の "新規登録" からアカウントを作成します。


Google連携でもOKです。但し、後からChatwork用のパスワードを設定する必要があります。

新規登録を済ませましょう。



登録が完了しました。



マイチャットページが開きます。



右上の自分の名前をクリックするとメニューが表示されますので、"サービス連携" をクリックして下さい。




"API Token" タブを開きます。



ここでChatworkのパスワードを要求されます。

Google連携で登録した方はパスワードがありませんので、「再発行はこちら」というリンクから設定しましょう。

パスワードを入力して "表示" をクリックするとあなた専用のAPI Tokenが表示されますので、メモしておきましょう。



API Tokenを取得しましたので、早速APIを使ってみます。


3. 基本機能


チャットの基本機能を一通りやってみたいと思います。

今回試すのは

  • 自分の情報を取得
  • チャットルームの作成
  • メッセージの投稿
  • メッセージ一覧の取得
  • 送信済みメッセージの編集
  • メッセージの削除

以上を1つずつやってみます。


3.1 - 自分の情報を取得


今回はPythonを使ってAPIを利用するコードを書きます。
(他の言語でもコードが異なるだけでやることは同じです)


まず先にコードです。
Python
import requests

url = "https://api.chatwork.com/v2/me"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
pythonのrequestsライブラリを使ってエンドポイントに対してGETリクエストを実行しています。

エンドポイントは
"https://api.chatwork.com/v2/me"

Chatwork APIを使う上で共通して重要なのが、リクエストヘッダに "X-ChatWorkToken" というキーに対して、バリューとして "API Token" を付与することです。

これを忘れると、リクエストを実行してもエラーが返されます。
API Token関係のエラー
{
"errors": [
"Invalid API Token"
]
}



正しいAPI Tokenでリクエストを実行すれば、正しい結果がレスポンスとして返ってきます。
{
"account_id": あなたのID,
"room_id": マイチャットのルームID,
"name": "Tech Chuna",
"chatwork_id": "ChatworkのID",
"organization_id": 組織ID,
"organization_name": "",
"department": "",
"title": "",
"url": "",
"introduction": "",
"mail": "",
"tel_organization": "",
"tel_extension": "",
"tel_mobile": "",
"skype": "",
"facebook": "",
"twitter": "",
"avatar_image_url": "https://appdata.chatwork.com/avatar/ico_default_red.png",
"login_mail": "chuna.technology@gmail.com"
}
自分の情報が取得できました。


3.2 - チャットルームの作成


まずコードから。
Python
import requests

url = "https://api.chatwork.com/v2/rooms?name=ChatWorkTest&link=0&link_need_acceptance=1&members_admin_ids=あなたのID"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("POST", url, headers=headers)

print(response.text)
今回はPOSTリクエストです。

エンドポイントは
"https://api.chatwork.com/v2/rooms"

このエンドポイントに対し、クエリパラメータで必要な情報を付け足します。
?name=ChatWorkTest&link=0&link_need_acceptance=1&members_admin_ids=あなたのID


(必須)name = 作りたいチャットルームの名前
link = 招待リンクを作成するか
link_need_acceptance = 参加に管理者の承認を必要とするか
(必須)members_admin_ids = 参加メンバーのうち、管理者権限にしたいユーザーのアカウントID

(必須)と書いてあるのはクエリパラメータで必ず指定する必要があります。
その他のパラメータの入力は任意です。

POSTリクエストが成功すると、チャットルームが作成されます。



3.3 - メッセージの投稿


続いては先程作成したチャットルームにメッセージを投稿してみます。

Python
import requests

url = "https://api.chatwork.com/v2/rooms/264001607/messages?body=Hello%20World%21%20This%20is%20test%20message%20from%20Chuna."

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("POST", url, headers=headers)

print(response.text)
今回もPOSTリクエストです。

送信先のチャットルームIDをエンドポイントに含めます。
エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages"


クエリパラメータでメッセージ内容を付与します。
?body=Hello%20World%21%20This%20is%20test%20message%20from%20Chuna.


送信するメッセージをURLエンコードしてから "body=" の先にくっつけましょう。

ちなみに上記の例の文章は
"Hello World! This is test message from Chuna." をURLエンコードしたものです。

ちゃんとメッセージが送信されたか確認してみます。


問題無いですね。


3.4 - メッセージ一覧の取得


それではチャットルームに投稿されているメッセージの一覧を取得してみましょう。

Python
import requests

url = "https://api.chatwork.com/v2/rooms/264001607/messages"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
GETメソッドです。

エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages"


先程のメッセージの投稿と同様のエンドポイントです。

POSTメソッドなら "投稿"
GETメソッドなら "一覧の取得"

ということです。RESTの特徴ですね。

こんなレスポンスが返ってきます。
[
{
"message_id": "1552218962199154688",
"account": {
"account_id": あなたのID,
"name": "Tech Chuna",
"avatar_image_url": "https://appdata.chatwork.com/avatar/ico_default_red.png"
},
"body": "[info][title][dtext:chatroom_groupchat_created][/title][dtext:chatroom_chatname_is]ChatWorkTest[dtext:chatroom_set]\n\n[dtext:chatroom_member_is][piconname:あなたのID][dtext:chatroom_added][/info]",
"send_time": 1646551439,
"update_time": 0
},
{
"message_id": "1552220710947053568",
"account": {
"account_id": あなたのID,
"name": "Tech Chuna",
"avatar_image_url": "https://appdata.chatwork.com/avatar/ico_default_red.png"
},
"body": "Hello World! This is test message from Chuna.",
"send_time": 1646551856,
"update_time": 0
}
]
チャットルーム内のメッセージの一覧をJSON形式で取得できました。


ブラウザからチャットを送信して内容を増やした状態で、再度API経由で一覧を取得してみます。

ブラウザからメッセージを送信。



もう一度先程を同じAPIを叩いてレスポンスを取得してみました。
[
{
"message_id": "1552223320513024000",
"account": {
"account_id": あなたのID,
"name": "Tech Chuna",
"avatar_image_url": "https://appdata.chatwork.com/avatar/ico_default_red.png"
},
"body": "これはブラウザから送信したメッセージです!",
"send_time": 1646552478,
"update_time": 0
}
]
今度は最新のメッセージだけ取得できました。

メッセージをすべて取得するか、差分のみ取得するかは選択することができます。

エンドポイントにクエリパラメータで "force=1" を指定するとすべて取得できます。
(すべてと言いながら最新の100件までですが)

すべて取得する場合の書き方です。
Python
import requests

url = "https://api.chatwork.com/v2/rooms/264001607/messages?force=1" # 変更

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
url部分にクエリパラメータを追加しました。


ちなみに "force=0" で差分のみ取得となりますが、このforceを指定しない場合は勝手にforce=0が割り当てられます。


3.5 - 送信済みメッセージの編集


一度送ったメッセージを修正したい場合もAPI経由で編集可能です。

Python
import requests

url = "https://api.chatwork.com/v2/rooms/264001607/messages/1552223320513024000?body=%E3%81%93%E3%82%8C%E3%81%AF%E5%A4%89%E6%9B%B4%E5%BE%8C%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E3%81%99%E3%80%82"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("PUT", url, headers=headers)

print(response.text)
書き換える場合はPUTメソッドを使います。
これもRESTのルールに準じていますね。

エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages/1552223320513024000"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages/[メッセージID]"


このエンドポイントに対してクエリパラメータで変更後のメッセージを付与します。
?body=%E3%81%93%E3%82%8C%E3%81%AF%E5%A4%89%E6%9B%B4%E5%BE%8C%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E3%81%99%E3%80%82
「これは変更後のメッセージです。」という文章をURLエンコードしたものです。



しっかり書き換わっていました。


3.6 - メッセージの削除


最後はメッセージの削除です。

Python
import requests

url = "https://api.chatwork.com/v2/rooms/264001607/messages/1552223320513024000"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("DELETE", url, headers=headers)

print(response.text)
先程の "編集" と同じエンドポイントに対してDELETEメソッドを使います。

今回は対象のメッセージを消すだけなのでクエリパラメータは不要です。



ちゃんと消えました。



4. APIの使い道


このAPIを利用してどんなことが出来るか考えてみました。

自作のWEBアプリと組み合わせるのであれば、例えば

  • フォームで受け取った文章をチャットに転送する
  • 最新のチャットをアプリのトップページに表示する

などでしょうか。


4.1 - Djangoの例


チャットの一覧を取得して表示するページを作ってみます。
URL例:http://example.com/chat/


urls.py
from django.urls import path
from . import views

urlpatterns = [
path('chat/', views.Chat, name='chat'),
]



最新チャットを表示するビューを作成します。
views.py
from django.shortcuts import render
import requests

def Chat(request):
"""
最新のチャットを表示するビュー
"""
template = "example.html"

# ここからChatwork APIを叩く部分
url = "https://api.chatwork.com/v2/rooms/264001607/messages?force=1"

headers = {
"Accept": "application/json",
"X-ChatWorkToken": "あなたのAPI Token"
}

response = requests.request("GET", url, headers=headers)
# API叩き終わり

# レスポンスからメッセージ本文データのみを取得する
messages = [message.get("body") for message in response.json()]

context = {
"messages": messages,
}

return render(request, template, context)
基本的には元のコードのままです。

API経由で取得したデータを加工してDjangoのHTMLテンプレートに表示する前準備をしています。

メッセージ本文は "body" に格納されていますので "message.get('body')" で取得しています。
[
{
"message_id": "1552223320513024000",
"account": {
"account_id": あなたのID,
"name": "Tech Chuna",
"avatar_image_url": "https://appdata.chatwork.com/avatar/ico_default_red.png"
},
"body": "これはブラウザから送信したメッセージです!", # この部分
"send_time": 1646552478,
"update_time": 0
}
]



本文をループ処理で取り出してリスト化。
[message.get("body") for message in response.json()]


そのままcontextとしてHTMLテンプレートに渡しています。


example.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
</body>
</html>
Djangoのテンプレートタグ機能を使い、先程のメッセージのリストを1つずつ取り出して<p>タグで囲って表示しています。


簡単ですがDjangoでChatwork APIを使う例でした。



5. WEB APIは基本的にどれも同じ


今回はChatwork APIの使い方を解説しました。

公式ドキュメントを読むとAPIの使い方が載っており、どのエンドポイントにどんなリクエストを投げれば良いかが分かります。

WEB APIはRESTというルールに基づいて作られていることが多く、このルールを把握しておけば全く異なるAPIでも何となく使い方が分かったりします。

動かしてみて慣れるのが一番ですね!

お疲れ様でした。
inu 約69日前 2022年3月9日0:13 返信する
どうもありがとうございました。
確認させていただきました

context = {
"messages": "messages",
}
ではなく

context = {
"messages": messages,
}
ですね
chuna 約69日前 2022年3月9日18:27
ご指摘ありがとうございます。
誤記修正しました。
inu 約69日前 2022年3月9日0:21 返信する
添付ファイルダウンロード(delete.PNG)
deleteしたメールを取得しないように、
どうすれば、よろしいでしょうか
inu 約69日前 2022年3月9日0:34 返信する
失礼いたしました。
解決出来ました。

<body>
{% for message in messages %}
{% if message|stringformat:"s" != "[deleted]" %}
<p>{{ message }}</p>
{% endif %}
{% endfor %}
</body>