BaiduTranslateEndpoint.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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;
  10. using XUnity.AutoTranslator.Plugin.Core.Configuration;
  11. using XUnity.AutoTranslator.Plugin.Core.Constants;
  12. using XUnity.AutoTranslator.Plugin.Core.Endpoints;
  13. using XUnity.AutoTranslator.Plugin.Core.Endpoints.Http;
  14. using XUnity.AutoTranslator.Plugin.Core.Extensions;
  15. using XUnity.AutoTranslator.Plugin.Core.Utilities;
  16. using XUnity.AutoTranslator.Plugin.Core.Web;
  17. namespace BaiduTranslate
  18. {
  19. internal class BaiduTranslateEndpoint : HttpEndpoint
  20. {
  21. 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}";
  22. private static readonly MD5 HashMD5 = MD5.Create();
  23. private string _appId;
  24. private string _appSecret;
  25. public override string Id => "BaiduTranslate";
  26. public override string FriendlyName => "Baidu Translator";
  27. public override void Initialize( IInitializationContext context )
  28. {
  29. _appId = context.GetOrCreateSetting( "Baidu", "BaiduAppId", "" );
  30. _appSecret = context.GetOrCreateSetting( "Baidu", "BaiduAppSecret", "" );
  31. if( string.IsNullOrEmpty( _appId ) ) throw new ArgumentException( "The BaiduTranslate endpoint requires an App Id which has not been provided." );
  32. if( string.IsNullOrEmpty( _appSecret ) ) throw new ArgumentException( "The BaiduTranslate endpoint requires an App Secret which has not been provided." );
  33. context.EnableSslFor( "api.fanyi.baidu.com" );
  34. // frankly, I have no idea what languages this does, or does not support...
  35. }
  36. public override void OnCreateRequest( IHttpRequestCreationContext context )
  37. {
  38. string salt = DateTime.UtcNow.Millisecond.ToString();
  39. var md5 = CreateMD5( _appId + context.UntranslatedText + salt + _appSecret );
  40. var request = new XUnityWebRequest(
  41. string.Format(
  42. HttpServicePointTemplateUrl,
  43. WWW.EscapeURL( context.UntranslatedText ),
  44. context.SourceLanguage,
  45. context.DestinationLanguage,
  46. _appId,
  47. salt,
  48. md5 ) );
  49. request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" : AutoTranslatorSettings.UserAgent;
  50. request.Headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
  51. context.Complete( request );
  52. }
  53. public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
  54. {
  55. var data = context.Response.Data;
  56. if( data.StartsWith( "{\"error" ) )
  57. {
  58. return;
  59. }
  60. var obj = JSON.Parse( data );
  61. var lineBuilder = new StringBuilder( data.Length );
  62. foreach( JSONNode entry in obj.AsObject[ "trans_result" ].AsArray )
  63. {
  64. var token = entry.AsObject[ "dst" ].ToString();
  65. token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
  66. if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
  67. lineBuilder.Append( token );
  68. }
  69. var translated = lineBuilder.ToString();
  70. context.Complete( translated );
  71. }
  72. private static string CreateMD5( string input )
  73. {
  74. byte[] inputBytes = Encoding.UTF8.GetBytes( input );
  75. byte[] hashBytes = HashMD5.ComputeHash( inputBytes );
  76. StringBuilder sb = new StringBuilder();
  77. for( int i = 0 ; i < hashBytes.Length ; i++ )
  78. {
  79. sb.Append( hashBytes[ i ].ToString( "X2" ) );
  80. }
  81. return sb.ToString().ToLower();
  82. }
  83. }
  84. }