Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support http proxy #119

Merged
merged 1 commit into from
Jun 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @Author: Vincent Yang
* @Date: 2024-04-23 00:39:03
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-04-23 00:43:43
* @LastEditTime: 2024-06-18 02:40:52
* @FilePath: /DeepLX/config.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand Down Expand Up @@ -50,6 +50,14 @@ func initConfig() *Config {
}
}

// HTTP Proxy flag
flag.StringVar(&cfg.Proxy, "proxy", "", "set the proxy URL for HTTP requests")
if cfg.Proxy == "" {
if proxy, ok := os.LookupEnv("PROXY"); ok {
cfg.Proxy = proxy
}
}

flag.Parse()
return cfg
}
29 changes: 24 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*
* @Author: Vincent Yang
* @Date: 2023-07-01 21:45:34
* @LastEditors: Vincent Young
* @LastEditTime: 2024-04-23 14:49:35
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-06-18 02:41:55
* @FilePath: /DeepLX/main.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand All @@ -15,6 +15,7 @@ import (
"fmt"
"log"
"net/http"
"net/url"
"os"
"strings"

Expand Down Expand Up @@ -62,6 +63,21 @@ func main() {
fmt.Printf("DeepL X has been successfully launched! Listening on 0.0.0.0:%v\n", cfg.Port)
fmt.Println("Developed by sjlleo <[email protected]> and missuo <[email protected]>.")

// Set Proxy
proxyURL := os.Getenv("PROXY")
if proxyURL == "" {
proxyURL = cfg.Proxy
}
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
log.Fatalf("Failed to parse proxy URL: %v", err)
}
http.DefaultTransport = &http.Transport{
Proxy: http.ProxyURL(proxy),
}
}

if cfg.Token != "" {
fmt.Println("Access token is set.")
}
Expand Down Expand Up @@ -91,8 +107,9 @@ func main() {
targetLang := req.TargetLang
translateText := req.TransText
authKey := cfg.AuthKey
proxyURL := cfg.Proxy

result, err := translateByDeepLX(sourceLang, targetLang, translateText, authKey)
result, err := translateByDeepLX(sourceLang, targetLang, translateText, authKey, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down Expand Up @@ -124,6 +141,7 @@ func main() {
sourceLang := req.SourceLang
targetLang := req.TargetLang
translateText := req.TransText
proxyURL := cfg.Proxy

dlSession := cfg.DlSession

Expand All @@ -146,7 +164,7 @@ func main() {
return
}

result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, dlSession)
result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, dlSession, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down Expand Up @@ -174,6 +192,7 @@ func main() {
r.POST("/v2/translate", authMiddleware(cfg), func(c *gin.Context) {
authorizationHeader := c.GetHeader("Authorization")
var authKey string
proxyURL := cfg.Proxy

if strings.HasPrefix(authorizationHeader, "DeepL-Auth-Key") {
parts := strings.Split(authorizationHeader, " ")
Expand Down Expand Up @@ -206,7 +225,7 @@ func main() {
targetLang = jsonData.TargetLang
}

result, err := translateByDeepLX("", targetLang, translateText, authKey)
result, err := translateByDeepLX("", targetLang, translateText, authKey, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down
71 changes: 58 additions & 13 deletions translate.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"log"
"net/http"
"net/url"
"strings"

"github.com/abadojack/whatlanggo"
Expand Down Expand Up @@ -46,8 +47,8 @@ func initDeepLXData(sourceLang string, targetLang string) *PostData {
}
}

func translateByOfficialAPI(text string, sourceLang string, targetLang string, authKey string) (string, error) {
url := "https://api-free.deepl.com/v2/translate"
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{
Expand All @@ -61,15 +62,28 @@ func translateByOfficialAPI(text string, sourceLang string, targetLang string, a
return "", err
}

req, err := http.NewRequest("POST", url, bytes.NewBuffer(payloadBytes))
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")

client := &http.Client{}
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
Expand Down Expand Up @@ -97,7 +111,7 @@ func translateByOfficialAPI(text string, sourceLang string, targetLang string, a
return sb.String(), nil
}

func translateByDeepLX(sourceLang string, targetLang string, translateText string, authKey string) (DeepLXTranslationResult, error) {
func translateByDeepLX(sourceLang string, targetLang string, translateText string, authKey string, proxyURL string) (DeepLXTranslationResult, error) {
id := getRandomNumber()
if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText)
Expand All @@ -117,7 +131,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
}

// Preparing the request data for the DeepL API
url := "https://www2.deepl.com/jsonrpc"
www2URL := "https://www2.deepl.com/jsonrpc"
id = id + 1
postData := initDeepLXData(sourceLang, targetLang)
text := Text{
Expand All @@ -142,7 +156,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
// Creating a new HTTP POST request with the JSON data as the body
post_byte = []byte(postStr)
reader := bytes.NewReader(post_byte)
request, err := http.NewRequest("POST", url, reader)
request, err := http.NewRequest("POST", www2URL, reader)

if err != nil {
log.Println(err)
Expand All @@ -166,7 +180,23 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
request.Header.Set("Connection", "keep-alive")

// Making the HTTP request to the DeepL API
client := &http.Client{}
var client *http.Client
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusServiceUnavailable,
Message: "Uknown error",
}, nil
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxy),
}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}

resp, err := client.Do(request)
if err != nil {
log.Println(err)
Expand Down Expand Up @@ -208,7 +238,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
continue
} else {
if validity {
translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey)
translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey, proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusTooManyRequests,
Expand Down Expand Up @@ -258,7 +288,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
}, nil
}

func translateByDeepLXPro(sourceLang string, targetLang string, translateText string, dlSession string) (DeepLXTranslationResult, error) {
func translateByDeepLXPro(sourceLang string, targetLang string, translateText string, dlSession string, proxyURL string) (DeepLXTranslationResult, error) {
id := getRandomNumber()
if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText)
Expand All @@ -278,7 +308,7 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
}

// Preparing the request data for the DeepL API
url := "https://api.deepl.com/jsonrpc"
proURL := "https://api.deepl.com/jsonrpc"
id = id + 1
postData := initDeepLXData(sourceLang, targetLang)
text := Text{
Expand All @@ -303,7 +333,7 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
// Creating a new HTTP POST request with the JSON data as the body
post_byte = []byte(postStr)
reader := bytes.NewReader(post_byte)
request, err := http.NewRequest("POST", url, reader)
request, err := http.NewRequest("POST", proURL, reader)

if err != nil {
log.Println(err)
Expand All @@ -324,7 +354,22 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
request.Header.Set("Cookie", "dl_session="+dlSession)

// Making the HTTP request to the DeepL API
client := &http.Client{}
var client *http.Client
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusServiceUnavailable,
Message: "DeepL API request failed",
}, nil
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxy),
}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}
resp, err := client.Do(request)
if err != nil {
log.Println(err)
Expand Down
3 changes: 2 additions & 1 deletion types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @Author: Vincent Yang
* @Date: 2024-03-20 15:43:57
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-04-23 00:37:39
* @LastEditTime: 2024-06-18 02:38:48
* @FilePath: /DeepLX/types.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand All @@ -16,6 +16,7 @@ type Config struct {
Token string
AuthKey string
DlSession string
Proxy string
}

type Lang struct {
Expand Down
Loading