发送聊天日志
聊天记录收集系统 (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-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服务 > 聊天滥用检测 > 游戏管理 > 确认加密密钥(最大大小2KB,AES256加密)发出的加密密钥加密的JSON字符串 |
- 消息
字段名称 | 类型 | 必需 | 描述 |
---|---|---|---|
time_stamp | 字符串 | 是 | 转换聊天消息发生的时间为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 | 整数 | 是 | 聊天室编号 示例)123342 |
lang_code | 整数 | 是 | 语言代码 韩语(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 | 字符串 | 是 | 聊天内容 例如)你好!今天天气很好。 |
chat_mode | 整数 | 是 | 聊天类型 示例) 100:普通聊天 200:群聊(1:1~N) 300:耳语 4NN:游戏工作室定义的自定义聊天类型 |
channel_user_id | 整数 | 是 | 游戏中的用户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.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
//测试调用 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 //HEADER 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....." } ] } }
- 结果