Python 打造基于百度翻译的命令行翻译工具

由于英文水平一般,所以还是非常依赖翻译工具的。fanyi.baidu.com 都成了我浏览器必开的网页之一了。昨天项目上线,等待过程中,无聊写了一个基于百度翻译 api 的命令行翻译工具。但是效果不是很令我满意,因为它给了一个翻译结果,而没有像网站上那样,给我更多的翻译结果作为参考。

最关键的是,这么个破接口,百度居然还是收费的。虽然免费200万次调用对于我来说是绰绰有余的了。

还是接口返回的结果不另我满意,于是,我在想,能不能爬取一下百度翻译的网站,然后以此来写一个翻译工具。

感谢简书网友 HONGQUAN 提供的《百度翻译最新接口破解》、《百度翻译接口实例解析》两篇文章给我的参考。

我下载了 HONGQUAN 提供的 python 源码,修改后保存为 baidu.py,作为我的代码的引用库

最近我写的这个百度翻译的工具不能用了。我又写了一个基于有道的。https://blog.csdn.net/FungLeo/article/details/82787744

python 百度翻译查询结果返回代码

#!/usr/bin/env python
# encoding: utf-8"""
@file: BaiDu.py
@time: 2018/5/7 17:11
@desc: 百度翻译接口破解
@author: hongquanpro@126.com
"""import sys
import re
import requests
import execjs
import urllib
import jsondef baidu (source, sLang, tLang):# 获取 sign 和 tokengtk = ""token = ""# 获取网页源码header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36","Cookie": "'locale=zh; BAIDUID=FC2689968A662FA6104AA311FE89635B:FG=1; from_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D'",}html = requests.get('http://fanyi.baidu.com', headers=header)html.encoding = 'utf-8'# 获取 gtkmatches = re.findall("window.gtk = '(.*?)';", html.text, re.S)for match in matches:gtk = match# 正则匹配 tokenmatches = re.findall("token: '(.*?)'", html.text, re.S)for match in matches:token = matchif token == "":print('Get token fail.')exit()# 计算 signsignCode = 'function a(r,o){for(var t=0;t<o.length-2;t+=3){var a=o.charAt(t+2);a=a>="a"?a.charCodeAt(0)-87:Number(a),a="+"===o.charAt(t+1)?r>>>a:r<<a,r="+"===o.charAt(t)?r+a&4294967295:r^a}return r}var C=null;var hash=function(r,_gtk){var o=r.length;o>30&&(r=""+r.substr(0,10)+r.substr(Math.floor(o/2)-5,10)+r.substr(-10,10));var t=void 0,t=null!==C?C:(C=_gtk||"")||"";for(var e=t.split("."),h=Number(e[0])||0,i=Number(e[1])||0,d=[],f=0,g=0;g<r.length;g++){var m=r.charCodeAt(g);128>m?d[f++]=m:(2048>m?d[f++]=m>>6|192:(55296===(64512&m)&&g+1<r.length&&56320===(64512&r.charCodeAt(g+1))?(m=65536+((1023&m)<<10)+(1023&r.charCodeAt(++g)),d[f++]=m>>18|240,d[f++]=m>>12&63|128):d[f++]=m>>12|224,d[f++]=m>>6&63|128),d[f++]=63&m|128)}for(var S=h,u="+-a^+6",l="+-3^+b+-f",s=0;s<d.length;s++)S+=d[s],S=a(S,u);return S=a(S,l),S^=i,0>S&&(S=(2147483647&S)+2147483648),S%=1e6,S.toString()+"."+(S^h)}'sign = execjs.compile(signCode).call('hash', source, gtk)# 请求接口v2transapi = 'http://fanyi.baidu.com/v2transapi?from=%s&to=%s&query=%s' \'&transtype=translang&simple_means_flag=3&sign=%s&token=%s' % (sLang, tLang, urllib.parse.quote(source), sign, token)translate_result = requests.get(v2transapi, headers=header)return json.loads(translate_result.text)

命令行翻译工具主文件

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import requests
import json
import argparse
from prettytable import PrettyTable# 引用 baidu.py 文件
from baidu import baidu# 通过百度的免费接口判断输入的词语是中文还是英文
def checkLang (word):langForm = {'query': word}r = requests.post('http://fanyi.baidu.com/langdetect', data=langForm)if r.status_code == 200:res = json.loads(r.text)if res['lan'] == 'en':sLang = 'en'tLang = 'zh'else:sLang = 'zh'tLang = 'en'return [baidu(word, sLang, tLang), sLang]else:print('Api Error')exit()
# 将翻译结果输出
def fanyi(word, goNext):checkRes = checkLang(word)res = checkRes[0]sLang = checkRes[1]if 'trans_result' in res:tRes = res['trans_result']tableHead = ['原词', word]x = PrettyTable(tableHead)x.padding_width = 1x.align = 'l'print('\n\033[1;36m简单结果\033[0m')for k, i in enumerate(tRes['data']):x.add_row(['结果', i['dst']])print(x)if 'dict_result' in res:dRes = res['dict_result']if 'simple_means' in dRes:sdRes = dRes['simple_means']if 'word_means' in sdRes:print('\n\033[1;36m更多翻译\033[0m')x = PrettyTable()x.header = Falsex.add_row(sdRes['word_means'])print(x)if goNext:print('\n')inputWord(False)# 如果没有缀参数,则进入连续翻译模式
def inputWord (isFirst):if isFirst:print('\n\033[1;36m英汉互译词典\033[0m by FungLeo')print('\033[35mTip:退出程序请输入 \033[1;31mexit\033[4;0m\n')word = input('请输入要翻译的内容:')if word == 'exit':print('\033[0m很高兴为您服务')exit()else:fanyi(word, True)# 主函数
if __name__ == "__main__":parser = argparse.ArgumentParser()parser.description='Python 编写的基于百度翻译的命令行翻译工具。支持缀参数直接翻译,如有空格,请用引号包含,或不带参数直接进入连续翻译模式。'parser.add_argument("-v", "--version", action='version', version='%(prog)s 1.0')parser.add_argument('word', type=str, help='需要翻译的单词', nargs='?')args = parser.parse_args()if args.word != None:fanyi(args.word, False)else:inputWord(True)

最终效果展示

显示帮助以及版本号

连续翻译模式

参数翻译模式

其他

github 源码地址:https://github.com/fengcms/python-learn-demo/blob/master/fanyi/fanyi.py

本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

Python 打造基于百度翻译的命令行翻译工具相关推荐

  1. Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备)

    Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备) 之前基于百度写了一篇博文 Python 打造基于百度翻译的命令行翻译工具,本来这工具用得挺好的.但是没想到,近期处于不知道啥原因,不 ...

  2. 酷:BaiduPCS-Go | 百度网盘命令行工具(基于 Go)

    好像转过了,没关系再转一遍: https://www.jianshu.com/p/c37a124a0f55 BaiduPCS-Go | 百度网盘命令行工具(基于 Go) Mogeko丶 0.2 201 ...

  3. python登陆百度网盘_百度网盘命令行版本bypy

    表白:黑白圣堂血天使,天剑鬼刀阿修罗. 讲解对象:/百度网盘命令行版本bypy作者:融水公子 rsgz百度网盘教程 http://www.rsgz.top/post/399.html为了大家可以在co ...

  4. 基于Fluent Terminal和Cmder打造一个美观的Windows命令行工具

    前言   相信有很多小伙伴跟我一样,觉得Windows的原生命令行工具具有很多缺点:传统的黑底白字(Windows PowerShell则是蓝底白字)极不美观,复制文本不方便,不支持多Tab页导致多窗 ...

  5. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

  6. 个推Node.js 微服务实践:基于容器的一站式命令行工具链

    2019独角兽企业重金招聘Python工程师标准>>> 作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的 ...

  7. mac怎么查node版本_Node.js 微服务实践:基于容器的一站式命令行工具链

    作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题: 1. 每次新建项目都需要安装一次依赖,这些依赖之 ...

  8. Node.js 微服务实践:基于容器的一站式命令行工具链

    作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题: 每次新建项目都需要安装一次依赖,这些依赖之间基本 ...

  9. Node.js 微服务实践:基于容器的一站式命令行工具链...

    作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题: 每次新建项目都需要安装一次依赖,这些依赖之间基本 ...

最新文章

  1. python注入_python的常见命令注入威胁
  2. SAP QM 稳定性研究功能研习系列1 - 稳定性研究总流程
  3. eclipse外观设置
  4. struts2 datetimepicker标签的使用
  5. 基于 WPF 模块化架构下的本地化设计实践
  6. 句句真研—每日长难句打卡Day13
  7. 【Hash应用问题】例3.1 统计同成绩学生人数
  8. 东南大学成贤c语言试卷,成贤高数(下)期中试卷参考答案
  9. Windows 8 VHD 概述与使用
  10. hawk物联网组态工具_物联网web组态网关在智慧农业中的应用
  11. First Bad Version
  12. php读取excel 报错_PHP读取Excel里的文件
  13. win7显示u盘efi分区_Win7下查看U盘中的EFI盘方法
  14. 【每日一题】 480. 滑动窗口中位数
  15. IDEA keymap使用Eclipse copy 快捷键
  16. INS/GNSS组合导航(五)惯性器件的主要误差
  17. 19、论文解读:Intensity Scan Context: Coding Intensity and Geometry Relations for Loop Closure Detection
  18. css 首个元素,类的第一个元素的CSS选择器
  19. 我的世界java多人不刷溺尸_我的世界:不同版本的三叉戟掉落率不一样?刷了一两百溺尸也没有!...
  20. HTML5 之 Figure Figcaption 标签

热门文章

  1. 看红火的移动电竞市场逐渐走向成熟
  2. crm项目大纲,SSM回顾
  3. 磁共振成像过程_磁共振成像人工智能提高性能
  4. win10在线安装Visual Studio2017
  5. 用Cocos2d-JS制作类神经猫的游戏《你是我的小羊驼》 转载
  6. STM32读写24C02遇到的问题
  7. java设置打印机默认纸张A4
  8. 老卫带你学---CSS 渐变色 (超好看)
  9. iPhone 屏蔽广告小技巧
  10. 2022CPA审计-第一编 审计基本原理【4月27日,20天刷完审计】【题完-人麻-没学会系列】