チャットログを送信
チャットログ収集システム (CLCS)¶
チャットログを送信¶
このAPIはチャットログをチャットログ収集システムに送信します。
- リクエストURL
商用サーバーURL | https://clcs.qpyou.cn/chat/api/v1/send-chat-log |
---|---|
サンドボックスサーバーURL | https://sandbox-clcs.qpyou.cn/chat/api/v1/send-chat-log |
HTTPメソッド | POST |
Content-Type | application/json |
- リクエストボディ
フィールド名 | タイプ | 必須 | 説明 |
---|---|---|---|
game_key | 文字列 | Y | 会社IDとゲームIDから作成されたキー値(16文字)。このキーは、Hive コンソールの AI サービス > チャット悪用検出 > ゲーム管理 > 暗号化キーの確認 で取得できます。会社IDとゲームIDも Hive コンソールの AI サービス > チャット悪用検出 > ゲーム管理 で取得できます。 例) abcdefghijklmnop |
chat_log | オブジェクト | Y | 暗号化されたメッセージの配列またはコレクションとチャットカウント。 |
- チャットログオブジェクト
フィールド名 | タイプ | 必須 | 説明 |
---|---|---|---|
chat_count | int | Y | msg_array内のmsgの数。 例) 32 (chat_countと暗号化されたmsgを含むmsg_arrayのサイズは同じでなければなりません。) |
msg_array | array | Y | 1つ以上のmsgオブジェクト |
- メッセージオブジェクト;
フィールド名 | タイプ | 必須 | 説明 |
---|---|---|---|
time_stamp | 文字列 | Y | チャットメッセージの発生時刻をISO8601形式で変換して送信します。ISO8601形式でチャットメッセージのタイムスタンプを変更すると、メッセージを送信したユーザーの属するタイムゾーンに応じて、タイムスタンプの末尾に±hh:mmが追加されます。 送信者のタイムゾーンおよびチャットメッセージのタイムスタンプに応じたtime_stamp値の例 * タイムゾーンがUTCで、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 * 2023-03-30T17:13:00+00:00または2023-03-30T17:13:00Zを使用します。 * +00:00はZとしても書くことができます(YYYY-MM-DDTHHss{.mmm}±hh:mmまたはYYYY-MM-DDTHH:mm:ss{.mmm}Z) * タイムゾーンがKST(韓国標準時)で、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 * 2023-03-30T17:13:00+09:00を使用します。 * タイムゾーンがCST(中央標準時)で、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 2023-03-30T17:13:00-05:00を使用します。 |
msg | 文字列 | Y | Hive コンソールのAIサービス > チャット悪用検出 > ゲーム管理 > 暗号化キーの確認から発行された暗号化キーで暗号化されたJSON文字列(最大サイズ2KB、AES256暗号化) |
- メッセージ
フィールド名 | タイプ | 必須 | 説明 |
---|---|---|---|
time_stamp | 文字列 | Y | チャットメッセージの発生時刻をISO8601形式で変換して送信します。ISO8601形式でチャットメッセージのタイムスタンプを変更すると、メッセージを送信したユーザーの属するタイムゾーンに応じて、タイムスタンプの末尾に±hh:mmが追加されます。 送信者のタイムゾーンとチャットメッセージのタイムスタンプに応じたtime_stamp値の例 * タイムゾーンがUTCで、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 * 2023-03-30T17:13:00+00:00または2023-03-30T17:13:00Zを使用します。 * +00:00はZとしても書くことができます(YYYY-MM-DDTHHss{.mmm}±hh:mmまたはYYYY-MM-DDTHH:mm:ss{.mmm}Z) * タイムゾーンがKST(韓国標準時)で、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 * 2023-03-30T17:13:00+09:00を使用します。 * タイムゾーンがCST(中央標準時)で、チャットメッセージのタイムスタンプが2023-03-30 17:13:00の場合。 * 2023-03-30T17:13:00-05:00を使用します。 |
room_num | 整数 | Y | チャットルーム番号 例) 123342 |
lang_code | 整数 | Y | 言語コード 韓国語 (ko): 1, 英語 (en): 2, 日本語 (ja): 3, 簡体字中国語: 4, 繁体字中国語: 5, スペイン語 (es): 6, ロシア語 (ru): 7, ドイツ語 (de): 8, フランス語 (fr): 9, ポルトガル語 (pt): 10, イタリア語 (it): 11, タイ語 (th): 12, インドネシア語 (id): 13, トルコ語 (tr): 14, マレー語 (ms): 15, ベトナム語 (vi): 16 |
chat_msg | 文字列 | Y | チャット内容 例) こんにちは!今日は天気がいいですね。 |
chat_mode | 整数 | Y | チャットタイプ 例) 100: 一般チャット 200: グループ (1:1~N) チャット 300: ささやき 4NN: ゲームスタジオによって定義されたカスタムチャットタイプ |
channel_user_id | 整数 | Y | ゲーム内のユーザーID (playerId) |
- 応答
フィールド名 | タイプ | 説明 |
---|---|---|
result | オブジェクト | 出力結果のコンテナ |
result_code | 文字列 | 結果コード |
result_msg | 文字列 | 結果メッセージ |
- 結果コード
result_code | result_msg | 説明 |
---|---|---|
200 | 成功 | ログ転送が正常に完了しました。 |
500 | 不正なリクエスト | リクエストにエラーがあります。リクエストURLと必要なリクエスト変数が正しいことを確認してください。 |
501 | メッセージの数が一致しません | メッセージの数とchat_countが一致しません。chat_countとmsg_arrayの長さは一致する必要があります。 |
502 | 不正な秘密鍵 | 無効な秘密鍵の値です。 Hive コンソールのAIサービス > チャット悪用検出 > ゲーム管理 > 暗号鍵の確認に移動し、暗号鍵の値を確認してください。 |
503 | 登録されていないゲームキー | 無効なゲームキーの値です。 Hive コンソールのAIサービス > チャット悪用検出 > ゲーム管理 > 暗号鍵の確認に移動し、ゲームキーの値を確認してください。 |
506 | システムエラー | チャットログ収集システムがメンテナンス中のときにこのエラーが発生します。 |
507 | メッセージのサイズが大きすぎます | メッセージのサイズが大きすぎます。msg_arrayの最大サイズは2KBです。 |
-
例
- パイソン
import requests import json from Crypto.Cipher import AES from Crypto.Util.Padding import pad import base64 game_key = <GAME_KEY> secret_key = <SECRET_KEY> aes = AES.new(secret_key, AES.MODE_ECB) url = "https://clcs.qpyou.cn/chat/api/v1/send-chat-log" ## メッセージ暗号化 def encrypt_msg(room_num:int,lang_code:int,chat_msg:str,chat_mode:int,channel_user_id:int) -> str: json_data = { "time_stamp":"2023-02-20T10:22:10+09:00", ## datetime.now().isoformat() "room_num":room_num, "lang_code":lang_code, "chat_msg":chat_msg, "chat_mode":chat_mode, "channel_user_id":channel_user_id } json_str = json.dumps(json_data) padded_str = pad(json_str.encode("utf-8"),AES.block_size) encrypted_data = aes.encrypt(padded_str) encrypted_data_b64 = base64.b64encode(encrypted_data).decode("utf-8") return encrypted_data_b64 ## JSONペイロードを定義する json_payload = { "game_key": game_key, "chat_log":{ "chat_count": N, ## msg_arrayのサイズ "msg_array":[ { "time_stamp":"2023-02-20T10:22:10+09:00", "msg":encrypt_msg(room_num,lang_code,.......) }, { "time_stamp":"2023-02-20T10:22:10+09:00", "msg":encrypt_msg(room_num,lang_code,.......) }, ... ] } } def call_curl_post(url, json_payload): headers = {'Content-type': 'application/json'} response = requests.post(url, data=json.dumps(json_payload), headers=headers) ## 関数呼び出し call_curl_post(url=url, json_payload)
- ジャバ
import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import net.minidev.json.JSONObject; public class SampleCode { private String gameKey = <GAME_KEY>; private String secretKey = <SECRET_KEY>; private String url = "https://clcs.qpyou.cn/chat/api/v1/send-chat-log" public void callCurlPost() { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON_UTF8)); headers.setContentType(MediaType.APPLICATION_JSON); Map<String, Object> parameters = new HashMap<>(); parameters.put("game_key", gameKey); parameters.put("chat_log", "{"chat_count" : N //msg_array list size,"msg_array":[{"time_stamp":"2023-02-20T10:22:10+09 :00", "msg":encrypt_msg(,,....)},{"time_stamp":"2023-02-20T10:22:10+09:00", "msg ":encrypt_msg(,,....)}, ...]}"); JSONObject jsonParam = getJsonStringFromMap(parameters); HttpEntity<JSONObject> requestEntity = new HttpEntity<>(jsonParam, headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); System.out.println("レスポンスステータスコード: " + response.getStatusCode()); System.out.println("レスポンスボディ: " + response.getBody()); } // メッセージ暗号化 private String encrypt_msg(int room_num, int lang_code, String chat_msg, int chat_mode, int charnnel_user_id) throws Exception { Map<String,Object> map = new HashMap<String,Object>(); map.put("time_stamp", "2023-02-20T10:22:10+09:00"); //## "%Y-%m-%d %H:%M:%S", map.put("room_num", room_num); map.put("lang_code", lang_code); map.put("chat_msg", chat_msg); map.put("chat_mode", chat_mode); map.put("charnnel_user_id", charnnel_user_id); JSONObject encrypt_json = new JSONObject(map); String encrypt_str = encrypt_json.toJSONString(); return encrypt(encrypt_str, secret_key); } // 暗号化 private String encrypt(String plainText, String key) throws Exception { byte[] keyBytes = key.getBytes("UTF-8"); SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8")); return Base64.encodeBase64String(encryptedBytes); } private static JSONObject getJsonStringFromMap( Map<String, Object> map) { JSONObject jsonObject = new JSONObject(); for( Map.Entry<String, Object> entry : map.entrySet() ) { String key = entry. getKey(); Object value = entry. getValue(); jsonObject. put(key, value); } return jsonObject; } }
- カール
//テストコール curl -d '{"game_key": company key,"chat_log":{"chat_count" : 1,"msg_array":[{"2023-02-20T10:22:10+09:00", "msg":"Encrypted text"}]}}' -H "Content-Type: application/json" -X POST https://test-clcs.qpyou.cn/chat/api/v1/send-chat-log //ヘッダー POST https://clcs-qpyou.cn/v1/chat/send-chat-log Host: clcs-qpyou.cn User-Agent: curl/7.43.0 Accept: */* Content-Type: application/json //BODY { "game_key":"abcdefghijklmnop", "chat_log":{ "chat_count" : 2, "msg_array":[ { "time_stamp":"2023-02-20T10:22:10+09:00", "msg":"yBDyG1rCthbkXCSpSgGM+ZfHs/B3bZtnxq7f6BOPX2c1Bk8xRAwF6HbkDeN/9prpqeD......" }, { "time_stamp":"2023-02-20T10:22:10+09:00", "msg":"yBDyG1rCthbkXCSpSgGM+ZfHs/B3bZtnxq7f6BOPX2c1Bk8xRAwF6HbkDeN....." } ] } }
- 結果