BaiduTranslateEndpoint.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using SimpleJSON;
  8. using UnityEngine;
  9. using XUnity.AutoTranslator.Plugin.Core.Configuration;
  10. using XUnity.AutoTranslator.Plugin.Core.Constants;
  11. using XUnity.AutoTranslator.Plugin.Core.Extensions;
  12. namespace XUnity.AutoTranslator.Plugin.Core.Web
  13. {
  14. public class BaiduTranslateEndpoint : KnownEndpoint
  15. {
  16. private static readonly string HttpServicePointTemplateUrl = "http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}";
  17. private static readonly MD5 HashMD5 = MD5.Create();
  18. public BaiduTranslateEndpoint()
  19. : base( KnownEndpointNames.GoogleTranslate )
  20. {
  21. }
  22. private static string CreateMD5( string input )
  23. {
  24. byte[] inputBytes = Encoding.UTF8.GetBytes( input );
  25. byte[] hashBytes = HashMD5.ComputeHash( inputBytes );
  26. StringBuilder sb = new StringBuilder();
  27. for( int i = 0 ; i < hashBytes.Length ; i++ )
  28. {
  29. sb.Append( hashBytes[ i ].ToString( "X2" ) );
  30. }
  31. return sb.ToString().ToLower();
  32. }
  33. public override void ApplyHeaders( Dictionary<string, string> headers )
  34. {
  35. headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
  36. headers[ "Accept-Charset" ] = "UTF-8";
  37. }
  38. public override void ApplyHeaders( WebHeaderCollection headers )
  39. {
  40. headers[ HttpRequestHeader.UserAgent ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
  41. headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
  42. }
  43. public override void ConfigureServicePointManager()
  44. {
  45. ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "api.fanyi.baidu.com" );
  46. }
  47. public override bool TryExtractTranslated( string result, out string translated )
  48. {
  49. try
  50. {
  51. if( result.StartsWith( "{\"error" ) )
  52. {
  53. translated = null;
  54. return false;
  55. }
  56. var obj = JSON.Parse( result );
  57. var lineBuilder = new StringBuilder( result.Length );
  58. foreach( JSONNode entry in obj.AsObject[ "trans_result" ].AsArray )
  59. {
  60. var token = entry.AsObject[ "dst" ].ToString();
  61. token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
  62. if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
  63. lineBuilder.Append( token );
  64. }
  65. translated = lineBuilder.ToString();
  66. return true;
  67. }
  68. catch( Exception )
  69. {
  70. translated = null;
  71. return false;
  72. }
  73. }
  74. public override string GetServiceUrl( string untranslatedText, string from, string to )
  75. {
  76. string salt = DateTime.UtcNow.Millisecond.ToString();
  77. var md5 = CreateMD5( Settings.BaiduAppId + untranslatedText + salt + Settings.BaiduAppSecret );
  78. return string.Format( HttpServicePointTemplateUrl, WWW.EscapeURL( untranslatedText ), from, to, Settings.BaiduAppId, salt, md5 );
  79. }
  80. }
  81. }