USE qwen-turbo

This commit is contained in:
paniy
2025-01-30 13:13:39 +08:00
parent eb5011d41a
commit 3f9f616889
4 changed files with 156 additions and 19 deletions
+4 -2
View File
@@ -42,13 +42,13 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y gettext python3 python3-pip i18nspector
pip3 install googletrans-py langdetect
pip3 install googletrans-py langdetect openai
- name: Cache Python dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-googletrans-py-langdetect
key: ${{ runner.os }}-pip-googletrans-py-langdetect-openai
restore-keys: |
${{ runner.os }}-pip-
@@ -83,6 +83,8 @@ jobs:
- name: Auto translate
run: python3 translate.py
env:
AI_API_KEY: ${{ secrets.AI_API_KEY }}
- name: Compile MO files
run: |
+5 -5
View File
@@ -1091,12 +1091,12 @@ modify_reality_listen_address () {
xray_privilege_escalation() {
if [[ -n "$(grep "User=nobody" ${xray_systemd_file})" ]]; then
log_echo "${OK} ${GreenBG} $(gettext "检测到 Xray 的权限控制, 启动擦屁股程序") ${Font}"
log_echo "${OK} ${GreenBG} $(gettext "检测到 Xray 的权限控制, 启动修改程序") ${Font}"
chmod -fR a+rw /var/log/xray/
chown -fR nobody:nogroup /var/log/xray/
[[ -f "${ssl_chainpath}/xray.key" ]] && chown -fR nobody:nogroup ${ssl_chainpath}/*
fi
log_echo "${OK} ${GreenBG} Xray $(gettext "擦屁股完成") ${Font}"
log_echo "${OK} ${GreenBG} Xray $(gettext "修改完成") ${Font}"
}
xray_install() {
@@ -1129,14 +1129,14 @@ xray_update() {
fi
case $xray_test_fq in
[yY][eE][sS] | [yY])
log_echo "${OK} ${GreenBG} $(gettext "即将升级") Xray ! ${Font}"
log_echo "${OK} ${GreenBG} $(gettext "升级") Xray ! ${Font}"
systemctl stop xray
## xray_version=${xray_online_version}
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install -f --version v${xray_version}
judge "Xray $(gettext "升级")"
;;
*)
log_echo "${OK} ${GreenBG} $(gettext "即将升级/重装") Xray ! ${Font}"
log_echo "${OK} ${GreenBG} $(gettext "升级/重装") Xray ! ${Font}"
systemctl stop xray
xray_version=$(info_extraction xray_version)
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install -f --version v${xray_version}
@@ -1516,7 +1516,7 @@ port_exist_check() {
else
log_echo "${Error} ${RedBG} $(gettext "检测到 $1 端口被占用, 以下为 $1 端口占用信息") ${Font}"
lsof -i:"$1"
timeout "$(gettext "尝试自动 kill 占用进程")!"
timeout "$(gettext "尝试终止占用进程")!"
lsof -i:"$1" | awk '{print $2}' | grep -v "PID" | xargs kill -9
log_echo "${OK} ${GreenBG} kill $(gettext "完成") ${Font}"
fi
+104
View File
@@ -0,0 +1,104 @@
# Xray Reality / VLESS WebSocket/gRPC+TLS 프로토콜 + Nginx 일괄 설치 스크립트
[简体中文](/README.md) | [English](/languages/en/README.md) | [Русский](/languages/ru/README.md) | [فارسی](/languages/fa/README.md) | 한국어
[![GitHub stars](https://img.shields.io/github/stars/hello-yunshu/Xray_bash_onekey?color=%230885ce)](https://github.com/hello-yunshu/Xray_bash_onekey/stargazers) [![GitHub forks](https://img.shields.io/github/forks/hello-yunshu/Xray_bash_onekey?color=%230885ce)](https://github.com/hello-yunshu/Xray_bash_onekey/network) [![GitHub issues](https://img.shields.io/github/issues/hello-yunshu/Xray_bash_onekey)](https://github.com/hello-yunshu/Xray_bash_onekey/issues)
> JetBrains 허가에 감사드립니다.
## 사용 방법
* `idleleo` 명령을 직접 입력하여 스크립트를 관리할 수 있습니다.
* Reality는 Nginx 프론트엔드를 권장하며, 스크립트에서 설치할 수 있습니다.
* fail2ban 활성화를 권장하며, 스크립트에서 설치할 수 있습니다.
* [@DuckSoft](https://github.com/DuckSoft)의 공유 링크 제안[제안](https://github.com/XTLS/Xray-core/issues/91) (beta)을 사용합니다. Qv2ray, V2rayN, V2rayNG 지원.
* [XTLS](https://github.com/XTLS/Xray-core/issues/158) 프로젝트의 제안을 따르며, [UUIDv5](https://tools.ietf.org/html/rfc4122#section-4.3) 표준을 준수하여 사용자 정의 문자열을 VLESS UUID로 매핑할 수 있습니다.
* Reality 설치 안내: [Xray Reality 프로토콜 서버 설정](https://hey.run/archives/da-jian-xray-reality-xie-yi-fu-wu-qi).
* Reality 프로토콜 위험: [Xray Reality 프로토콜 위험](https://hey.run/archives/reality-xie-yi-de-feng-xian).
* Reality 프로토콜을 이용한 서버 가속: [Reality 프로토콜 "취약점"을 이용한 서버 가속](https://hey.run/archives/li-yong-reality-xie-yi-lou-dong-jia-su-fu-wu-qi).
* 부하 분산 구성 추가, 튜토리얼: [XRay 고급 기능 – 백엔드 서버 로드 밸런싱 설정](https://hey.run/archives/xrayjin-jie-wan-fa---da-jian-hou-duan-fu-wu-qi-fu-zai-jun-heng).
* gRPC 프로토콜 지원 추가, 자세히 보기: [Xray 고급 기능 – gRPC 프로토콜 사용](https://hey.run/archives/xrayjin-jie-wan-fa---shi-yong-grpcxie-yi).
## Telegram 그룹
* Telegram 대화방: <https://t.me/idleleo_chat>
## 준비 작업
* 중국 외부에서 실행되는 서버, 공인 IP가 필요합니다.
* Reality 프로토콜 설치 시, Xray 요구 사항을 충족하는 도메인이 필요합니다.
* TLS 버전 설치 시, 도메인이 필요하며 A레코드를 추가해야 합니다.
* [Xray 공식 설명서](https://xtls.github.io)를 읽고 Reality TLS WebSocket gRPC 및 Xray 관련 정보를 이해하고, Reality target 도메인 요구 사항을 확인하세요.
* **curl이 설치되어 있어야 합니다**. CentOS 사용자는 `yum install -y curl`을, Debian/Ubuntu 사용자는 `apt install -y curl`을 실행하세요.
## 설치 방법
복사하여 실행:
``` bash
bash <(curl -Ss https://www.idleleo.com/install.sh)
```
## 주의사항
* 스크립트 중 항목별 세부 의미를 모르시다면 필수 입력값 외에는 스크립트 제공 기본값을 사용하세요 (계속 엔터).
* Cloudflare 사용자는 설치 후 CDN 기능을 활성화하세요.
* 이 스크립트를 사용하려면 Linux 기초 지식과 경험, 컴퓨터 네트워크 부분 지식, 컴퓨터 기본 조작 능력이 필요합니다.
* 현재 Debian 9+ / Ubuntu 18.04+ / Centos7+ 를 지원하며 일부 Centos 템플릿에서는 처리하기 어려운 컴파일 문제가 발생할 수 있으므로 문제 발생 시 다른 시스템 템플릿으로 변경하세요.
* 저자는 한정적인 지원만 제공하며 너무 멍청해서요.
* 공유 링크는 실험 버전이며 미래 변경 가능성이 있으니 클라이언트 호환 여부를 스스로 확인하세요.
* 사용자 정의 문자열을 UUIDv5로 매핑하려면 클라이언트가 이를 지원해야 합니다.
## 감사의 말
* 본 스크립트는 <https://github.com/wulabing/V2Ray_ws-tls_bash_onekey> 에서 유래하였으며 여기에 wulabing님에게 감사드립니다.
* 본 스크립트의 TCP 가속 스크립트 프로젝트는 <https://github.com/ylx2016/Linux-NetSpeed> 를 참고하였으며 여기에 ylx2016님에게 감사드립니다.
## 인증서
이미 사용 중인 도메인의 인증서 파일이 있다면 crt와 key 파일을 xray.crt와 xray.key로 이름을 바꾸어 /etc/idleleo/cert 디렉토리 아래에 두세요 (디렉토리가 없으면 먼저 생성하세요). 인증서 파일 권한 및 유효기간을 주의하시고 사용자 정의 인증서 만료 후 재발급해야 합니다.
스크립트는 Let's encrypted 인증서를 자동 생성할 수 있으며 유효기간은 3개월입니다. 이론적으로 자동 생성된 인증서는 자동 갱신됩니다.
## 클라이언트 구성을 확인
`cat /etc/idleleo/xray_info.txt`
## Xray 소개
* Xray는 우수한 오픈 소스 네트워크 프록시 도구로서 인터넷을 원활하게 즐길 수 있도록 돕습니다. 이미 Windows, Mac, Android, IOS, Linux 등 모든 플랫폼에서 사용할 수 있습니다.
* 본 스크립트는 일체형 완전 설정 스크립트로서 모든 절차가 정상적으로 진행되면 출력 결과에 따라 클라이언트를 설정하면 사용할 수 있습니다.
* 주의: 우리는 여전히 전체 프로그램의 작동 과정 및 원리를 전반적으로 이해하도록 강력히 권장합니다.
## 단일 서버에 단일 프록시만 설정하는 것을 권장합니다
* 본 스크립트는 최신 버전의 Xray core를 기본으로 설치합니다.
* 연결 포트로 기본 443 포트 사용을 권장합니다.
* 가짜 내용은 사용자가 교체할 수 있습니다.
## 기타 주의사항
* 순수 환경에서 본 스크립트를 사용하는 것이 좋으며 초보자라면 CentOS 시스템을 사용하지 마세요.
* 본 스크립트가 실제로 작동하는지 확인하기 전까지 생산 환경에 적용하지 마세요.
* 해당 프로그램은 Nginx를 통해 다양한 기능을 구현하는데 의존하므로 [LNMP](https://lnmp.org) 또는 기타 유사한 Nginx 포함 설치 스크립트를 사용한 사용자는 예측 불가능한 오류가 발생할 수 있다는 점에 특히 주의해야 합니다.
* CentOS 사용자는 방화벽에서 프로그램 관련 포트(기본값: 80, 443)를 미리 열어야 합니다.
## 시작 방법
Xray 시작: `systemctl start xray`
Xray 종료: `systemctl stop xray`
Nginx 시작: `systemctl start nginx`
Nginx 종료: `systemctl stop nginx`
## 관련 디렉토리
Xray 서버 설정: `/etc/idleleo/conf/xray/config.json`
Nginx 디렉토리: `/usr/local/nginx`
인증서 파일: `/etc/idleleo/cert/xray.key` 그리고 `/etc/idleleo/cert/xray.crt` 인증서 권한 설정에 주의하세요
구성 정보 파일 등: `/etc/idleleo`
+43 -12
View File
@@ -2,6 +2,7 @@ import re
import time
import json
import os
from openai import OpenAI
from googletrans import Translator
def load_translation_cache(cache_file):
@@ -36,6 +37,33 @@ def update_version(version_file):
f.write(timestamp)
return timestamp
def contains_chinese(text):
return any('\u4e00' <= char <= '\u9fff' for char in text)
def translate_text_qwen(text, target_lang):
client = OpenAI(
api_key=os.getenv("AI_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-turbo",
messages=[
{'role': 'system', 'content': 'You are a professional text translation assistant, focused on translating short Chinese texts into voice content in the specified target language. Your task is to translate only the Chinese parts of the text into the corresponding target language, leaving English portions as they are. The translation process should not consider context between sentences; ensure each individual sentence is translated accurately. Avoid adding any punctuation at the end of the translated sentences. The goal is to assist in the internationalization of scripts while ensuring translations are concise and accurate.'},
{'role': 'user', 'content': f'Translate the following text to {target_lang}: {text}'}
],
stream=True
)
full_content = ""
for chunk in completion:
full_content += chunk.choices[0].delta.content
return full_content.capitalize().lower().rstrip('.,!?;:')
def translate_text_google(text, target_lang):
translator = Translator(service_urls=['translate.google.com'])
translation = translator.translate(text, src='auto', dest=target_lang)
translated_text = translation.text
return translated_text.capitalize().lower().rstrip('.,!?;:')
def translate_po_file(input_file, output_file, target_lang):
# 获取目标语言目录
lang_dir = os.path.dirname(output_file)
@@ -54,9 +82,6 @@ def translate_po_file(input_file, output_file, target_lang):
translations = load_translation_cache(cache_file)
current_version = get_version(version_file)
# 使用最新的 Translator,并设置更可靠的服务 URL
translator = Translator(service_urls=['translate.google.com'])
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
@@ -94,13 +119,19 @@ def translate_po_file(input_file, output_file, target_lang):
max_retries = 3
for attempt in range(max_retries):
try:
time.sleep(1) # 增加延迟以避免请求过快
# 确保源语言和目标语言设置正确
translation = translator.translate(msgid_text, src='auto', dest=target_lang)
translated_text = translation.text
time.sleep(0.1) # 增加延迟以避免请求过快
translated_text = translate_text_qwen(msgid_text, target_lang)
# 强制将翻译结果的首字母转为小写并去除末尾标点
translated_text = translated_text.capitalize().lower().rstrip('.,!?;:')
# 检查翻译结果是否仍包含中文
chinese_retry_count = 0
while contains_chinese(translated_text) and chinese_retry_count < 3:
print(f"Detected Chinese in translation for: {msgid_text}. Re-translating... (Attempt {chinese_retry_count + 1}/3)")
translated_text = translate_text_qwen(msgid_text, target_lang)
chinese_retry_count += 1
if contains_chinese(translated_text):
print(f"Failed to translate {msgid_text} after 3 attempts using Qwen. Using Google Translate...")
translated_text = translate_text_google(msgid_text, target_lang)
# 检查翻译是否有变更
if msgid_text in translations and translations[msgid_text] != translated_text:
@@ -115,7 +146,7 @@ def translate_po_file(input_file, output_file, target_lang):
if attempt == max_retries - 1:
raise e
print(f"Retry {attempt + 1}/{max_retries} for: {msgid_text}")
time.sleep(3) # 重试前等待更长时间
time.sleep(0.3) # 重试前等待更长时间
except Exception as e:
print(f"Translation failed for: {msgid_text}")
print(f"Error: {e}")
@@ -154,8 +185,8 @@ def translate_po_file(input_file, output_file, target_lang):
f.write(content)
if __name__ == '__main__':
for lang, code in [('en', 'en'), ('fa', 'fa'), ('ru', 'ru'), ('ko', 'ko')]:
print(f"\nTranslating to {lang}...")
for lang, code in [('en', 'English'), ('fa', 'Persian'), ('ru', 'Russian'), ('ko', 'Korean')]:
print(f"\nTranslating to {lang} ({code})...")
input_file = f'po/{lang}.po'
output_file = f'po/{lang}.po'
translate_po_file(input_file, output_file, code)