跳轉至

发送聊天日志

聊天記錄收集系統 (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
內容類型 application/json
  • 請求主體
欄位名稱 類型 必填 描述
game_key 字串 Y 由公司 ID 和遊戲 ID 生成的金鑰值(16 個字符)。您可以在 Hive 控制台的 AI 服務 > 聊天濫用檢測 > 遊戲管理 > 確認加密金鑰中獲取此金鑰。公司 ID 和遊戲 ID 也可以在 Hive 控制台的 AI 服務 > 聊天濫用檢測 > 遊戲管理中獲得。
例) abcdefghijklmnop
chat_log 物件 Y 加密消息的數組或集合以及聊天計數。
  • 聊天記錄物件
欄位名稱 類型 必需 描述
chat_count int Y msg_array 中的訊息數量。
例如) 32(chat_count 和包含加密訊息的 msg_array 的大小必須相同。)
msg_array array Y 1 個或更多的訊息物件
  • 訊息物件;
欄位名稱 類型 必填 描述
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-DDTHH🇲🇲ss{.mmm}±hh:mm 或 YYYY-MM-DDTHH🇲🇲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-DDTHH🇲🇲ss{.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。
  • 範例

    • Python
    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)
    
    • Java
    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 status code: " + response.getStatusCode());
            System.out.println("Response body: " + 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
    //測試調用
    curl 
    -d '{"game_key": company key,"chat_log":{"chat_count" : 1,"msg_array":[{"2023-02-20T10:22:10+09:00", "msg":"加密文本"}]}}' 
    -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....."
                }
            ]
        }
    }
    
    • 結果
    {
        "result":{
            "result_code":"100",
            "result_msg":"success"
        }
    }