用Python制作mini翻译器的实现示例

1. 实例描述

在平时编程的过程中,会经常在网上翻译一些单词,本文使用Python制作一款翻译小工具,不仅可以自己用,还可以嵌入到程序当中。运行程序,效果如下图所示,在文本框输入英文或中文,单击 翻译 按钮即可翻译,并将翻译内容显示在下面的文本框中。单击 保存 按钮将输入内容和翻译内容保存到文本文件中以便日后复习。单击 清空 按钮,将清除文本框中的内容。

2. 技术要点

利用 requests 模块获取 有道词典web 页面的 post 信息,获取需要的内容,通过 tkinter 模块生成窗口界面,使用文件读写方法将内容保存到文本文件中。

2.1 有道词典这样的 JS 混淆加密应该怎么破

嘿嘿嘿,本文需要说说一些爬虫过程中需要斗智斗勇的事情了,这次咱们就来说说关于一些 JS 混淆加密的事。所谓 JS ,就是 JavaScript,一种前端的脚本语言,一般情况下每个网站都需要 JS 来做一些数据交互,页面渲染等一些异步操作。当然,对于反爬的人来说,JS 的用处还可以用来对一些数据进行加密。

今天咱们就以有道词典这个在线翻译的网站为例,看看他们是如何加密请求数据的,以及笔者是如何通过 Python 模拟请求从而获得关键数据的。

点击 此处 打开有道翻译的网站:

输入中文然后点击翻译按钮就会翻译出来英文,比如:

接着我们打开开发者工具,按下 F12 来抓一下数据,当我们点击翻译的时候,可以看到有了一个请求:

点进去看可以发现,POST 请求的地址是:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

我们再来看一下请求过去携带的参数是啥:

可以看到,还是需要挺多参数的,其中的 i 就是我们要翻译的内容,那简单啊~想要得到翻译后的数据,那么我们直接把请求头和所需参数的值复制一下,然后用 requests 请求一波不就搞定了?运行一波,返回的是错误码。

我们再点多几次翻译按钮,然后就可以看到有多次请求。

可以发现,每一次的请求中的 saltsignltsbv 参数是会一直变化的。

我们回到NetWork ,我们看到 Initiator 这一栏,可以看到它请求到了 fanyi.min.js:1 这个 js 文件。

我们就点 fanyi.min.js:1 进去看看,牛的一比,直接看不懂…还好,左下角有一个 {} ,可以点一下,发现有惊喜,直接帮我们把压缩的 js 代码格式化。

牛逼不,行号都给我们显示出来了,不过到了这里,依然懵逼,我们还是不知道怎么拿到 saltsignltsbv 这些参数的值…咋办?恩,Chrome 浏览器的打断点功能在这个时候就要派上用场。那么如何使用断点功能呢,我们看到 Chrome 的右边是这样的:

看到这个 XHR/fetch BreakPoints 没,在这里我们可以添加 url ,根据请求这个 url 打断点。而我们要打的断点就是一开始获取到的请求 url

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

点击 XHR/fetch BreakPoints 右边的 + 号,然后把链接复制进去:

这时候再点击翻译按钮,突然,你的屏幕一灰,表示好事将近,我们成功打上了断点,也就是说,现在我们可以在请求之前做一些骚操作。

这时候我们将右边的 Call Stack 展开,点 t.translate 进去:

这些,就是我们在点击翻译按钮之后,会调用到 js 里面的方法,从这里下手,来寻找参数是被如何加密的,

3. 代码实现

用Python制作mini翻译器的具体步骤如下:

首先安装 requests 模块。使用 pip 命令安装,命令如下:

pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com requests

导入相关模块,代码如下。

import tkinter as tk
import requests
import time
import hashlib
import random

定义翻译函数,代码如下。

def get_ts():
  """
  获取时间戳
  :return: 时间
  """
  return str(int(time.time() * 1000))

def get_bv():
  """
  获取app版本 并通过md5加密
  :return: 加密后的字符串
  """
  navigator_appVersion = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3' \
              '904.108 Safari/537.36'
  m = hashlib.md5()
  m.update(navigator_appVersion.encode('utf-8'))
  return m.hexdigest()

def get_salt(ts):
  return str(ts) + str(int(random.random() * 10))

def get_sign(salt):
  str1 = text1.get() # 定义一个变量,用来接收输入文本框的值
  str_data = 'fanyideskweb' + str1 + salt + ']BjuETDhU)zqSxf-=B#7m'
  m = hashlib.md5()
  m.update(str_data.encode('utf-8'))
  return m.hexdigest()

def get_form_data():
  str1 = text1.get() # 定义一个变量,用来接收输入文本框的值
  ts = get_ts()
  salt = get_salt(ts)
  form_data = {
    'i': str1,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': str(salt),
    'sign': get_sign(salt),
    'ts': ts,
    'bv': get_bv(),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION',
  }
  return form_data

# 定义翻译函数
def translate():
  url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=173326173.72226533; OUTFOX_SEARCH_USER_ID="-1202396372@10.108.160.18"; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcAjF-mxbKFQ_48uyLpx; __guid=204659719.1682486053682624500.1597281254731.5474; monitor_count=2; ___rl__test__cookies=1597285713766'
  }
  response = requests.post(url=url, data=get_form_data(), headers=headers)
  if response.status_code == 200:
    result = response.json()
    translate_result = result['translateResult'][0][0]['tgt']
    text2.delete(1.0, "end") # 清空输出文本框
    text2.insert('end', translate_result) # 将翻译结果添加到输出文本框中

定义写入文本 txt 的函数,代码如下。

# 定义写入文本txt的函数
def write():
  f1 = open('translate.txt', 'a+')
  f1.write(text1.get() + ',' + text2.get(0.0, tk.END))

定义清空文本框的函数,代码如下。

# 定义清空文本框的函数
def delete():
  text1.delete(0, "end") # 从第一行清除到最后一行
  text2.delete(1.0, "end")

窗口界面设计,代码如下。

if __name__ == '__main__':
  window = tk.Tk() # 创建window窗口
  window.wm_attributes("-topmost", 1) # 置顶
  window.title("AmoXiang mini翻译器") # 定义窗口名称
  window.resizable(width=False, height=False) # 决定框体大小是否能够调整
  text1 = tk.Entry(window, width=80, bg='whitesmoke') # 在窗体上添加一个输入文本框,并设置尺寸和颜色
  text2 = tk.Text(window, height=18, bg='lightgrey') # 在窗体上添加一个输出文本框,并设置尺寸和颜色
  text1.grid(row=0, sticky="W", padx=1)
  text2.grid(row=1)
  # 添加一个按钮,用于触发翻译功能
  t_button = tk.Button(window, text='翻译', relief=tk.RAISED, width=8, height=1, font='宋体', bg='red', fg='white',
             command=translate)
  # 添加一个按钮,用于触发清空输入文本框
  button1 = tk.Button(window, text='保存', font='宋体', relief=tk.RAISED, width=8, height=1, command=write)
  # 添加一个按钮,用于触发清空输出文本框
  button2 = tk.Button(window, text='清空', font='宋体', relief=tk.RAISED, width=8, height=1, command=delete)
  # 添加背景图片
  image_file = tk.PhotoImage(file='amo.gif')
  label = tk.Label(window, image=image_file)
  # 完成界面布局,设置各个控件的位置
  t_button.grid(row=0, column=1, padx=2)
  button1.grid(row=0, column=2, padx=2)
  button2.grid(row=0, column=3, padx=2)
  label.grid(row=1, column=1, columnspan=3)
  tk.mainloop()

到此这篇关于用Python制作mini翻译器的实现示例的文章就介绍到这了,更多相关Python mini翻译器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python利用有道翻译实现"语言翻译器"的功能实例

    实例如下: import urllib.request import urllib.parse import json while True: content = input('请输入需要翻译的内容(退出输入Q):') if content == 'Q': break else: url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom

  • 用Python制作mini翻译器的实现示例

    1. 实例描述 在平时编程的过程中,会经常在网上翻译一些单词,本文使用Python制作一款翻译小工具,不仅可以自己用,还可以嵌入到程序当中.运行程序,效果如下图所示,在文本框输入英文或中文,单击 翻译 按钮即可翻译,并将翻译内容显示在下面的文本框中.单击 保存 按钮将输入内容和翻译内容保存到文本文件中以便日后复习.单击 清空 按钮,将清除文本框中的内容. 2. 技术要点 利用 requests 模块获取 有道词典web 页面的 post 信息,获取需要的内容,通过 tkinter 模块生成窗口界

  • Python制作摩斯密码翻译器

    目录 分析 摩斯密码对照表 实现代码 结果  分析 摩斯密码是一种将文本信息作为一系列通断的音调.灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译.它以电报发明者Samuel F. B. Morse的名字命名. 算法 算法非常简单.英语中的每个字符都被一系列"点"和"破折号"代替,或者有时只是单数的"点"或"破折号",反之亦然. 加密 在加密的情况下,我们一次一个地从单词中提取每个字符(如果不是空格),并将其与存

  • 基于Python制作AI聊天软件的示例代码

    目录 效果图 需要用到的库 窗体设计 函数 为粉丝们额外添加的功能 完整代码 效果图 先看一下效果图 就当是女友无聊的时候自己抽不出时间的小分身吧! 需要用到的库 tkinter.time.urllib.requests tkinter负责窗体.time显示时间.urllib和requests负责请求 窗体设计 from tkinter import * win1 = Tk() win1.geometry('400x644+100+100') win1.title('xxx男神的AI分身') L

  • 基于Python制作一个文本翻译器

    translate非标准库是python中可以实现对多种语言进行互相翻译的库,使用时只需要设置目标语言(比如:中文.英文)后,会自动将原始文本翻译成我们需要的目标语言. 使用pip的方式安装translate非标准库. pip install translate 准备好之后进行代码编写过程,实现的方式也比较常规. 输入需要翻译的文本文件路径. path = input('请输入需要翻译的文件路径(.txt):\n') 编写文本文件读取函数,读取文本文件后返回字符串. def read_text(

  • Python制作春联的示例代码

    目录 1. 前言 2. 代码中需要导入的模块 3. 下载字模 4. 下载龙凤呈祥背景底图 5. 生成春联 6. 测试样例 6.1 普天同庆 欢度春节 6.2 年尽岁除岁月如歌 冬去春来春光似画 6.3 人世间纵有百娇千红 唯独你是我情之所钟 1. 前言 春联是中国传统文化中最具内涵的元素之一,它以对仗工整.简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗.每逢春节期间,无论城市还是农村,家家户户都要精选一副大红春联贴于门上,辞旧迎新,以增加节日的喜庆气氛.据

  • Python制作可视化报表的示例详解

    大家好,我是小F- 在数据展示中使用图表来分享自己的见解,是个非常常见的方法. 这也是Tableau.Power BI这类商业智能仪表盘持续流行的原因之一,这些工具为数据提供了精美的图形解释. 当然了,这些工具也有着不少缺点,比如不够灵活,无法让你自己创建设计. 当你对图表展示要求定制化时,编程也许就比较适合你,比如Echarts.D3.js. 今天小F给大家介绍一个用Python制作可视化报表的案例,主要是使用到Dash+Tailwindcss. 可视化报表效果如下,水果销售情况一览~ Das

  • 基于Python制作三款起床闹钟的示例代码

    目录 导语 一.Turtle绘制时钟 1)代码展示 2)效果展示 二.Turtle实现模拟时钟 1)代码展示 2)效果展示 三.简易时钟 1)代码展示 2)效果展示 导语 叮叮叮,我们要按时长大 我是你们的木子同学!当当当当——隆重出场,撒花撒花~ 嗨!大家有没有生物钟不准时的时候,是不是每到休息日或者长假就会经常要倒时差? 每天上班最痛苦的事情就是早起早起早起!这是大部分上班族的痛苦,但是不上班又是不可能的啦,因为都是为了搞钱 今天小编就用代码示例化,给大家展示一下不同的时钟,希望大家按时上班

  • 基于Python制作天眼查小程序的示例代码

    目录 界面搭建 整体布局 界面美化 天眼查爬虫 获取信息 代码编写 结果展示 今天我们一起来制作一个天眼查GUI程序,开宗明义,我们先来看下最终的效果 这次的GUI程序,我们使用的框架是PyQt5,该框架拥有比tkinter更为丰富的内置组件,在界面美化方面,貌似也更胜一筹! 从上图也可以看出,我们的目标还是蛮远大的,最终我们希望可以完成一个工具集合,把我们日常当中常用的功能都集成的该GUI程序中,比如天眼查公司信息,知乎用户知识图谱,B视频弹幕抓取等等. 好了,今天我们先完成天眼查的功能吧~

  • python制作英语翻译小工具代码实例

    这篇文章主要介绍了python制作英语翻译小工具代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用python爬虫可以制作英语翻译小工具.来看下代码吧- import requests,json #函数封装 def translator(): session=requests.session() i=input('请问你要翻译什么?') url='http://fanyi.youdao.com/translate' headers={

  • 如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的内容. 然后利用简易GUI来可视化结果. 首先我们进入有道词典的首页,并点击翻译结果的审查元素 之后request响应网页,并分析网页,定位到翻译结果. 使用tkinter来制作一个建议的GUI 期间遇到的一个问题则是如何刷新翻译的结果,否则的话会在text里一直累加翻译结果. 于是,在mainlo

随机推荐