Upload2ZCManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Networking;
  5. using ToneTuneToolkit.Common;
  6. using UnityEngine.Events;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. using System;
  10. using System.Text;
  11. /// <summary>
  12. /// 对志城综合法宝
  13. /// </summary>
  14. public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
  15. {
  16. // ==================================================
  17. #region 2025.6 VWAIPhoto
  18. public static UnityAction<Texture2D, bool> OnVWAvatarFinished;
  19. private const string VWSUBMITURL = @"https://vw-v-space.studiocapsule.cn/api/device/submitTask";
  20. public void UpgradeVWUserData(string gender, string car, string address, Texture2D file)
  21. {
  22. uVWUD.gender = gender;
  23. uVWUD.car = car;
  24. uVWUD.address = address;
  25. uVWUD.file = file.EncodeToPNG();
  26. return;
  27. }
  28. // ==================================================
  29. // 提交生成任务
  30. public void SubmitVWUserPhoto() => StartCoroutine(nameof(SubmitVWUserPhotoAction));
  31. private IEnumerator SubmitVWUserPhotoAction()
  32. {
  33. WWWForm wwwForm = new WWWForm();
  34. wwwForm.AddField("gender", uVWUD.gender);
  35. wwwForm.AddField("car", uVWUD.car);
  36. wwwForm.AddField("address", uVWUD.address);
  37. wwwForm.AddBinaryData("file", uVWUD.file);
  38. using (UnityWebRequest www = UnityWebRequest.Post(VWSUBMITURL, wwwForm))
  39. {
  40. www.downloadHandler = new DownloadHandlerBuffer();
  41. yield return www.SendWebRequest();
  42. if (www.result != UnityWebRequest.Result.Success)
  43. {
  44. Debug.Log($"[U2ZCM] {www.error}");
  45. yield break;
  46. }
  47. Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  48. try
  49. {
  50. rVWUD = JsonConvert.DeserializeObject<Respon_VWUserData>(www.downloadHandler.text);
  51. }
  52. catch
  53. {
  54. OnVWAvatarFinished?.Invoke(null, false);
  55. }
  56. if (rVWUD.code != 0)
  57. {
  58. Debug.Log($"[U2ZCM] Code Error");
  59. yield break;
  60. }
  61. StartQueryTask(); // 轮询直到出答案
  62. }
  63. yield break;
  64. }
  65. private Upload_VWUserData uVWUD = new Upload_VWUserData();
  66. [SerializeField] private Respon_VWUserData rVWUD = new Respon_VWUserData();
  67. [Serializable]
  68. public class Upload_VWUserData
  69. {
  70. public string gender;
  71. public string car;
  72. public string address;
  73. public byte[] file;
  74. }
  75. [Serializable]
  76. public class Respon_VWUserData
  77. {
  78. public int code;
  79. public Respon_VWUserDataData data;
  80. }
  81. [Serializable]
  82. public class Respon_VWUserDataData
  83. {
  84. public string task_code;
  85. }
  86. // ==================================================
  87. // 轮询
  88. private int queryCount = 0;
  89. private const string VWQUERYURL = @"https://vw-v-space.studiocapsule.cn/api/device/queryTask";
  90. public void StartQueryTask() { StartCoroutine(nameof(QueryTaskAction)); }
  91. public void StopQueryTask() { StopCoroutine(nameof(QueryTaskAction)); }
  92. private IEnumerator QueryTaskAction()
  93. {
  94. yield return new WaitForSeconds(5f); // 先等5秒
  95. while (true)
  96. {
  97. queryCount++;
  98. if (queryCount > 12)
  99. {
  100. Debug.Log($"[U2ZCM] 轮询次数过多,停止查询");
  101. OnVWAvatarFinished?.Invoke(null, false);
  102. yield break;
  103. }
  104. WWWForm wwwForm = new WWWForm();
  105. wwwForm.AddField("task_code", rVWUD.data.task_code);
  106. using (UnityWebRequest www = UnityWebRequest.Post(VWQUERYURL, wwwForm))
  107. {
  108. www.downloadHandler = new DownloadHandlerBuffer();
  109. yield return www.SendWebRequest();
  110. if (www.result != UnityWebRequest.Result.Success)
  111. {
  112. Debug.Log($"[U2ZCM] {www.error}");
  113. yield break;
  114. }
  115. Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  116. rVWAD = JsonConvert.DeserializeObject<Respon_VWAvatarData>(www.downloadHandler.text);
  117. if (rVWUD.code != 0)
  118. {
  119. Debug.Log($"[U2ZCM] Code Error");
  120. OnVWAvatarFinished?.Invoke(null, false);
  121. yield break;
  122. }
  123. switch (rVWAD.data.status)
  124. {
  125. default: break;
  126. case 3:
  127. queryCount = 0;
  128. Debug.Log("[U2ZCM] 开始下载图片");
  129. StartCoroutine(nameof(DownloadAvatarAction), rVWAD.data.avatar_url); // 下载图片
  130. yield break;
  131. case 4:
  132. OnVWAvatarFinished?.Invoke(null, false);
  133. break;
  134. }
  135. yield return new WaitForSeconds(5f);
  136. }
  137. }
  138. }
  139. [SerializeField] private Respon_VWAvatarData rVWAD = new Respon_VWAvatarData();
  140. [Serializable]
  141. public class Respon_VWAvatarData
  142. {
  143. public int code;
  144. public string message;
  145. public Respon_VWAvatarDataData data;
  146. }
  147. [Serializable]
  148. public class Respon_VWAvatarDataData
  149. {
  150. public string avatar_url;
  151. public int status;
  152. public string status_text;
  153. }
  154. // ==================================================
  155. // 获取图片
  156. private IEnumerator DownloadAvatarAction(string url)
  157. {
  158. using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
  159. {
  160. yield return www.SendWebRequest();
  161. if (www.result != UnityWebRequest.Result.Success)
  162. {
  163. Debug.Log($"[U2ZCM] {www.error}");
  164. yield break;
  165. }
  166. debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG
  167. OnVWAvatarFinished?.Invoke(DownloadHandlerTexture.GetContent(www), true);
  168. }
  169. yield break;
  170. }
  171. // ==================================================
  172. // 上传图片并获取二维码地址
  173. private const string VWUPLOADURL = @"https://vw-v-space.studiocapsule.cn/api/device/finalUpload";
  174. public void UploadVWResult(Texture2D value) => StartCoroutine(nameof(UploadVWResultAction), value);
  175. private IEnumerator UploadVWResultAction(Texture2D t2dResult)
  176. {
  177. WWWForm wwwForm = new WWWForm();
  178. wwwForm.AddField("task_code", rVWUD.data.task_code);
  179. wwwForm.AddBinaryData("file", t2dResult.EncodeToJPG(), "t2d.jpg", "image/jpeg");
  180. using (UnityWebRequest www = UnityWebRequest.Post(VWUPLOADURL, wwwForm))
  181. {
  182. www.downloadHandler = new DownloadHandlerBuffer();
  183. yield return www.SendWebRequest();
  184. if (www.result != UnityWebRequest.Result.Success)
  185. {
  186. Debug.Log($"[U2ZCM] {www.error}");
  187. yield break;
  188. }
  189. Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  190. rVWRD = JsonConvert.DeserializeObject<Respon_VWResultData>(www.downloadHandler.text);
  191. if (rVWRD.code != 0)
  192. {
  193. Debug.Log($"[U2ZCM] Code Error");
  194. yield break;
  195. }
  196. DownloadQRCode(rVWRD.data.qr_url);
  197. }
  198. yield break;
  199. }
  200. [SerializeField] private Respon_VWResultData rVWRD = new Respon_VWResultData();
  201. [Serializable]
  202. public class Respon_VWResultData
  203. {
  204. public int code;
  205. public string message;
  206. public Respon_VWResultDataData data;
  207. }
  208. [Serializable]
  209. public class Respon_VWResultDataData
  210. {
  211. public string qr_url;
  212. public string file_url;
  213. }
  214. #endregion
  215. // ==================================================
  216. // ==================================================
  217. // ==================================================
  218. #region 获取QR图片
  219. public static UnityAction<Texture2D> OnQRImageDownloaded;
  220. [SerializeField] private Texture2D debug_peekQRCode;
  221. public void DownloadQRCode(string url) => StartCoroutine(nameof(DownloadQRCodeAction), url);
  222. private IEnumerator DownloadQRCodeAction(string url)
  223. {
  224. using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
  225. {
  226. yield return www.SendWebRequest();
  227. if (www.result != UnityWebRequest.Result.Success)
  228. {
  229. Debug.Log($"[U2ZCM] {www.error}");
  230. yield break;
  231. }
  232. debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG
  233. OnQRImageDownloaded?.Invoke(DownloadHandlerTexture.GetContent(www));
  234. }
  235. yield break;
  236. }
  237. #endregion
  238. // ==================================================
  239. #region 上传文件流
  240. private const string uploadURL = @"https://vw-aud.studiocapsule.cn/api/device/uploadWall";
  241. public UnityAction<string> OnUploadFinished;
  242. public void UploadData(byte[] fileBytes) => StartCoroutine(nameof(UploadDataAction), fileBytes);
  243. private IEnumerator UploadDataAction(byte[] fileBytes)
  244. {
  245. WWWForm wwwForm = new WWWForm();
  246. wwwForm.AddBinaryData("file", fileBytes);
  247. using (UnityWebRequest www = UnityWebRequest.Post(uploadURL, wwwForm))
  248. {
  249. // www.SetRequestHeader("Content-Type", "multipart/form-data"); // wwwForm不要手动设置避免boundary消失
  250. www.downloadHandler = new DownloadHandlerBuffer();
  251. yield return www.SendWebRequest();
  252. if (www.result != UnityWebRequest.Result.Success)
  253. {
  254. Debug.Log($"[U2ZCM] {www.error}");
  255. yield break;
  256. }
  257. Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  258. ResponData responData = JsonConvert.DeserializeObject<ResponData>(www.downloadHandler.text);
  259. // // 解析方案A 动态类型
  260. // dynamic data = responData.data;
  261. // string qr = data.qr_url;
  262. // 解析方案B
  263. JObject data = JObject.FromObject(responData.data);
  264. string qr_url = data["qr_url"].ToString();
  265. // Debug.Log(qr_url);
  266. DownloadQRCode(qr_url);
  267. }
  268. yield break;
  269. }
  270. #endregion
  271. // ==================================================
  272. public class ResponData
  273. {
  274. public int code;
  275. public string message;
  276. public object data;
  277. }
  278. #region 2025.04 Nike ADT
  279. // private const string USERINFOREQUESTURL = @"https://nike-adt.studiocapsule.cn/api/device/scanQr";
  280. // public static UnityAction<UserInfo> OnUserInfoDownloaded;
  281. // /// <summary>
  282. // /// 获取用户信息
  283. // /// </summary>
  284. // /// <param name="url"></param>
  285. // public void GetUserInfo(string url) => StartCoroutine(nameof(GetUserInfoAction), url);
  286. // private IEnumerator GetUserInfoAction(string url)
  287. // {
  288. // WWWForm wwwForm = new WWWForm();
  289. // wwwForm.AddField("qr_content", url);
  290. // using (UnityWebRequest www = UnityWebRequest.Post(USERINFOREQUESTURL, wwwForm))
  291. // {
  292. // www.downloadHandler = new DownloadHandlerBuffer();
  293. // yield return www.SendWebRequest();
  294. // if (www.result != UnityWebRequest.Result.Success)
  295. // {
  296. // Debug.Log($"[U2ZCM] {www.error}");
  297. // yield break;
  298. // }
  299. // Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  300. // try
  301. // {
  302. // uird = JsonConvert.DeserializeObject<Respon_UserInfoData>(www.downloadHandler.text);
  303. // }
  304. // catch (Exception)
  305. // {
  306. // Debug.Log($"[U2ZCM] 解析错误");
  307. // yield break;
  308. // }
  309. // if (uird.code != 0)
  310. // {
  311. // if (OnUserInfoDownloaded != null)
  312. // {
  313. // OnUserInfoDownloaded(null);
  314. // }
  315. // yield break;
  316. // }
  317. // if (OnUserInfoDownloaded != null)
  318. // {
  319. // UserInfo ui = new UserInfo();
  320. // ui.name = uird.data.name;
  321. // ui.code = uird.data.code;
  322. // ui.save_car = uird.data.save_car;
  323. // ui.can_play = uird.data.can_play;
  324. // OnUserInfoDownloaded(ui);
  325. // }
  326. // }
  327. // yield break;
  328. // }
  329. // private Respon_UserInfoData uird = new Respon_UserInfoData();
  330. // [Serializable]
  331. // public class Respon_UserInfoData
  332. // {
  333. // public int code;
  334. // public string message;
  335. // public UserInfo data;
  336. // }
  337. // [Serializable]
  338. // public class UserInfo
  339. // {
  340. // public string name;
  341. // public string code;
  342. // public string save_car;
  343. // public string can_play;
  344. // }
  345. // // ==================================================
  346. // private const string USERIMAGEUPLOADURL = @"https://nike-adt.studiocapsule.cn/api/device/upload";
  347. // public static UnityAction<string> OnUserImageUploaded;
  348. // [SerializeField] private Upload_UserImageData uUID;
  349. // public void UpdateUserImageData(string user_code, Texture2D t2dPhoto)
  350. // {
  351. // uUID = new Upload_UserImageData();
  352. // uUID.user_code = user_code;
  353. // byte[] fileBytes = t2dPhoto.EncodeToPNG();
  354. // uUID.file = fileBytes;
  355. // return;
  356. // }
  357. // public void UploadUserImage() => StartCoroutine(nameof(UploadUserImageAction));
  358. // private IEnumerator UploadUserImageAction()
  359. // {
  360. // WWWForm wwwForm = new WWWForm();
  361. // wwwForm.AddField("user_code", uUID.user_code);
  362. // wwwForm.AddBinaryData("file", uUID.file);
  363. // using (UnityWebRequest www = UnityWebRequest.Post(USERIMAGEUPLOADURL, wwwForm))
  364. // {
  365. // www.downloadHandler = new DownloadHandlerBuffer();
  366. // yield return www.SendWebRequest();
  367. // if (www.result != UnityWebRequest.Result.Success)
  368. // {
  369. // Debug.Log($"[U2ZCM] {www.error}");
  370. // yield break;
  371. // }
  372. // Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
  373. // rUID = JsonConvert.DeserializeObject<Respon_UserImageData>(www.downloadHandler.text);
  374. // if (rUID.code != 0)
  375. // {
  376. // Debug.Log($"[U2ZCM] Code Error");
  377. // yield break;
  378. // }
  379. // DownloadQRCode(rUID.data.qr_url); // 搞图
  380. // }
  381. // yield break;
  382. // }
  383. // public class Upload_UserImageData
  384. // {
  385. // public string user_code;
  386. // public byte[] file;
  387. // }
  388. // private Respon_UserImageData rUID = new Respon_UserImageData();
  389. // [Serializable]
  390. // public class Respon_UserImageData
  391. // {
  392. // public int code;
  393. // public string message;
  394. // public Respon_UserImageDataData data;
  395. // }
  396. // [Serializable]
  397. // public class Respon_UserImageDataData
  398. // {
  399. // public string qr_url;
  400. // }
  401. #endregion
  402. }