mirror of
https://github.com/OwO-Network/DeepLX.git
synced 2025-04-19 14:13:24 +00:00
Compare commits
2 Commits
15cca97b81
...
90d4d44fc0
Author | SHA1 | Date | |
---|---|---|---|
|
90d4d44fc0 | ||
|
e15e63b797 |
21
README.md
21
README.md
@ -2,7 +2,7 @@
|
|||||||
* @Author: Vincent Young
|
* @Author: Vincent Young
|
||||||
* @Date: 2022-10-18 07:32:29
|
* @Date: 2022-10-18 07:32:29
|
||||||
* @LastEditors: Vincent Young
|
* @LastEditors: Vincent Young
|
||||||
* @LastEditTime: 2023-11-28 00:24:20
|
* @LastEditTime: 2024-04-16 15:10:38
|
||||||
* @FilePath: /DeepLX/README.md
|
* @FilePath: /DeepLX/README.md
|
||||||
* @Telegram: https://t.me/missuo
|
* @Telegram: https://t.me/missuo
|
||||||
*
|
*
|
||||||
@ -69,9 +69,24 @@
|
|||||||
- `-port` or `-p` : Listening port. Default is `1188`.
|
- `-port` or `-p` : Listening port. Default is `1188`.
|
||||||
- `-token` : Access token. If you have set it up, each request needs to include `Authorization` in the **Headers** or `token` parameter in the **URL Params**.
|
- `-token` : Access token. If you have set it up, each request needs to include `Authorization` in the **Headers** or `token` parameter in the **URL Params**.
|
||||||
- `-authkey` : DeepL Official `AuthKey`. If you have set it up, after the 429 response, the official AuthKey will be used for the request. If multiple authKeys are used simultaneously, they need to be separated by commas.
|
- `-authkey` : DeepL Official `AuthKey`. If you have set it up, after the 429 response, the official AuthKey will be used for the request. If multiple authKeys are used simultaneously, they need to be separated by commas.
|
||||||
|
- `/v2/translate` : This endpoint is fully compatible with the DeepL official API. When using this endpoint, please strictly adhere to the request styles outlined in the official DeepL documentation. Note that in this endpoint, please use `DeepL-Auth-Key $token` in the `Authorization`, which is actually the Access Token, not the official `Auth Key` of DeepL.
|
||||||
|
|
||||||
|
#### Example of requesting a token-protected `/v2/translate` endpoint
|
||||||
|
```bash
|
||||||
|
curl -X POST 'http://localhost:1188/v2/translate' \
|
||||||
|
--header 'Authorization: DeepL-Auth-Key [yourAccessToken] [yourAuthKey]' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data '{
|
||||||
|
"text": [
|
||||||
|
"Hello, world!"
|
||||||
|
],
|
||||||
|
"target_lang": "DE"
|
||||||
|
}'
|
||||||
|
# Please note that either `yourAccessToken` or `yourAuthKey` can be omitted.
|
||||||
|
```
|
||||||
|
|
||||||
#### Requesting a token-protected **DeepLX API** instance using the `curl`
|
#### Requesting a token-protected **DeepLX API** instance using the `curl`
|
||||||
```
|
```bash
|
||||||
curl -X POST http://localhost:1188/translate \
|
curl -X POST http://localhost:1188/translate \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer your_access_token" \
|
-H "Authorization: Bearer your_access_token" \
|
||||||
@ -82,7 +97,7 @@ curl -X POST http://localhost:1188/translate \
|
|||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
or
|
or
|
||||||
```
|
```bash
|
||||||
curl -X POST http://localhost:1188/translate?token=your_access_token \
|
curl -X POST http://localhost:1188/translate?token=your_access_token \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{
|
-d '{
|
||||||
|
63
main.go
63
main.go
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* @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-04-13 18:50:25
|
* @LastEditTime: 2024-04-16 15:07:54
|
||||||
* @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
|
||||||
@ -343,7 +343,22 @@ func authMiddleware(cfg *Config) gin.HandlerFunc {
|
|||||||
if cfg.Token != "" {
|
if cfg.Token != "" {
|
||||||
providedTokenInQuery := c.Query("token")
|
providedTokenInQuery := c.Query("token")
|
||||||
providedTokenInHeader := c.GetHeader("Authorization")
|
providedTokenInHeader := c.GetHeader("Authorization")
|
||||||
if providedTokenInHeader != "Bearer "+cfg.Token && providedTokenInQuery != cfg.Token {
|
|
||||||
|
// Compatability with the Bearer token format
|
||||||
|
if providedTokenInHeader != "" {
|
||||||
|
parts := strings.Split(providedTokenInHeader, " ")
|
||||||
|
if len(parts) == 2 {
|
||||||
|
if parts[0] == "Bearer" || parts[0] == "DeepL-Auth-Key" {
|
||||||
|
providedTokenInHeader = parts[1]
|
||||||
|
} else {
|
||||||
|
providedTokenInHeader = ""
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
providedTokenInHeader = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if providedTokenInHeader != cfg.Token && providedTokenInQuery != cfg.Token {
|
||||||
c.JSON(http.StatusUnauthorized, gin.H{
|
c.JSON(http.StatusUnauthorized, gin.H{
|
||||||
"code": http.StatusUnauthorized,
|
"code": http.StatusUnauthorized,
|
||||||
"message": "Invalid access token",
|
"message": "Invalid access token",
|
||||||
@ -352,6 +367,7 @@ func authMiddleware(cfg *Config) gin.HandlerFunc {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Next()
|
c.Next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,21 +434,48 @@ func main() {
|
|||||||
|
|
||||||
r.POST("/v2/translate", authMiddleware(cfg), func(c *gin.Context) {
|
r.POST("/v2/translate", authMiddleware(cfg), func(c *gin.Context) {
|
||||||
authorizationHeader := c.GetHeader("Authorization")
|
authorizationHeader := c.GetHeader("Authorization")
|
||||||
parts := strings.Split(authorizationHeader, " ")
|
|
||||||
var authKey string
|
var authKey string
|
||||||
if len(parts) == 2 {
|
|
||||||
authKey = parts[1]
|
if strings.HasPrefix(authorizationHeader, "DeepL-Auth-Key") {
|
||||||
|
parts := strings.Split(authorizationHeader, " ")
|
||||||
|
if len(parts) >= 2 && strings.HasSuffix(parts[len(parts)-1], ":fx") {
|
||||||
|
authKey = parts[len(parts)-1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
translateText := c.PostForm("text")
|
|
||||||
targetLang := c.PostForm("target_lang")
|
var translateText string
|
||||||
|
var targetLang string
|
||||||
|
|
||||||
|
translateText = c.PostForm("text")
|
||||||
|
targetLang = c.PostForm("target_lang")
|
||||||
|
|
||||||
|
if translateText == "" || targetLang == "" {
|
||||||
|
var jsonData struct {
|
||||||
|
Text []string `json:"text"`
|
||||||
|
TargetLang string `json:"target_lang"`
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := c.BindJSON(&jsonData); err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{
|
||||||
|
"code": http.StatusBadRequest,
|
||||||
|
"message": "Invalid request payload",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
translateText = strings.Join(jsonData.Text, "\n")
|
||||||
|
targetLang = jsonData.TargetLang
|
||||||
|
}
|
||||||
|
|
||||||
result, err := translateByDeepLX("", targetLang, translateText, authKey)
|
result, err := translateByDeepLX("", targetLang, translateText, authKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Translation failed: %s", err)
|
log.Fatalf("Translation failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if result.Code == http.StatusOK {
|
if result.Code == http.StatusOK {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"translations": []interface{}{
|
"translations": []map[string]interface{}{
|
||||||
map[string]interface{}{
|
{
|
||||||
"detected_source_language": result.SourceLang,
|
"detected_source_language": result.SourceLang,
|
||||||
"text": result.Data,
|
"text": result.Data,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user