【桌面软件开发案例】用Python的PySide6开发聚合翻译软件 ...

打印 上一主题 下一主题

主题 2093|帖子 2093|积分 6279

软件特点和优势
1、无需逆向解密、完全模仿人来操纵浏览器
2、支持4个翻译网站同时举行翻译(中翻英、英译中)
3、解压即用,无需浏览器驱动
4、图形化界面,更易操纵

一、聚合翻译软件效果展示

因为平时我们经常会用到翻译,各网站的翻译效果可能不太一样,有的时候想筛选一个更符合语境的翻译效果,于是我用python的pyside6库开发了一个聚合翻译软件,实现了一键同时获取4个翻译工具网站的效果,包罗:
有道翻译、百度翻译、腾讯翻译、360翻译
老规矩!咱们以目的为驱动,先来看下软件的现实效果:


那代码是如何实现PySide6开发聚合翻译工具的了?下面我们来进一步分析网站及代码的实现方式。
二、翻译网站分析

咱们打开浏览器看一下翻译网站的API调用,发现都是加密的,既然是加密的,逆向的话其实会涉及一些风险问题的,那我直接模仿浏览器举行人工操纵,既不需要逆向,也很方便的能获取到翻译的效果。

既然知道了原理是使用模仿人去操纵浏览器,那咱们接下来开始撸代码
三、python核心代码解说

起首我们使用Qt设计师(Qt Designer)绘制一个图形界面,这个软件相称好用,实现了UI和我们业务代码的解耦,且很方便的可以或许转换成python代码导入到程序里。

接着我们运行如下下令将window.ui文件转换成window.py文件
  1. pyside6-uic window.ui -o window.py
复制代码
然后编写我们的main.py主窗口程序,导入需要用到的包
  1. from PySide6.QtCore import Slot, QSharedMemory
  2. from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox
  3. from PySide6.QtGui import QIcon, QPixmap
  4. from window import Ui_MainWindow
  5. from concurrent.futures import ThreadPoolExecutor
  6. from threads import TranslateThread
  7. from threading import Thread
  8. import base64
  9. from config import *
  10. from utils import get_edge_path
复制代码
初始化浏览器参数,并默认开启4个翻译网站的窗口,方便我们后续举行翻译操纵。
  1. class MainWindow(QMainWindow, Ui_MainWindow):
  2.     def __init__(self):
  3.         super().__init__()
  4.         self.setupUi(self)  # 初始化 UI
  5.         self.setWindowTitle(f"聚合翻译 {version}(公众号:程序员王哪跑)")
  6.         # 设置图标
  7.         icon_data = base64.b64decode(image_data["fav.png"])
  8.         pixmap = QPixmap()
  9.         pixmap.loadFromData(icon_data)
  10.         icon = QIcon(pixmap)
  11.         self.setWindowIcon(icon)
  12.         self.btn_translate.setText("翻译引擎启动中,请稍后...")
  13.         self.btn_translate.setEnabled(False)
  14.         # 初始化浏览器
  15.         init_thread = Thread(target=self.init_browser)
  16.         init_thread.start()
  17.         # self.init_browser()
  18.         # 绑定事件
  19.         self.btn_translate.clicked.connect(self.translate)
  20.         # 翻译结果
  21.         self.results = {
  22.             '有道': self.txt_translate_youdao,
  23.             '腾讯': self.txt_translate_qq,
  24.             '百度': self.txt_translate_baidu
  25.         }
  26.     def init_browser(self):
  27.         edge_path = get_edge_path()
  28.         if not edge_path:
  29.             edge_path = browser_path
  30.         if not edge_path:
  31.             self.btn_translate.setText("未能自动获取浏览器路径,请在config.ini中配置浏览器路径")
  32.         co = ChromiumOptions()
  33.         co = co.headless()      # 无头模式
  34.         co = co.set_browser_path(rf'{edge_path}')  # 浏览器路径
  35.         self.browser = Chromium(co)  # 创建浏览器对象
  36.         self.browser.set.retry_times(10)  # 设置整体运行参数
  37.         # 同时启动3个窗口
  38.         with ThreadPoolExecutor(3) as executor:
  39.             future1 = executor.submit(self.browser.new_tab, 'https://fanyi.youdao.com/#/TextTranslate', )
  40.             future2 = executor.submit(self.browser.new_tab, 'https://fanyi.qq.com/', )
  41.             future3 = executor.submit(self.browser.new_tab, 'https://fanyi.baidu.com/mtpe-individual/multimodal#/"')
  42.             future4 = executor.submit(self.browser.new_tab, 'https://fanyi.so.com/')
  43.             self.tab_youdao = future1.result()
  44.             self.tab_qq = future2.result()
  45.             self.tab_baidu = future3.result()
  46.             self.tab_360 = future4.result()
  47.             self.btn_translate.setText("翻译")
  48.             self.btn_translate.setEnabled(True)
复制代码
定义一个thread.py的线程操纵文件,在这里我们对几个网站分别举行翻译操纵,并得到翻译之后的效果,关键代码如下:
  1.     def translate_youdao(self, tab):
  2.         """
  3.         有道翻译
  4.         :param tab:
  5.         :return:
  6.         """
  7.         self.result.emit("youdao", "正在翻译,请稍后...")
  8.         tab.ele('#js_fanyi_input').input(self.text, clear=True)
  9.         result = tab.ele('#js_fanyi_output_resultOutput', timeout=10).text
  10.         if result:
  11.             result = result.strip()
  12.         # print(f"有道翻译结果: {result}")
  13.         self.result.emit("youdao", result)
  14.         # 清空输入框
  15.         tab.ele('#js_fanyi_input').input("", clear=True)
  16.         return result
  17.     def translate_qq(self, tab):
  18.         """
  19.         腾讯翻译
  20.         :param tab:
  21.         :return:
  22.         """
  23.         self.result.emit("qq", "正在翻译,请稍后...")
  24.         tab.ele('xpath://div[@]/textarea').input(self.text, clear=True)
  25.         result = []
  26.         text_eles = tab.eles('.target-text-list', timeout=10)
  27.         for text_ele in text_eles:
  28.             result.append(text_ele.text)
  29.         if result:
  30.             result = "\n".join(result)
  31.         # print(f"腾讯翻译结果: {result}")
  32.         self.result.emit("qq", result)
  33.         # 清空输入框
  34.         tab.ele('xpath://div[@]/textarea').input("", clear=True)
  35.         return result
  36.     def translate_baidu(self, tab):
  37.         """
  38.         百度翻译
  39.         :param tab:
  40.         :return:
  41.         """
  42.         self.result.emit("baidu", "正在翻译,请稍后...")
  43.         tab.ele('xpath://div[@role="textbox"]').input(self.text, clear=True)
  44.         result = tab.ele('#trans-selection', timeout=10).text
  45.         if result:
  46.             result = result.strip()
  47.         # print(f"百度翻译结果: {result}")
  48.         self.result.emit("baidu", result)
  49.         # 清空输入框
  50.         tab.ele('xpath://div[@role="textbox"]').input("", clear=True)
  51.         return result
  52.     def translate_bing(self, tab):
  53.         """
  54.         必应翻译
  55.         :param tab:
  56.         :return:
  57.         """
  58.         self.result.emit("bing", "正在翻译,请稍后...")
  59.         tab.ele('#tta_input_ta').input(self.text, clear=True)
  60.         result = ""
  61.         for i in range(10):
  62.             result = tab.ele('#tta_output_ta', timeout=10).text
  63.             if result and result != "...":
  64.                 result = result.strip()
  65.                 break
  66.             time.sleep(1)
  67.         # print(f"必应翻译结果: {result}")
  68.         self.result.emit("bing", result)
  69.         # 清空输入框
  70.         tab.ele('#tta_input_ta').input("", clear=True)
  71.         return result
  72.     def translate_360(self, tab):
  73.         self.result.emit("360", "正在翻译,请稍后...")
  74.         tab.ele('xpath://textarea[@placeholder="输入文字"]').input(self.text, clear=True)
  75.         # 点击翻译
  76.         tab.ele(".translate").click()
  77.         # 获取结果
  78.         result = ""
  79.         for i in range(10):
  80.             result = tab.ele('xpath://div[@]/p[@]', timeout=10).text
  81.             if result and result != "翻译中...":
  82.                 result = result.strip()
  83.                 break
  84.             time.sleep(1)
  85.         # print(f"360翻译结果: {result}")
  86.         self.result.emit("360", result)
  87.         # 清空输入框
  88.         tab.ele('xpath://textarea[@placeholder="输入文字"]').input("", clear=True)
  89.         return result
复制代码
translate_youdao()函数,实现有道翻译的逻辑。
translate_qq()函数,实现了腾讯翻译的逻辑。
translate_baidu()函数,实现百度翻译的逻辑。
translate_360()函数,实现360翻译的逻辑。
因为以上几个网站,因为是基于浏览器去操纵的,网站本身就支持自动识别语言的,所以能很方便的实现:中译英、英译中的双向翻译哦!
四、为什么不需要驱动就能控制浏览器?

因为现在基于Chromium的浏览器都支持CDP协议来自动化控制浏览器,以前的自动化都是基于浏览器驱动的方式,很容易被一些手段检测到。但是现在浏览器本身就开放了这个CDP协议,所以我们只需要按照协议的约定去操纵即可实现自动化。
最关键的是:因为他是用的真实的浏览器操纵,所以很难被检测到!
五、获取源码及软件

我是王哪跑,持续更新python实操案例,不断提供有代价的技能和软件!
附完整版源码和软件:(完整版源码下载
获取后,有任何代码问题,均负责解说答疑,保证正常运行!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表