ChatGTPAIHelper.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. using ComPDFKit_Conversion.Options;
  2. using DryIoc;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using PDF_Master.Properties;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Net.Http;
  13. using System.Text;
  14. using System.Text.RegularExpressions;
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. using System.Web;
  18. using static Dropbox.Api.Files.SearchMatchType;
  19. using static Dropbox.Api.TeamLog.EventCategory;
  20. namespace PDF_Master.Helper
  21. {
  22. public static class ChatGTPAIHelper
  23. {
  24. #if DEBUG
  25. //测试环境
  26. //纠错重写
  27. private static string host = "https://ai.compdf.com";
  28. //百度翻译
  29. private static string translate = "http://101.132.103.13:8030";
  30. #else
  31. //纠错重写
  32. private static string host ="http://prod-cn.your-api-server.com";
  33. //百度翻译
  34. private static string translate ="https://api-server.compdf.com";
  35. #endif
  36. /// <summary>
  37. /// 翻译文档Key接口
  38. /// </summary>
  39. private static string Uri_fileKeytranslate = translate + "/v1/translate/fileUpload";
  40. /// <summary>
  41. /// 翻译文档接口
  42. /// </summary>
  43. private static string Uri_filetranslate = translate + "/v1/translate/fileTranslateHandle";
  44. /// <summary>
  45. /// 翻译文本接口
  46. /// </summary>
  47. private static string Uri_texttranslate = translate + "/v1/translate/textTrans";
  48. /// <summary>
  49. /// 错别字纠正
  50. /// </summary>
  51. private static string Uri_Correction = host + "/api/correct-typos";
  52. /// <summary>
  53. /// 错别字纠正
  54. /// </summary>
  55. private static string Uri_Rewrite = host + "/api/rewrite";
  56. #region AI服务器对接接口
  57. /// <summary>
  58. /// 翻译指定内容,可以指定语言
  59. /// </summary>
  60. /// <param name="content"></param>
  61. /// <param name="language">1=中文 2=英文 3=法语 4=汉语</param>
  62. /// <returns></returns>
  63. public async static Task<string> fileKeyTranslate(string content, string filename)
  64. {
  65. ServicePointManager.DefaultConnectionLimit = 200;
  66. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Uri_fileKeytranslate);
  67. request.Method = "Post";
  68. //request.Accept = "application/vnd.api+json;version=1";
  69. request.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";
  70. request.Timeout = 20000;
  71. request.ServicePoint.Expect100Continue = false;
  72. var formData = new MultipartFormDataContent();
  73. byte[] data = File.ReadAllBytes(@content);
  74. MemoryStream stream = new MemoryStream(data);
  75. formData.Add(new ByteArrayContent(data), "file", filename);
  76. formData.Add(new StringContent("2"), "projectId");
  77. formData.Add(new StringContent("1.0.1"), "version");
  78. if (!string.IsNullOrEmpty(Settings.Default.UserDate.id))
  79. {
  80. formData.Add(new StringContent(Settings.Default.UserDate.id), "userId");
  81. }
  82. else
  83. {
  84. formData.Add(new StringContent("1"), "userId");
  85. }
  86. // 设置请求体格式
  87. request.ContentType = formData.Headers.ContentType.ToString();
  88. request.ContentLength = formData.Headers.ContentLength.Value;
  89. // 将FormData写入请求体
  90. using (var requestStream = request.GetRequestStream())
  91. {
  92. await formData.CopyToAsync(requestStream);
  93. }
  94. try
  95. {
  96. // 获取HTTP响应
  97. HttpWebResponse response2 = (HttpWebResponse)request.GetResponse();
  98. using (StreamReader reader = new StreamReader(response2.GetResponseStream()))
  99. {
  100. string responseData = reader.ReadToEnd();
  101. Console.WriteLine(responseData);
  102. reader.Close();
  103. JObject jobject = (JObject)JsonConvert.DeserializeObject(responseData);
  104. if (response2 != null)
  105. {
  106. response2.Close();
  107. }
  108. if (request != null)
  109. {
  110. request.Abort();
  111. }
  112. string translation = "";
  113. if (jobject["code"].ToObject<string>().ToLower() == "200")
  114. {
  115. translation = jobject["data"]["fileKey"].ToObject<string>().ToLower();
  116. return translation;
  117. }
  118. return "Code" + jobject["code"].ToObject<string>().ToLower();
  119. }
  120. }
  121. catch (WebException ex)
  122. {
  123. Trace.WriteLine("HTTP异常:" + ex.Message);
  124. return "Code" + "300";
  125. }
  126. }
  127. public static string HttpDownloadFile(string url, string path)
  128. {
  129. // 设置参数
  130. HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
  131. //发送请求并获取相应回应数据
  132. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  133. //直到request.GetResponse()程序才开始向目标网页发送Post请求
  134. Stream responseStream = response.GetResponseStream();
  135. //创建本地文件写入流
  136. Stream stream = new FileStream(path, FileMode.Create);
  137. byte[] bArr = new byte[1024];
  138. int size = responseStream.Read(bArr, 0, (int)bArr.Length);
  139. while (size > 0)
  140. {
  141. stream.Write(bArr, 0, size);
  142. size = responseStream.Read(bArr, 0, (int)bArr.Length);
  143. }
  144. stream.Close();
  145. responseStream.Close();
  146. return path;
  147. }
  148. /// <summary>
  149. /// 翻译指定内容,可以指定语言
  150. /// </summary>
  151. /// <param name="fileKey">文本Key</param>
  152. /// <param name="fromlanguage">文本语言</param>
  153. /// <param name="tolanguage">需要翻译的语言</param>
  154. /// <returns></returns>
  155. public static async Task<string> fileTranslate(string content, string fromlanguage, string tolanguage, bool isprocess = true)
  156. {
  157. intProcess(isprocess);
  158. FileInfo file = new FileInfo(content);
  159. string fileKey = await fileKeyTranslate(content, file.Name);
  160. App.mainWindowViewModel.Value = 1;
  161. if (fileKey.Contains("Code"))
  162. {
  163. clossProcess();
  164. return fileKey.Replace("Code", "");
  165. }
  166. HttpWebResponse response = null;
  167. ServicePointManager.DefaultConnectionLimit = 200;
  168. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Uri_filetranslate);
  169. request.Method = "Post";
  170. request.ContentType = "application/json";
  171. //request.Accept = "application/vnd.api+json;version=1";
  172. request.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";
  173. request.Timeout = 20000;
  174. request.ServicePoint.Expect100Continue = false;
  175. StringWriter sw = new StringWriter();
  176. using (JsonWriter writer = new JsonTextWriter(sw))
  177. {
  178. writer.WriteStartObject();
  179. writer.WritePropertyName("fileKey");
  180. writer.WriteValue(fileKey);
  181. writer.WritePropertyName("from");
  182. writer.WriteValue(fromlanguage);
  183. writer.WritePropertyName("to");
  184. writer.WriteValue(tolanguage);
  185. writer.WritePropertyName("projectId");
  186. writer.WriteValue("2");
  187. writer.WritePropertyName("version");
  188. writer.WriteValue("1.0.1");
  189. writer.WritePropertyName("userId");
  190. writer.WriteValue(Settings.Default.UserDate.id);
  191. writer.WriteEndObject();
  192. }
  193. try
  194. {
  195. App.mainWindowViewModel.Value = 2;
  196. string postBody = sw.ToString();
  197. using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
  198. {
  199. writer.Write(postBody);
  200. writer.Close();
  201. }
  202. App.mainWindowViewModel.Value = 3;
  203. response = (HttpWebResponse)request.GetResponse();
  204. using (StreamReader reader = new StreamReader(response.GetResponseStream()))
  205. {
  206. App.mainWindowViewModel.Value = 4;
  207. string responseData = reader.ReadToEnd();
  208. Console.WriteLine(responseData);
  209. reader.Close();
  210. JObject jobject = (JObject)JsonConvert.DeserializeObject(responseData);
  211. App.mainWindowViewModel.Value = 6;
  212. if (response != null)
  213. {
  214. response.Close();
  215. }
  216. if (request != null)
  217. {
  218. request.Abort();
  219. }
  220. if (jobject["code"].ToObject<string>().ToLower() == "200")
  221. {
  222. translate = jobject["data"]["ossDownUrl"].ToObject<string>().ToLower();
  223. //return jobject["code"].ToObject<string>().ToLower();
  224. using (var client = new WebClient())
  225. {
  226. App.mainWindowViewModel.Value = 8;
  227. string folderPath = file.FullName.Remove(file.FullName.LastIndexOf("."), file.FullName.Length - file.FullName.LastIndexOf(".")) + "_aiTranslation.pdf";
  228. folderPath = CommonHelper.CreateFilePath(folderPath);
  229. client.DownloadProgressChanged += (sender, e) =>
  230. {
  231. };
  232. client.DownloadFile(translate, folderPath);
  233. clossProcess();
  234. return folderPath;
  235. }
  236. }
  237. clossProcess();
  238. return jobject["code"].ToObject<string>().ToLower();
  239. }
  240. }
  241. catch(WebException ex)
  242. {
  243. clossProcess();
  244. Trace.WriteLine("HTTP异常:" + ex.Message);
  245. return "300";
  246. }
  247. }
  248. /// <summary>
  249. /// 翻译指定内容,可以指定语言
  250. /// </summary>
  251. /// <param name="content">翻译内容</param>
  252. /// <param name="fromlanguage">文本语言</param>
  253. /// <param name="tolanguage">需要翻译的语言</param>
  254. /// <returns></returns>
  255. public static String textTranslate(string content, string fromlanguage, string tolanguage, ref string translate)
  256. {
  257. HttpWebResponse response = null;
  258. ServicePointManager.DefaultConnectionLimit = 200;
  259. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Uri_texttranslate);
  260. request.Method = "Post";
  261. request.ContentType = "application/json";
  262. //request.Accept = "application/vnd.api+json;version=1";
  263. request.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";
  264. request.Timeout = 20000;
  265. request.ServicePoint.Expect100Continue = false;
  266. StringWriter sw = new StringWriter();
  267. using (JsonWriter writer = new JsonTextWriter(sw))
  268. {
  269. writer.WriteStartObject();
  270. writer.WritePropertyName("q");
  271. writer.WriteValue(content);
  272. writer.WritePropertyName("from");
  273. writer.WriteValue(fromlanguage);
  274. writer.WritePropertyName("to");
  275. writer.WriteValue(tolanguage);
  276. writer.WritePropertyName("projectId");
  277. writer.WriteValue("2");
  278. writer.WritePropertyName("version");
  279. writer.WriteValue("1.0.1");
  280. writer.WritePropertyName("userId");
  281. writer.WriteValue(Settings.Default.UserDate.id);
  282. writer.WriteEndObject();
  283. }
  284. try
  285. {
  286. string postBody = sw.ToString();
  287. using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
  288. {
  289. writer.Write(postBody);
  290. writer.Close();
  291. }
  292. response = (HttpWebResponse)request.GetResponse();
  293. using (StreamReader reader = new StreamReader(response.GetResponseStream()))
  294. {
  295. string responseData = reader.ReadToEnd();
  296. Console.WriteLine(responseData);
  297. reader.Close();
  298. JObject jobject = (JObject)JsonConvert.DeserializeObject(responseData);
  299. if (response != null)
  300. {
  301. response.Close();
  302. }
  303. if (request != null)
  304. {
  305. request.Abort();
  306. }
  307. if (jobject["code"].ToObject<string>().ToLower() == "200")
  308. {
  309. translate = jobject["data"]["dst"].ToObject<string>().ToLower();
  310. }
  311. //return jobject["code"].ToObject<string>().ToLower();
  312. return jobject["code"].ToObject<string>().ToLower();
  313. }
  314. }
  315. catch
  316. {
  317. return "300";
  318. }
  319. }
  320. /// <summary>
  321. /// 纠错
  322. /// </summary>
  323. /// <param name="content"></param>
  324. /// <returns></returns>
  325. public async static Task<string> Correction(string content)
  326. {
  327. intProcess(true, "Correction");
  328. System.Collections.Specialized.NameValueCollection namevalue = new System.Collections.Specialized.NameValueCollection();
  329. App.mainWindowViewModel.Value = 1;
  330. //需要纠错的内容
  331. namevalue["project_id"] = "2";
  332. namevalue["version"] = "1.0.1";
  333. if (!string.IsNullOrEmpty(Settings.Default.UserDate.id))
  334. {
  335. namevalue["user_id"] = Settings.Default.UserDate.id;
  336. }
  337. else
  338. {
  339. namevalue["user_id"] = "1";
  340. }
  341. namevalue["content"] = content;
  342. App.mainWindowViewModel.Value = 3;
  343. return await PostString(Uri_Correction, namevalue, "content");
  344. }
  345. /// <summary>
  346. /// 重写
  347. /// </summary>
  348. /// <param name="content"></param>
  349. /// <returns></returns>
  350. public async static Task<string> Rewrite(string content)
  351. {
  352. intProcess(true, "Rewrite");
  353. System.Collections.Specialized.NameValueCollection namevalue = new System.Collections.Specialized.NameValueCollection();
  354. App.mainWindowViewModel.Value = 1;
  355. //需要纠错的内容
  356. namevalue["project_id"] = "2";
  357. namevalue["version"] = "1.0.1";
  358. if (!string.IsNullOrEmpty(Settings.Default.UserDate.id))
  359. {
  360. namevalue["user_id"] = Settings.Default.UserDate.id;
  361. }
  362. else
  363. {
  364. namevalue["user_id"] = "1";
  365. }
  366. namevalue["content"] = content;
  367. App.mainWindowViewModel.Value = 3;
  368. return await PostString(Uri_Rewrite, namevalue, "content");
  369. }
  370. /// <summary>
  371. /// 从链接中返回存在的链接(仅返回第一个找到的链接)
  372. /// </summary>
  373. /// <param name="content"></param>
  374. /// <returns></returns>
  375. public static List<string> GetLinkFromString(string content)
  376. {
  377. if (string.IsNullOrEmpty(content))
  378. {
  379. return null;
  380. }
  381. // 创建正则表达式模式
  382. string pattern = @"(https?://[^\s]+)";
  383. // 获取所有匹配项
  384. MatchCollection matches = Regex.Matches(content, pattern);
  385. List<string> list = new List<string>();
  386. // 遍历并打印所有匹配项
  387. foreach (Match match in matches)
  388. {
  389. list.Add(match.Value);
  390. }
  391. return list;
  392. }
  393. public static string Code = "";
  394. /// <summary>
  395. /// 从接口获取信息,获取message对应value值
  396. /// </summary>
  397. /// <param name="url"></param>
  398. /// <param name="namevalue"></param>
  399. /// <returns></returns>
  400. private async static Task<string> PostString(string url, System.Collections.Specialized.NameValueCollection namevalue, string key = "message")
  401. {
  402. App.mainWindowViewModel.Value = 5;
  403. string repsonseData = "";
  404. try
  405. {
  406. using (var client = new WebClient())
  407. {
  408. byte[] bytes = await client.UploadValuesTaskAsync(url, namevalue);
  409. //转换成字符串类型
  410. var json = Encoding.Default.GetString(bytes);
  411. //将Json格式字符串转换成键值对
  412. //var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  413. JObject jobject = (JObject)JsonConvert.DeserializeObject(json);
  414. App.mainWindowViewModel.Value = 8;
  415. string unicode = "";
  416. // 遍历字典对象输出键值对
  417. Code = jobject["code"].ToObject<string>().ToLower();
  418. if (Code == "200")
  419. {
  420. unicode = jobject["data"][key].ToObject<string>().ToLower();
  421. }
  422. //将Unicode格式转换成String
  423. //repsonseData = Regex.Unescape(unicode);
  424. repsonseData = unicode;
  425. }
  426. clossProcess();
  427. }
  428. catch (Exception ex)
  429. {
  430. Code = "300";
  431. clossProcess();
  432. return null;
  433. }
  434. return repsonseData;
  435. }
  436. /// <summary>
  437. /// 初始进度条
  438. /// </summary>
  439. /// <param name="isprocess">是否需要进度条</param>
  440. /// <param name="progressTitle">文案</param>
  441. public static void intProcess(bool isprocess = true, string progressTitle = "Translating...")
  442. {
  443. if (isprocess)
  444. {
  445. App.mainWindowViewModel.ProgressTitle = progressTitle;
  446. App.mainWindowViewModel.MaxValue = 10;
  447. App.mainWindowViewModel.Value = 0;
  448. App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Visible;
  449. App.mainWindowViewModel.ProcessCloseBtnVisible = System.Windows.Visibility.Collapsed;
  450. }
  451. }
  452. /// <summary>
  453. /// 关闭进度条
  454. /// </summary>
  455. public static void clossProcess()
  456. {
  457. App.mainWindowViewModel.Value = 9;
  458. App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed;
  459. App.mainWindowViewModel.ProcessCloseBtnVisible = System.Windows.Visibility.Visible;
  460. }
  461. #endregion
  462. #region 支持翻译的语言
  463. /// <summary>
  464. /// 当前语言列表
  465. /// </summary>
  466. public static List<string> FromlanguageFamily { set; get; } = new List<string>();
  467. public static List<string> SetFromlanguageOrigin()
  468. {
  469. FromlanguageFamily.Clear();
  470. FromlanguageFamily.Add("Automatic Identification");
  471. FromlanguageFamily.Add("English");
  472. FromlanguageFamily.Add("Simplified Chinese");
  473. FromlanguageFamily.Add("Traditional Chinese");
  474. FromlanguageFamily.Add("Japanese");
  475. FromlanguageFamily.Add("Korean");
  476. FromlanguageFamily.Add("French");
  477. FromlanguageFamily.Add("Spanish");
  478. FromlanguageFamily.Add("Italian");
  479. FromlanguageFamily.Add("German");
  480. FromlanguageFamily.Add("Portuguese");
  481. FromlanguageFamily.Add("Russian");
  482. FromlanguageFamily.Add("Vietnamese");
  483. FromlanguageFamily.Add("Thai");
  484. FromlanguageFamily.Add("Arabic");
  485. FromlanguageFamily.Add("Greek");
  486. FromlanguageFamily.Add("Bulgarian");
  487. FromlanguageFamily.Add("Finnish");
  488. FromlanguageFamily.Add("Slovene");
  489. FromlanguageFamily.Add("Dutch");
  490. FromlanguageFamily.Add("Czech");
  491. FromlanguageFamily.Add("Swedish");
  492. FromlanguageFamily.Add("Polish");
  493. FromlanguageFamily.Add("Danish");
  494. FromlanguageFamily.Add("Romanian");
  495. FromlanguageFamily.Add("Hungarian");
  496. return FromlanguageFamily;
  497. }
  498. /// <summary>
  499. /// 需要翻译成对应语言列表
  500. /// </summary>
  501. public static List<string> TolanguageFamily { set; get; } = new List<string>();
  502. public static List<string> SetTolanguageOrigin()
  503. {
  504. TolanguageFamily.Clear();
  505. TolanguageFamily.Add("English");
  506. TolanguageFamily.Add("Simplified Chinese");
  507. TolanguageFamily.Add("Traditional Chinese");
  508. TolanguageFamily.Add("Japanese");
  509. TolanguageFamily.Add("Korean");
  510. TolanguageFamily.Add("French");
  511. TolanguageFamily.Add("Spanish");
  512. TolanguageFamily.Add("Italian");
  513. TolanguageFamily.Add("German");
  514. TolanguageFamily.Add("Portuguese");
  515. TolanguageFamily.Add("Russian");
  516. TolanguageFamily.Add("Vietnamese");
  517. TolanguageFamily.Add("Thai");
  518. TolanguageFamily.Add("Arabic");
  519. TolanguageFamily.Add("Greek");
  520. TolanguageFamily.Add("Bulgarian");
  521. TolanguageFamily.Add("Finnish");
  522. TolanguageFamily.Add("Slovene");
  523. TolanguageFamily.Add("Dutch");
  524. TolanguageFamily.Add("Czech");
  525. TolanguageFamily.Add("Swedish");
  526. TolanguageFamily.Add("Polish");
  527. TolanguageFamily.Add("Danish");
  528. TolanguageFamily.Add("Romanian");
  529. TolanguageFamily.Add("Hungarian");
  530. return TolanguageFamily;
  531. }
  532. /// <summary>
  533. /// 接口传值对应字符
  534. /// </summary>
  535. /// <param name="index">控制form与to的区别,form为0开始,to为1开始,因为to没有auto</param>
  536. /// <returns></returns>
  537. public static string UpdateLanguagebType(int index)
  538. {
  539. switch (index)
  540. {
  541. case 0:
  542. return "auto";
  543. case 1:
  544. return "en";
  545. case 2:
  546. return "zh";
  547. case 3:
  548. return "cht";
  549. case 4:
  550. return "jp";
  551. case 5:
  552. return "kor";
  553. case 6:
  554. return "fra";
  555. case 7:
  556. return "spa";
  557. case 8:
  558. return "it";
  559. case 9:
  560. return "de";
  561. case 10:
  562. return "pt";
  563. case 11:
  564. return "ru";
  565. case 12:
  566. return "vie";
  567. case 13:
  568. return "th";
  569. case 14:
  570. return "ara";
  571. case 15:
  572. return "el";
  573. case 16:
  574. return "bul";
  575. case 17:
  576. return "fin";
  577. case 18:
  578. return "slo";
  579. case 19:
  580. return "nl";
  581. case 20:
  582. return "cs";
  583. case 21:
  584. return "swe";
  585. case 22:
  586. return "pl";
  587. case 23:
  588. return "dan";
  589. case 24:
  590. return "rom";
  591. case 25:
  592. return "hu";
  593. default:
  594. return "";
  595. }
  596. }
  597. #endregion
  598. }
  599. }