Webhooks
TalkPlus 대시보드에서 다음과 같이 webhook 설정을 할 수 있습니다:
- Webhook 기능 활성화
- 이벤트 트리거 대상 endpoint 입력
- Webhook를 트리거할 이벤트 선택
- HTTP POST request를 받을 수 있어야 합니다.
- JSON 형태의 이벤트 데이터를 처리할 수 있어야 합니다.
TalkPlus 서버에서 endpoint를 호출하고 응답이 없을 시, 5초 이후 1회 재시도 합니다.
TalkPlus에서는 다음 헤더 값을 가지고 endpoint를 호출합니다.
User-Agent | TalkPlus |
content-type | application/json |
x-talkplus-signature | payload를 App API Key로 sign하고(SHA-256) 결과값을 base64로 인코딩한 값 |
TalkPlus서버에서 보낸 request 진위여부를 확인하기 위해, request header의 x-talkplus-signature 값과 response body의 해시값을 직접 계산하여 동일한지 확인 할 수 있습니다.
Go
JavaScript
Python
data := "{\"hello\": \"world\"}"
secret := "<YOUR_APP_API_KEY>"
hash := hmac.New(sha256.New, []byte(secret))
hash.Write([]byte(data))
signature := base64.StdEncoding.EncodeToString(hash.Sum(nil))
log.Println("computed signature:", signature)
const body = "{\"hello\": \"world\"}";
const signature = crypto
.createHmac('sha256', '<YOUR_APP_API_KEY>')
.update(body)
.digest('base64');
console.log('signature:', signature);
import hmac
import hashlib
import base64
app_key = '<YOUR_APP_API_KEY>'
response_data = u'{"hello": "world"}'
# for python versions before v3.5.10
digest = hmac.new(app_key,
msg=response_data.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
# for python v3.5.10+,
# hmac.new function requires key to be bytes or bytearray object
digest = hmac.new(
app_key.encode('ascii'),
msg=response_data.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
hashed_response = base64.b64encode(digest).decode()
print('signature: ' + hashed_response)
Event | Trigger |
message | 메시지 전송 |
message_deleted | 메시지 삭제 |
channel_added | 채널 생성 |
channel_changed | 채널 수정 |
channel_removed | 채널 삭제 |
member_added | 채널에 사용자 추가 |
member_left | 채널에서 사용자 나감 또는 제외됨 |
member_banned | 채널 사용자 차단 |
member_unbanned | 채널 사용자 차단 해제 |
user_blocked | 사용자 차단 |
user_unblocked | 사용자 차단 해제 |
{
"event": "message",
"appId": "YOUR_APP_ID",
"channel":
{
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members":
[
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers":
[],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage":
{
"id": "sdf2l5s9j",
"channelId": "YOUR_CHANNEL_ID",
"senderId": "user123",
"username": "user123",
"profileImageUrl": "http://cdn.test.com/123.jpg",
"type": "text",
"text": "Hello world",
"data":
{
"customField": "customData"
},
"createdAt": 1583921400
}
},
"sender":
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
},
"message":
{
"id": "sdf2l5s9j",
"channelId": "YOUR_CHANNEL_ID",
"senderId": "user123",
"username": "user123",
"profileImageUrl": "http://cdn.test.com/123.jpg",
"type": "text",
"text": "Hello world",
"data":
{
"customField": "customData"
},
"createdAt": 1583921400
}
}
{
"event": "message_deleted",
"appId": "YOUR_APP_ID",
"channel":
{
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members":
[
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers":
[],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage":
{
"id": "sdf2l5s9j",
"channelId": "YOUR_CHANNEL_ID",
"senderId": "user123",
"username": "user123",
"profileImageUrl": "http://cdn.test.com/123.jpg",
"type": "text",
"text": "Hello world",
"data":
{
"customField": "customData"
},
"createdAt": 1583921400
}
},
"sender": // might be empty
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
},
"message":
{
"id": "sdf2l5s9j",
"channelId": "YOUR_CHANNEL_ID",
"senderId": "user123",
"username": "user123",
"profileImageUrl": "http://cdn.test.com/123.jpg",
"type": "text",
"text": "Hello world",
"data":
{
"customField": "customData"
},
"createdAt": 1583921400
}
}
{
"event": "channel_added",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null
}
}
{
"event": "channel_changed",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
}
}
{
"event": "channel_removed",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
}
}
{
"event": "member_added",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
},
"users": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
]
}
{
"event": "member_left",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
},
"users": [
{
"id": "user456",
"username": "user456",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
]
}
{
"event": "member_banned",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
},
"users": [
{
"id": "user456",
"username": "user456",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
]
}
{
"event": "member_unbanned",
"appId": "YOUR_APP_ID",
"channel": {
"id": "YOUR_CHANNEL_ID",
"name": "YOUR_CHANNEL_NAME",
"ownerId": "user123",
"type": "public",
"invitationCode": "",
"members": [
{
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1603184094285,
"createdAt": 1603184094285,
"lastReadAt": 0,
"lastSentAt": 1603244275376
}
],
"bannedUsers": [],
"updatedAt": 0,
"createdAt": 0,
"unreadCount": 0,
"lastReadAt": 0,
"lastMessage": null // null if there's no message in channel
},
"users": [
{
"id": "user456",
"username": "user456",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
]
}
{
"event": "user_blocked",
"appId": "YOUR_APP_ID",
"user": {
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
},
"blockedUser": {
"id": "user456",
"username": "user456",
"profileImageUrl": "http://cnd.test.com/456.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
}
{
"event": "user_unblocked",
"appId": "YOUR_APP_ID",
"user": {
"id": "user123",
"username": "user123",
"profileImageUrl": "http://cnd.test.com/123.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
},
"blockedUser": {
"id": "user456",
"username": "user456",
"profileImageUrl": "http://cnd.test.com/456.jpg",
"updatedAt": 1583924400,
"createdAt": 1583921400
}
}
Last modified 7mo ago