ChatworkAPIでチャット機能を利用する
約72日前
2022年3月6日21:44
デジタル
Django Python API
2022/3/6 投稿
ちまたにはChatworkというクラウド型のビジネス用チャットツールがあるようです。
このサービス自体は利用したことはありませんが、チャットに関係するAPIが提供されているみたいなので面白そうです。
Chatworkで提供されている "Chatwork API" をお試しで使ってみました。
Chatwork APIの機能を使うには "API Token" と呼ばれるものが必要です。
(APIキーとも呼びますね)
API Tokenは個人が各々で取得する必要があります。
このトークンは無料で取得できますので、API機能を使ってみたい方は取得しましょう。
リンク
Chatwork API へようこそ!
上記がChatwork APIの公式ドキュメントです。
スクロールして読み進めると、「Chatwork APIのご利用開始方法」という項目があります。
今回は個人で使いますので「フリープラン・パーソナルプランのお客様」の手順でAPI Tokenを取得します。
このドキュメントには詳しく載っていませんが、下記の手順でAPI Tokenをゲットします。
先程のドキュメントページの下部に "APIの利用申請" というリンクがありますので開きましょう。
リンクが見つからない方は以下からも開けます。
リンク
Chatwork ログイン
右上の "新規登録" からアカウントを作成します。
![]()
Google連携でもOKです。但し、後からChatwork用のパスワードを設定する必要があります。
新規登録を済ませましょう。
![]()
登録が完了しました。
![]()
マイチャットページが開きます。
![]()
右上の自分の名前をクリックするとメニューが表示されますので、"サービス連携" をクリックして下さい。
![]()
"API Token" タブを開きます。
![]()
ここでChatworkのパスワードを要求されます。
Google連携で登録した方はパスワードがありませんので、「再発行はこちら」というリンクから設定しましょう。
パスワードを入力して "表示" をクリックするとあなた専用のAPI Tokenが表示されますので、メモしておきましょう。
![]()
API Tokenを取得しましたので、早速APIを使ってみます。
チャットの基本機能を一通りやってみたいと思います。
今回試すのは
以上を1つずつやってみます。
今回はPythonを使ってAPIを利用するコードを書きます。
(他の言語でもコードが異なるだけでやることは同じです)
まず先にコードです。
Python
エンドポイントは
"https://api.chatwork.com/v2/me"
Chatwork APIを使う上で共通して重要なのが、リクエストヘッダに "X-ChatWorkToken" というキーに対して、バリューとして "API Token" を付与することです。
これを忘れると、リクエストを実行してもエラーが返されます。
API Token関係のエラー
正しいAPI Tokenでリクエストを実行すれば、正しい結果がレスポンスとして返ってきます。
まずコードから。
Python
エンドポイントは
"https://api.chatwork.com/v2/rooms"
このエンドポイントに対し、クエリパラメータで必要な情報を付け足します。
(必須)name = 作りたいチャットルームの名前
link = 招待リンクを作成するか
link_need_acceptance = 参加に管理者の承認を必要とするか
(必須)members_admin_ids = 参加メンバーのうち、管理者権限にしたいユーザーのアカウントID
(必須)と書いてあるのはクエリパラメータで必ず指定する必要があります。
その他のパラメータの入力は任意です。
POSTリクエストが成功すると、チャットルームが作成されます。
![]()
続いては先程作成したチャットルームにメッセージを投稿してみます。
Python
送信先のチャットルームIDをエンドポイントに含めます。
エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages"
クエリパラメータでメッセージ内容を付与します。
送信するメッセージをURLエンコードしてから "body=" の先にくっつけましょう。
ちなみに上記の例の文章は
"Hello World! This is test message from Chuna." をURLエンコードしたものです。
ちゃんとメッセージが送信されたか確認してみます。
![]()
問題無いですね。
それではチャットルームに投稿されているメッセージの一覧を取得してみましょう。
Python
エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages"
先程のメッセージの投稿と同様のエンドポイントです。
POSTメソッドなら "投稿"
GETメソッドなら "一覧の取得"
ということです。RESTの特徴ですね。
こんなレスポンスが返ってきます。
ブラウザからチャットを送信して内容を増やした状態で、再度API経由で一覧を取得してみます。
ブラウザからメッセージを送信。
![]()
もう一度先程を同じAPIを叩いてレスポンスを取得してみました。
メッセージをすべて取得するか、差分のみ取得するかは選択することができます。
エンドポイントにクエリパラメータで "force=1" を指定するとすべて取得できます。
(すべてと言いながら最新の100件までですが)
すべて取得する場合の書き方です。
Python
ちなみに "force=0" で差分のみ取得となりますが、このforceを指定しない場合は勝手にforce=0が割り当てられます。
一度送ったメッセージを修正したい場合もAPI経由で編集可能です。
Python
これもRESTのルールに準じていますね。
エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages/1552223320513024000"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages/[メッセージID]"
このエンドポイントに対してクエリパラメータで変更後のメッセージを付与します。
![]()
しっかり書き換わっていました。
最後はメッセージの削除です。
Python
今回は対象のメッセージを消すだけなのでクエリパラメータは不要です。
![]()
ちゃんと消えました。
このAPIを利用してどんなことが出来るか考えてみました。
自作のWEBアプリと組み合わせるのであれば、例えば
などでしょうか。
チャットの一覧を取得して表示するページを作ってみます。
URL例:http://example.com/chat/
urls.py
最新チャットを表示するビューを作成します。
views.py
API経由で取得したデータを加工してDjangoのHTMLテンプレートに表示する前準備をしています。
メッセージ本文は "body" に格納されていますので "message.get('body')" で取得しています。
本文をループ処理で取り出してリスト化。
そのままcontextとしてHTMLテンプレートに渡しています。
example.html
簡単ですがDjangoでChatwork APIを使う例でした。
今回はChatwork APIの使い方を解説しました。
公式ドキュメントを読むとAPIの使い方が載っており、どのエンドポイントにどんなリクエストを投げれば良いかが分かります。
WEB APIはRESTというルールに基づいて作られていることが多く、このルールを把握しておけば全く異なるAPIでも何となく使い方が分かったりします。
動かしてみて慣れるのが一番ですね!
お疲れ様でした。
デジタル
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をゲットします。
- アカウント登録
- マイチャットページへ移動
- サービス連携から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 requestspythonのrequestsライブラリを使ってエンドポイントに対してGETリクエストを実行しています。
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)
エンドポイントは
"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今回はPOSTリクエストです。
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)
エンドポイントは
"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今回もPOSTリクエストです。
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)
送信先のチャットルーム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 requestsGETメソッドです。
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)
エンドポイントは
"https://api.chatwork.com/v2/rooms/264001607/messages"
"https://api.chatwork.com/v2/rooms/[ルームID]/messages"
先程のメッセージの投稿と同様のエンドポイントです。
POSTメソッドなら "投稿"
GETメソッドなら "一覧の取得"
ということです。RESTの特徴ですね。
こんなレスポンスが返ってきます。
[チャットルーム内のメッセージの一覧をJSON形式で取得できました。
{
"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
}
]
ブラウザからチャットを送信して内容を増やした状態で、再度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 requestsurl部分にクエリパラメータを追加しました。
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)
ちなみに "force=0" で差分のみ取得となりますが、このforceを指定しない場合は勝手にforce=0が割り当てられます。
3.5 - 送信済みメッセージの編集
一度送ったメッセージを修正したい場合もAPI経由で編集可能です。
Python
import requests書き換える場合はPUTメソッドを使います。
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)
これも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先程の "編集" と同じエンドポイントに対してDELETEメソッドを使います。
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)
今回は対象のメッセージを消すだけなのでクエリパラメータは不要です。
ちゃんと消えました。
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>Djangoのテンプレートタグ機能を使い、先程のメッセージのリストを1つずつ取り出して<p>タグで囲って表示しています。
<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で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>