Skip to content

Commit

Permalink
功能:新增对环境变量的支持 (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
guobao2333 authored Sep 25, 2024
2 parents 3d14a0c + 30adf53 commit 5e5f704
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 53 deletions.
12 changes: 3 additions & 9 deletions .github/workflows/docker-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@ name: Docker Image CI

on:
push:
paths:
- '**.js'
- '*.json'
branches:
- 'main'
- 'dev'
tags:
- 'v*'
pull_request:
Expand All @@ -27,6 +21,7 @@ jobs:

build:
runs-on: ubuntu-latest
if: ${{ github.event.action == 'workflow_dispatch' || github.event.before != github.event.after }}

permissions:
packages: write
Expand Down Expand Up @@ -59,13 +54,12 @@ jobs:
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=schedule
type=schedule,pattern={{date 'YYYY/MM/DD-HH:mm' tz='Asia/Shanghai'}}
type=semver,pattern={{version}}
type=ref,event=branch
type=ref,event=pr
type=sha
type=raw,value=${{ github.ref }},enable=${{ github.event.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v') }}
type=raw,value=${{ github.event_time }},enable=${{ github.event.ref_type != 'tag' }}
type=raw,value=${{ github.ref }},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=raw,value=latest,enable=${{ github.event.ref_type == 'tag' }}
# Build and push Docker image with Buildx (don't push on PR)
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ node_modules/

yarn.lock
package-lock.json

.env
8 changes: 4 additions & 4 deletions LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -629,12 +629,12 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

DeepL free translate API for Serverless
Copyright (C) 2024 shiguobaona
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
Expand Down
52 changes: 30 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
与原项目[DeepLX](https://github.com/OwO-Network/DeepLX)的区别在于**利用了无服务器函数(边缘函数)请求IP不固定的特性**,有效避免了`Error 429`请求太频繁的报错(不过嘛凡事总有例外¯\\\_(ツ)_/¯)

虽然因此不会立马被*暂时封禁*,但也请不要滥用!目前我部署在vercel上会有流量限制,如果您有大量内容需要翻译,请购买DeepL的付费版,当前项目使用的free接口会受到DeepL政策限制
由于目前项目未对pro接口进行适配,所以现在还只能使用free接口,不过在将来会完善,敬请期待~ („• ֊ •„)੭
由于目前项目未对pro接口进行适配,所以现在还只能使用free接口,不过在将来会完善,敬请期待~(„• ֊ •„)੭


**如果本项目对你有用的话,不妨点个`Star`❤️**
**Click `Star` if you like!! thanks❤️**

<!-- # Let's Go | 开始使用 -->
## Prerequisites | 你需要准备什么
在正式开始使用前,我们还需要做一些准备工作呢 (^o^)/
在正式开始使用前,我们还需要做一些准备工作喵(^o^)/
你需要:
- 一双灵活的小手🙌🏻
- 一个聪明的小脑袋瓜🧠
Expand All @@ -23,12 +23,9 @@

使用任意支持无服务器函数部署的服务器,比如可以使用 `Vercel` 或者 `Netlify` 进行部署,又或者其他能够使用nodejs的服务器。(大多数服务器提供商都提供函数计算服务器)

如果你拥有[Vercel](https://vercel.com)账号的话那就很简单了,因为你只需要点击下方按钮即可一键部署到Vercel
如果你拥有 [Vercel](https://vercel.com) 或者 [Netlify](https://netlify.com) 账号的话那就很简单了,因为你只需要点击下方按钮即可一键部署

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/guobao2333/DeepLX-Serverless)

或者你拥有[Netlify](https://netlify.com)账号的话,也可以一键部署到Netlify:

[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/guobao2333/DeepLX-Serverless)

因维护者我有多个仓库需要维护,短时间内将无法对多平台部署方案进行兼容,您可以打开一个`issues📌`或打开一个`Pull Request📎`贡献您的代码。
Expand All @@ -38,13 +35,13 @@

🐳直接运行预构建容器:
```bash
docker run -d -p 9000:9000 ghcr.io/guobao2333/deeplx-serverless
docker run -d -p 6119:6119 ghcr.io/guobao2333/deeplx-serverless
```

🚧你还可以自己构建后运行:
```bash
docker build -t deeplxs .
docker run -d -p 9000:9000 deeplxs
docker run -d -p 6119:6119 deeplxs
```


Expand All @@ -58,22 +55,19 @@ npm i
npm run start
```

📋直接复制到命令行运行
📋复制到命令行运行来一键启动服务
```bash
git clone https://github.com/guobao2333/DeepLX-Serverless && cd DeepLX-Serverless && npm i && npm run start
```

🛠️你可以运行`npm run test`用来测试翻译接口。
⚠️注意!测试命令仅返回翻译内容,获取所有结果需要使用`POST`

如果部署完成了,就可以开始使用啦!🎉

#### startup parameters | 启动参数
> [!IMPORTANT]
> 此功能在 v2.0.0 及以上版本中可用
如果你想的话,可以在启动时添加参数。
添加一个`--no`前缀来禁止备选翻译
比如添加一个`--no`前缀和`-a`参数来禁止备选翻译
```bash
npm run start -- --no-a
```
Expand All @@ -91,11 +85,26 @@ npm run start -- --no-a

📋你可以直接复制到命令行运行**本地测试:**
```bash
curl --location --request POST 'http://localhost:9000/translate' --header 'Content-Type: application/json' --data '{"text": "你好,世界!", "source_lang": "zh", "target_lang": "en"}'
curl --location --request POST 'http://localhost:6119/translate' --header 'Content-Type: application/json' --data '{"text": "你好,世界!", "source_lang": "zh", "target_lang": "en"}'
```

✨部署完成后,建议搭配浏览器插件「沉浸式翻译」一同使用。

### NON-HTTP Call And example | 测试运行与内部调用
🛠️你可以在不启动服务的情况下直接运行`npm test`用来测试翻译接口以及当前网络与DeepL的连通性。
⚠️注意!测试仅返回翻译内容,获取所有结果需要使用`POST`

由于本项目并没有只局限于http协议的访问,所以完全可以集成到你的Serverless项目中来使用DeepL,下面是一个简单的调用示例:
```javascript
import { translate } from './translate.js';
translate('你好,世界!', 'zh', 'en', 3)
.then(result => {
console.log(result)
});
```

具体可以查看`test.js`,其中对调用函数的参数有详细说明。

## Use In Browser Extension Plugin | 在沉浸式翻译中使用

1. 在浏览器上安装最新的 [沉浸式翻译](https://github.com/immersive-translate/immersive-translate/releases)
Expand All @@ -105,7 +114,7 @@ curl --location --request POST 'http://localhost:9000/translate' --header 'Conte

![沉浸式翻译](https://github.com/LegendLeo/deeplx-serverless/assets/25115173/d3affe2b-9e99-4d5c-bc8c-cd67e70d0368)

## Star History
## Star History | 收藏趋势

<a href="https://star-history.com/#guobao2333/DeepLX-Serverless&Date">
<picture>
Expand All @@ -117,19 +126,18 @@ curl --location --request POST 'http://localhost:9000/translate' --header 'Conte

## Contribute | 贡献
> [!IMPORTANT]
> **在您做出贡献之前请先阅读理解并遵守以下内容**
1. 先切换到`dev`分支,同步最新代码。
2. 如果在贡献时对贡献规范有疑惑,请打开一个`issues`
3. 不要对**相同代码**进行多次拉取请求!!
> **如果您想要做出贡献,可以按照以下顺序操作**
1. 先切换到`dev`分支,`pull`或者`fork`最新的代码。
2. 提交并***签名***你的更改。(对提交进行签名可以防止冒名顶替)
3. 打开一个PR或多或少说明更改内容,接下来请等待合并。

本人因时间(和各种各样的)原因,故无法及时对您的贡献进行测试,所以您可能还需要**自行测试**
本人因时间(和各种各样的)原因,可能无法及时对您的贡献进行测试,所以您可能还需要更多的**自行测试**

如果你是第一次贡献,并且真的想贡献点什么,那么请查看[《如何为开源做贡献》](https://opensource.guide/how-to-contribute/)不过我喜欢叫它「开源贡献指南」,那里有你需要知道的一切。
如果你是第一次贡献,并且真的想贡献点什么,那么请查看[《如何为开源做贡献》](https://opensource.guide/how-to-contribute/)我喜欢叫它「开源贡献指南」,那里有你需要知道的一切。

## License | 开源许可
本项目遵循[GNU/AGPLv3](./LICENSE)许可证的条款发布。

DeepL free translate API for Serverless
Copyright (C) 2024 shiguobaona

This program is free software: you can redistribute it and/or modify
Expand Down
15 changes: 15 additions & 0 deletions example.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# 在使用此示例前,请先将文件名'example'去掉

# 端口号
# type: Number
PORT=6119

# 是否允许请求备选翻译
# type: Boolean
ALTERNATIVE=true

# 跨域请求 (待完善)
# type: Boolean String RegExp
# 正则表达式请使用引号包裹。
# 示例: '*'(允许任何) 或者 false(不允许)
CORS_ORIGIN=false
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "deeplx-serverless",
"version": "2.0.0",
"version": "2.1.0",
"description": "DeepL free API for Serverless",
"type": "module",
"main": "server.js",
Expand All @@ -18,8 +18,9 @@
"translate",
"serverless"
],
"license": "AGPLv3",
"license": "AGPL-3.0",
"dependencies": {
"dotenv": "^16.4.5",
"axios": "^1.6.3",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
Expand Down
20 changes: 11 additions & 9 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import express from 'express';
import 'dotenv/config';
import cors from 'cors';
import bodyParser from 'body-parser';
import yargs from 'yargs/yargs';
Expand All @@ -10,20 +11,20 @@ const argv = yargs(hideBin(process.argv))
.option('port', {
alias: 'p',
describe: '端口号',
coerce: coerce_port,
default: 9000
coerce: check_port,
default: Number(process.env.PORT) || 6119
})
.option('alt', {
alias: 'a',
describe: '请求备选翻译',
type: 'boolean',
default: true
default: Boolean(process.env.ALTERNATIVE) || true
})
.option('cors', {
alias: 'c',
describe: '允许跨域访问的源(origin)',
coerce: coerce_cors,
default: false
coerce: check_cors,
default: process.env.CORS_ORIGIN || false
})
.help().alias('help', 'h')
.argv;
Expand Down Expand Up @@ -108,20 +109,21 @@ async function get(req, res) {
});
};

function coerce_cors(arg) {
function check_cors(arg) {
if (arg === undefined) return;
if (typeof arg === 'string' || typeof arg === 'boolean') {
return arg;
}
console.error("ParamTypeError: \x1b[33m'"+arg+"'\x1b[31m, origin should be Boolean or String.\n\x1b[0meg: \x1b[32m'*' or true or RegExp");
process.exit(1);
}

function coerce_port(arg) {
function check_port(arg) {
if (typeof arg === 'number' && !isNaN(arg) && Number.isInteger(arg) && arg >= 0 && arg <= 65535) {
return arg;
}
console.warn("WARNING:\x1b[0m port should be >= 0 and < 65536.\nUsed default value instead: 9000\n");
return 9000;
console.warn("WARNING:\x1b[0m port should be >= 0 and < 65536.\nUsed default value instead: 6119\n");
return 6119;
}

// 启动本地服务器
Expand Down
27 changes: 23 additions & 4 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@
import { translate } from './translate.js';

(async () => {
// Example Call
await translate('各位评委好,我是练习时长两年半的个人练习生,蔡徐坤', 'ZH', 'EN', 3, true);
console.log('\n');
})()
/**
* 一个示例调用,用于非http协议的服务内调用
* 你可以在其他js中调用,无需运行 'npm start'
* 如果无需在控制台打印,最后一个布尔值参数可以去掉
*
* @async
* @param {string} text - 待翻译的文本
* @param {string} [sourceLang='AUTO'] - 源语言国家/地区代号 默认自动识别
* @param {string} targetLang - 目标语言国家/地区代号
* @param {number} [alternativeCount] - 请求的备选翻译数量
* @param {boolean} [printResult] - 控制台打印返回结果
* @returns {Promise<Object>} translationData - 返回翻译数据JSON对象
* @typedef {Object} translationData
* @property {number} code - http状态码
* @property {string} data - 翻译结果
* @property {number} id
* @property {string} method - 请求的接口类型 目前只有Free
* @property {string} source_lang - 源语言国家/地区代号
* @property {string} target_lang - 目标语言国家/地区代号
* @property {Array<string>} alternatives - 备选翻译列表
*/
await translate('你好,世界!', 'zh', 'en', 3, true);
})();
25 changes: 22 additions & 3 deletions translate.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import axios from 'axios';
import lodash from 'lodash';

const { random } = lodash;
const DEEPL_BASE_URL = 'https://www2.deepl.com/jsonrpc';

const DEEPL_BASE_URL = 'https://www2.deepl.com/jsonrpc'/*,
DEEPL_PRO_URL = 'https://api.deepl.com',
DEEPL_FREE_URL = 'https://api-free.deepl.com'*/;
const headers = {
'Content-Type': 'application/json',
Accept: '*/*',
Expand Down Expand Up @@ -34,6 +36,23 @@ function getTimestamp(iCount) {
return ts - (ts % iCount) + iCount;
}

/**
* @async
* @param {string} text - 待翻译的文本
* @param {string} [sourceLang='AUTO'] - 源语言国家/地区代号 默认自动识别
* @param {string} targetLang - 目标语言国家/地区代号
* @param {number} [alternativeCount] - 请求的备选翻译数量
* @param {boolean} [printResult] - 控制台打印返回结果
* @returns {Promise<Object>} translationData - 返回翻译数据JSON对象
* @typedef {Object} translationData
* @property {number} code - http状态码
* @property {string} data - 翻译结果
* @property {number} id
* @property {string} method - 请求的接口类型 目前只有Free
* @property {string} source_lang - 源语言国家/地区代号
* @property {string} target_lang - 目标语言国家/地区代号
* @property {Array<string>} alternatives - 备选翻译列表
*/
async function translate(
text = 'Error: The original text cannot be empty!',
sourceLang = 'AUTO',
Expand Down Expand Up @@ -88,7 +107,7 @@ async function translate(
alternatives: response.data.result.texts[0].alternatives.map(alternative => alternative.text)
};
if (printResult) {
console.log(result);
console.log(result+'\n');
}
return result;
} catch (err) {
Expand Down

0 comments on commit 5e5f704

Please sign in to comment.