diff --git a/config.go b/config.go index 203e17d6..f873189e 100644 --- a/config.go +++ b/config.go @@ -1,8 +1,8 @@ /* * @Author: Vincent Yang * @Date: 2024-04-23 00:39:03 - * @LastEditors: Vincent Yang - * @LastEditTime: 2024-06-18 02:40:52 + * @LastEditors: Vincent Young + * @LastEditTime: 2024-09-16 12:02:15 * @FilePath: /DeepLX/config.go * @Telegram: https://t.me/missuo * @GitHub: https://github.com/missuo @@ -14,13 +14,22 @@ package main import ( "flag" - "os" "fmt" + "os" ) +type Config struct { + IP string + Port int + Token string + AuthKey string + DlSession string + Proxy string +} + func initConfig() *Config { cfg := &Config{ - IP: "0.0.0.0", + IP: "0.0.0.0", Port: 1188, } diff --git a/main.go b/main.go index 5a4285f0..e9ad6190 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,15 @@ /* * @Author: Vincent Yang * @Date: 2023-07-01 21:45:34 - * @LastEditors: Vincent Yang - * @LastEditTime: 2024-09-15 02:00:23 + * @LastEditors: Vincent Young + * @LastEditTime: 2024-09-16 12:07:15 * @FilePath: /DeepLX/main.go * @Telegram: https://t.me/missuo * @GitHub: https://github.com/missuo * * Copyright © 2024 by Vincent, All Rights Reserved. */ + package main import ( @@ -19,6 +20,7 @@ import ( "os" "strings" + translate "github.com/OwO-Network/DeepLX/translate" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) @@ -57,6 +59,20 @@ func authMiddleware(cfg *Config) gin.HandlerFunc { } } +type PayloadFree struct { + TransText string `json:"text"` + SourceLang string `json:"source_lang"` + TargetLang string `json:"target_lang"` + TagHandling string `json:"tag_handling"` +} + +type PayloadAPI struct { + Text []string `json:"text"` + TargetLang string `json:"target_lang"` + SourceLang string `json:"source_lang"` + TagHandling string `json:"tag_handling"` +} + func main() { cfg := initConfig() @@ -119,7 +135,7 @@ func main() { return } - result, err := translateByDeepLX(sourceLang, targetLang, translateText, tagHandling, authKey, proxyURL) + result, err := translate.TranslateByDeepLX(sourceLang, targetLang, translateText, tagHandling, authKey, proxyURL) if err != nil { log.Fatalf("Translation failed: %s", err) } @@ -183,7 +199,7 @@ func main() { return } - result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, tagHandling, dlSession, proxyURL) + result, err := translate.TranslateByDeepLXPro(sourceLang, targetLang, translateText, tagHandling, dlSession, proxyURL) if err != nil { log.Fatalf("Translation failed: %s", err) } @@ -244,7 +260,7 @@ func main() { targetLang = jsonData.TargetLang } - result, err := translateByDeepLX("", targetLang, translateText, "", authKey, proxyURL) + result, err := translate.TranslateByDeepLX("", targetLang, translateText, "", authKey, proxyURL) if err != nil { log.Fatalf("Translation failed: %s", err) } diff --git a/translate.go b/translate/translate.go similarity index 74% rename from translate.go rename to translate/translate.go index 118b43fe..3f9bd581 100644 --- a/translate.go +++ b/translate/translate.go @@ -1,4 +1,16 @@ -package main +/* + * @Author: Vincent Young + * @Date: 2024-09-16 11:59:24 + * @LastEditors: Vincent Young + * @LastEditTime: 2024-09-16 12:06:21 + * @FilePath: /DeepLX/translate/translate.go + * @Telegram: https://t.me/missuo + * @GitHub: https://github.com/missuo + * + * Copyright © 2024 by Vincent, All Rights Reserved. + */ + +package translate import ( "bytes" @@ -47,71 +59,7 @@ func initDeepLXData(sourceLang string, targetLang string) *PostData { } } -func translateByOfficialAPI(text string, sourceLang string, targetLang string, authKey string, proxyURL string) (string, error) { - freeURL := "https://api-free.deepl.com/v2/translate" - textArray := strings.Split(text, "\n") - - payload := PayloadAPI{ - Text: textArray, - TargetLang: targetLang, - SourceLang: sourceLang, - } - - payloadBytes, err := json.Marshal(payload) - if err != nil { - return "", err - } - - req, err := http.NewRequest("POST", freeURL, bytes.NewBuffer(payloadBytes)) - if err != nil { - return "", err - } - - req.Header.Set("Authorization", "DeepL-Auth-Key "+authKey) - req.Header.Set("Content-Type", "application/json") - - var client *http.Client - if proxyURL != "" { - proxy, err := url.Parse(proxyURL) - if err != nil { - return "", err - } - transport := &http.Transport{ - Proxy: http.ProxyURL(proxy), - } - client = &http.Client{Transport: transport} - } else { - client = &http.Client{} - } - - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return "", err - } - - // Parsing the response - var translationResponse TranslationResponse - err = json.Unmarshal(body, &translationResponse) - if err != nil { - return "", err - } - - // Concatenating the translations - var sb strings.Builder - for _, translation := range translationResponse.Translations { - sb.WriteString(translation.Text) - } - - return sb.String(), nil -} - -func translateByDeepLX(sourceLang string, targetLang string, translateText string, tagHandling string, authKey string, proxyURL string) (DeepLXTranslationResult, error) { +func TranslateByDeepLX(sourceLang string, targetLang string, translateText string, tagHandling string, authKey string, proxyURL string) (DeepLXTranslationResult, error) { id := getRandomNumber() if sourceLang == "" { lang := whatlanggo.DetectLang(translateText) @@ -233,66 +181,38 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin Message: "Invalid target language", }, nil } + if resp.StatusCode == http.StatusTooManyRequests { + return DeepLXTranslationResult{ + Code: http.StatusTooManyRequests, + Message: "Too Many Requests", + }, nil + } - if resp.StatusCode == http.StatusTooManyRequests && authKey != "" { - authKeyArray := strings.Split(authKey, ",") - for _, authKey := range authKeyArray { - validity, err := checkUsageAuthKey(authKey) - if err != nil { - continue - } else { - if validity { - translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey, proxyURL) - if err != nil { - return DeepLXTranslationResult{ - Code: http.StatusTooManyRequests, - Message: "Too Many Requests", - }, nil - } - return DeepLXTranslationResult{ - Code: http.StatusOK, - Message: "Success", - ID: 1000000, - Data: translatedText, - SourceLang: sourceLang, - TargetLang: targetLang, - Method: "Official API", - }, nil - } - } - - } + var alternatives []string + res.Get("result.texts.0.alternatives").ForEach(func(key, value gjson.Result) bool { + alternatives = append(alternatives, value.Get("text").String()) + return true + }) + if res.Get("result.texts.0.text").String() == "" { + return DeepLXTranslationResult{ + Code: http.StatusServiceUnavailable, + Message: "Translation failed, API returns an empty result.", + }, nil } else { - var alternatives []string - res.Get("result.texts.0.alternatives").ForEach(func(key, value gjson.Result) bool { - alternatives = append(alternatives, value.Get("text").String()) - return true - }) - if res.Get("result.texts.0.text").String() == "" { - return DeepLXTranslationResult{ - Code: http.StatusServiceUnavailable, - Message: "Translation failed, API returns an empty result.", - }, nil - } else { - return DeepLXTranslationResult{ - Code: http.StatusOK, - ID: id, - Message: "Success", - Data: res.Get("result.texts.0.text").String(), - Alternatives: alternatives, - SourceLang: sourceLang, - TargetLang: targetLang, - Method: "Free", - }, nil - } + return DeepLXTranslationResult{ + Code: http.StatusOK, + ID: id, + Message: "Success", + Data: res.Get("result.texts.0.text").String(), + Alternatives: alternatives, + SourceLang: sourceLang, + TargetLang: targetLang, + Method: "Free", + }, nil } - return DeepLXTranslationResult{ - Code: http.StatusServiceUnavailable, - Message: "Uknown error", - }, nil } -func translateByDeepLXPro(sourceLang string, targetLang string, translateText string, tagHandling string, dlSession string, proxyURL string) (DeepLXTranslationResult, error) { +func TranslateByDeepLXPro(sourceLang string, targetLang string, translateText string, tagHandling string, dlSession string, proxyURL string) (DeepLXTranslationResult, error) { id := getRandomNumber() if sourceLang == "" { lang := whatlanggo.DetectLang(translateText) diff --git a/types.go b/translate/types.go similarity index 69% rename from types.go rename to translate/types.go index 951cfd53..105a7603 100644 --- a/types.go +++ b/translate/types.go @@ -1,24 +1,16 @@ /* - * @Author: Vincent Yang - * @Date: 2024-03-20 15:43:57 - * @LastEditors: Vincent Yang - * @LastEditTime: 2024-09-15 01:54:05 - * @FilePath: /DeepLX/types.go + * @Author: Vincent Young + * @Date: 2024-09-16 11:59:24 + * @LastEditors: Vincent Young + * @LastEditTime: 2024-09-16 12:06:36 + * @FilePath: /DeepLX/translate/types.go * @Telegram: https://t.me/missuo * @GitHub: https://github.com/missuo * * Copyright © 2024 by Vincent, All Rights Reserved. */ -package main -type Config struct { - IP string - Port int - Token string - AuthKey string - DlSession string - Proxy string -} +package translate type Lang struct { SourceLangUserSelected string `json:"source_lang_user_selected"` @@ -52,20 +44,6 @@ type PostData struct { Params Params `json:"params"` } -type PayloadFree struct { - TransText string `json:"text"` - SourceLang string `json:"source_lang"` - TargetLang string `json:"target_lang"` - TagHandling string `json:"tag_handling"` -} - -type PayloadAPI struct { - Text []string `json:"text"` - TargetLang string `json:"target_lang"` - SourceLang string `json:"source_lang"` - TagHandling string `json:"tag_handling"` -} - type Translation struct { Text string `json:"text"` } diff --git a/translate/utils.go b/translate/utils.go new file mode 100644 index 00000000..2f9a8ec9 --- /dev/null +++ b/translate/utils.go @@ -0,0 +1,40 @@ +/* + * @Author: Vincent Young + * @Date: 2024-09-16 11:59:24 + * @LastEditors: Vincent Young + * @LastEditTime: 2024-09-16 12:06:44 + * @FilePath: /DeepLX/translate/utils.go + * @Telegram: https://t.me/missuo + * @GitHub: https://github.com/missuo + * + * Copyright © 2024 by Vincent, All Rights Reserved. + */ + +package translate + +import ( + "math/rand" + "strings" + "time" +) + +func getICount(translateText string) int64 { + return int64(strings.Count(translateText, "i")) +} + +func getRandomNumber() int64 { + src := rand.NewSource(time.Now().UnixNano()) + rng := rand.New(src) + num := rng.Int63n(99999) + 8300000 + return num * 1000 +} + +func getTimeStamp(iCount int64) int64 { + ts := time.Now().UnixMilli() + if iCount != 0 { + iCount = iCount + 1 + return ts - ts%iCount + iCount + } else { + return ts + } +} diff --git a/utils.go b/utils.go deleted file mode 100644 index 652e5456..00000000 --- a/utils.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * @Author: Vincent Yang - * @Date: 2024-04-23 00:17:27 - * @LastEditors: Vincent Yang - * @LastEditTime: 2024-04-23 00:17:29 - * @FilePath: /DeepLX/utils.go - * @Telegram: https://t.me/missuo - * @GitHub: https://github.com/missuo - * - * Copyright © 2024 by Vincent, All Rights Reserved. - */ - -package main - -import ( - "encoding/json" - "io" - "math/rand" - "net/http" - "strings" - "time" -) - -func getICount(translateText string) int64 { - return int64(strings.Count(translateText, "i")) -} - -func getRandomNumber() int64 { - src := rand.NewSource(time.Now().UnixNano()) - rng := rand.New(src) - num := rng.Int63n(99999) + 8300000 - return num * 1000 -} - -func getTimeStamp(iCount int64) int64 { - ts := time.Now().UnixMilli() - if iCount != 0 { - iCount = iCount + 1 - return ts - ts%iCount + iCount - } else { - return ts - } -} - -func checkUsageAuthKey(authKey string) (bool, error) { - url := "https://api-free.deepl.com/v2/usage" - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return false, err - } - - req.Header.Add("Authorization", "DeepL-Auth-Key "+authKey) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return false, err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return false, err - } - - var response DeepLUsageResponse - err = json.Unmarshal(body, &response) - if err != nil { - return false, err - } - return response.CharacterCount < 499900, nil -}