This commit is contained in:
Vincent Young 2024-09-16 12:08:13 -04:00
parent e9b5dedc43
commit a9a5a914b6
No known key found for this signature in database
GPG Key ID: DD9998BCFD278F6A
6 changed files with 123 additions and 232 deletions

View File

@ -1,8 +1,8 @@
/* /*
* @Author: Vincent Yang * @Author: Vincent Yang
* @Date: 2024-04-23 00:39:03 * @Date: 2024-04-23 00:39:03
* @LastEditors: Vincent Yang * @LastEditors: Vincent Young
* @LastEditTime: 2024-06-18 02:40:52 * @LastEditTime: 2024-09-16 12:02:15
* @FilePath: /DeepLX/config.go * @FilePath: /DeepLX/config.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
@ -14,13 +14,22 @@ package main
import ( import (
"flag" "flag"
"os"
"fmt" "fmt"
"os"
) )
type Config struct {
IP string
Port int
Token string
AuthKey string
DlSession string
Proxy string
}
func initConfig() *Config { func initConfig() *Config {
cfg := &Config{ cfg := &Config{
IP: "0.0.0.0", IP: "0.0.0.0",
Port: 1188, Port: 1188,
} }

26
main.go
View File

@ -1,14 +1,15 @@
/* /*
* @Author: Vincent Yang * @Author: Vincent Yang
* @Date: 2023-07-01 21:45:34 * @Date: 2023-07-01 21:45:34
* @LastEditors: Vincent Yang * @LastEditors: Vincent Young
* @LastEditTime: 2024-09-15 02:00:23 * @LastEditTime: 2024-09-16 12:07:15
* @FilePath: /DeepLX/main.go * @FilePath: /DeepLX/main.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
* Copyright © 2024 by Vincent, All Rights Reserved. * Copyright © 2024 by Vincent, All Rights Reserved.
*/ */
package main package main
import ( import (
@ -19,6 +20,7 @@ import (
"os" "os"
"strings" "strings"
translate "github.com/OwO-Network/DeepLX/translate"
"github.com/gin-contrib/cors" "github.com/gin-contrib/cors"
"github.com/gin-gonic/gin" "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() { func main() {
cfg := initConfig() cfg := initConfig()
@ -119,7 +135,7 @@ func main() {
return return
} }
result, err := translateByDeepLX(sourceLang, targetLang, translateText, tagHandling, authKey, proxyURL) result, err := translate.TranslateByDeepLX(sourceLang, targetLang, translateText, tagHandling, authKey, proxyURL)
if err != nil { if err != nil {
log.Fatalf("Translation failed: %s", err) log.Fatalf("Translation failed: %s", err)
} }
@ -183,7 +199,7 @@ func main() {
return return
} }
result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, tagHandling, dlSession, proxyURL) result, err := translate.TranslateByDeepLXPro(sourceLang, targetLang, translateText, tagHandling, dlSession, proxyURL)
if err != nil { if err != nil {
log.Fatalf("Translation failed: %s", err) log.Fatalf("Translation failed: %s", err)
} }
@ -244,7 +260,7 @@ func main() {
targetLang = jsonData.TargetLang targetLang = jsonData.TargetLang
} }
result, err := translateByDeepLX("", targetLang, translateText, "", authKey, proxyURL) result, err := translate.TranslateByDeepLX("", targetLang, translateText, "", authKey, proxyURL)
if err != nil { if err != nil {
log.Fatalf("Translation failed: %s", err) log.Fatalf("Translation failed: %s", err)
} }

View File

@ -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 ( import (
"bytes" "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) { func TranslateByDeepLX(sourceLang string, targetLang string, translateText string, tagHandling string, authKey string, proxyURL string) (DeepLXTranslationResult, 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) {
id := getRandomNumber() id := getRandomNumber()
if sourceLang == "" { if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText) lang := whatlanggo.DetectLang(translateText)
@ -233,66 +181,38 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
Message: "Invalid target language", Message: "Invalid target language",
}, nil }, nil
} }
if resp.StatusCode == http.StatusTooManyRequests {
if resp.StatusCode == http.StatusTooManyRequests && authKey != "" { return DeepLXTranslationResult{
authKeyArray := strings.Split(authKey, ",") Code: http.StatusTooManyRequests,
for _, authKey := range authKeyArray { Message: "Too Many Requests",
validity, err := checkUsageAuthKey(authKey) }, nil
if err != nil { }
continue
} else { var alternatives []string
if validity { res.Get("result.texts.0.alternatives").ForEach(func(key, value gjson.Result) bool {
translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey, proxyURL) alternatives = append(alternatives, value.Get("text").String())
if err != nil { return true
return DeepLXTranslationResult{ })
Code: http.StatusTooManyRequests, if res.Get("result.texts.0.text").String() == "" {
Message: "Too Many Requests", return DeepLXTranslationResult{
}, nil Code: http.StatusServiceUnavailable,
} Message: "Translation failed, API returns an empty result.",
return DeepLXTranslationResult{ }, nil
Code: http.StatusOK, } else {
Message: "Success", return DeepLXTranslationResult{
ID: 1000000, Code: http.StatusOK,
Data: translatedText, ID: id,
SourceLang: sourceLang, Message: "Success",
TargetLang: targetLang, Data: res.Get("result.texts.0.text").String(),
Method: "Official API", Alternatives: alternatives,
}, nil SourceLang: sourceLang,
} TargetLang: targetLang,
} Method: "Free",
}, 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.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() id := getRandomNumber()
if sourceLang == "" { if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText) lang := whatlanggo.DetectLang(translateText)

View File

@ -1,24 +1,16 @@
/* /*
* @Author: Vincent Yang * @Author: Vincent Young
* @Date: 2024-03-20 15:43:57 * @Date: 2024-09-16 11:59:24
* @LastEditors: Vincent Yang * @LastEditors: Vincent Young
* @LastEditTime: 2024-09-15 01:54:05 * @LastEditTime: 2024-09-16 12:06:36
* @FilePath: /DeepLX/types.go * @FilePath: /DeepLX/translate/types.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
* Copyright © 2024 by Vincent, All Rights Reserved. * Copyright © 2024 by Vincent, All Rights Reserved.
*/ */
package main
type Config struct { package translate
IP string
Port int
Token string
AuthKey string
DlSession string
Proxy string
}
type Lang struct { type Lang struct {
SourceLangUserSelected string `json:"source_lang_user_selected"` SourceLangUserSelected string `json:"source_lang_user_selected"`
@ -52,20 +44,6 @@ type PostData struct {
Params Params `json:"params"` 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 { type Translation struct {
Text string `json:"text"` Text string `json:"text"`
} }

40
translate/utils.go Normal file
View File

@ -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
}
}

View File

@ -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
}