post 实现在线翻译小工具
文章目录
前言
本工具使用了requests模块,实例为大家分享了python实现在线翻译的具体代码,供大家参考。
提示:下面源代码案例可供参考
效果展示:
import os
try:
import requests as rq
import hashlib as hb
except Exception as e:
print("正在自动安装数据库, 请稍等...")
info1 = os.popen(cmd="pip install requests -i https://pypi.doubanio.com/simple/").read()
info2 = os.popen(cmd="pip install hashlib -i https://pypi.doubanio.com/simple/").read()
print("数据库安装完成!")
else:
pass
import requests
import hashlib
import re
import time
import random
def title():
""" 显示作者标题 """
print("*************************************")
print("* 欢迎使用在线翻译小工具!")
print("* 此工具采用了百度+有道双引擎搜索!")
print("*************************************")
print()
return
def baidu_translation(input_info="love", tips="对不起, 翻译失败!"):
""" 调用百度进行翻译(单词), 返回翻译结果 """
input_info = str(input_info) # 输入文本必须是字符串
url = "https://fanyi.baidu.com/sug"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0",
} # UA 伪装
data = {"kw": input_info} # 传入翻译的单词
response = requests.post(url=url, data=data, headers=headers, timeout=15)
response.encoding = 'utf-8' # 设置响应信息编码方式
status_code = response.status_code # 状态码
response.close()
if int(status_code) == 200: # 如果返回200状态码, 则执行. 否则打印翻译失败
result = response.json() # 导出为json类型文件
# print(result)
try:
list_info = result.get("data") # 获取列表值
if len(list_info) > 0:
for info in list_info:
# print(info)
print(f"\tBaidu: {info.get('k')}\t{info.get('v')}")
if len(list_info) == 0: # 如果获取不到值, 则显示翻译失败
print(f"\tBaidu: {tips}")
except:
print(f"\tBaidu: {result}") # 如果尝试打印翻译结果失败的话, 则直接打印结果
else:
pass
else:
print(f"\tBaidu: {tips}") # 如果返回不是200的状态码, 则打印翻译失败
return
def YouDao_translation(input_info="love", tips="对不起, 翻译失败!"):
""" 调用有道进行翻译(单词或句子), 返回翻译结果 """
""" js加密破解 """
input_info = str(input_info) # 输入文本必须是字符串
dict_x = {
"i": input_info,
"client": "fanyideskweb",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0"
} # 为了创建 sign 与 bv
ts = str(int(time.time() * 1000)) # ts算法: 生成13位的时间戳
salt = f"{ts}{random.randint(1, 9)}" # salt加密算法: 时间戳 + 0~9随机整数
sign_info = dict_x.get("client") + str(input_info) + str(salt) + "Tbh5E8=q6U3EXe+&L[4c@"
sign = hashlib.md5(sign_info.encode('utf-8')).hexdigest()
# sign加密算法: client + i + salt + 'Tbh5E8=q6U3EXe+&L[4c@', 然后通过md5加密生成 sign
bv_info = dict_x.get('User-Agent') # 获取上面字典信息
bv = hashlib.md5(bv_info.encode('utf-8')).hexdigest() # bv加密算法: 对客户端信息("User-Agent")使用mod5加密
# print("ts =", ts)
# print("salt =", salt)
# print("sign =", sign)
# print("bv =", bv)
url = "https://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/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0",
"Cookie": "OUTFOX_SEARCH_USER_ID=807364661@10.169.0.84; OUTFOX_SEARCH_USER_ID_NCOO=1504120241.6202462; "
"_ga=GA1.2.268201880.1594950724; _ntes_nnid=7b54d3118f7dbefa81d122872800574d,1615785185343; "
"JSESSIONID=aaa-1MPzSmaKU9y9JNyJx; ___rl__test__cookies=1618541963430 ",
"Referer": "https://fanyi.YouDao.com/"
} # 请求头里面的信息, 有道这里的请求头需要加上Referer和Cookie才可以访问成功。UA 伪装
data = {
"i": input_info, # 传入文本信息
"from": "AUTO", # 自动识别翻译前
"to": "AUTO", # 自动识别翻译后
"smartresult": "dict", # 返回翻译的结果是 json 字典
"client": "fanyideskweb", # 客户端
"salt": salt, # 动态变化--lts后面加了一位随机数
"sign": sign, # 动态变化-- client+i+salt+'Tbh5E8=q6U3EXe+&L[4c@', 通过md5加密生成的
"lts": ts, # 动态变化---时间戳
"bv": bv, # 动态变化--bv也是变量, 是根据浏览器版本号(不变)而生成的, md5加密(浏览器版本号)
"doctype": "json", # 返回结果属于json类型
"version": "2.1",
"keyfrom": "fanyi.web", # 有道翻译
"action": "FY_BY_REALTlME",
} # From Data 里面的信息, 包含了js加密算法
response = requests.post(url=url, data=data, headers=headers, timeout=15) # 对URL发起post请求
response.encoding = 'utf-8' # 设置响应信息编码方式
status_code = response.status_code # 状态码
response.close()
if int(status_code) == 200: # 如果返回200状态码, 则执行. 否则打印翻译失败
translate_result = response.json() # 导出为json类型文件
# print("status_code=", status_code)
# print("translate_result=", translate_result)
list_result = [] # 定义一个空列表用来存储翻译的结果
if translate_result.get('errorCode') == 0:
if translate_result.get('translateResult') is not None:
tgt = translate_result.get('translateResult')[0][0]['tgt']
# print(tgt)
list_result.append(str(tgt))
if translate_result.get('smartResult') is not None:
extend = translate_result.get('smartResult')["entries"][1:]
# print(extend)
list_result = list_result + extend # 列表拼接
if translate_result.get('errorCode') == 40:
list_result.append(f"{tips}")
if translate_result.get('errorCode') == 50:
list_result.append(f"{tips}")
list_result = [x.replace('\r', '') for x in list_result[:]] # 去除列表中的\r
list_result = [x.replace('\n', '') for x in list_result[:]] # 去除列表中的\n
# list_result = [x for x in list_result[:] if re.search(r"^\s+|''", x) is None] # 去除空白符
list_result = [x for x in list_result[:] if x not in ['', ' ', ' ', ' ', ' ', ' ']] # 去除列表中的空白
# print("list_result=", list_result)
for info in list_result:
print(f"\tYouDao: {str(info)}")
else:
print(f"\tYouDao: {tips}") # 如果状态码不对, 则显示翻译失败
return
if __name__ == "__main__":
title()
list_tips = [
"对不起, 我翻译失败啦~", "失败了, 就把它当做一个新的开始~", "主人, 我的脑壳疼~", "主人, 你想要的内容不存在哦~",
"主人, 我找不到啦~", "主人, 度娘不给力哦~", "主人, 重新输入一次试试呢?", "主人, 尝试一下其它单词呢?",
"尴尬, 我啥也没找到~", "踏破铁鞋无觅处~", "空空如也~", "不知下落~", "无迹可寻~", "绕了地球一圈, 我啥也没搜到~",
"主人, 我没搜到, 别生气哦, 么么哒!", "啥也没搜到, 我心态崩了呀~",
]
while True:
input_info = str(input("请输入文本信息(中文/英文):")).strip() # 输入文本信息, 并且去除两端空格
tips = random.choice(list_tips)
try:
print('\t-----------------------------------------')
baidu_translation(input_info=input_info, tips=tips) # 尝试使用百度内核翻译
print('\t-----------------------------------------')
except:
print('\t-----------------------------------------')
print(f"\tBaidu: {tips}")
print('\t-----------------------------------------')
else:
pass
try:
YouDao_translation(input_info=input_info, tips=tips) # 尝试使用有道内核翻译
print('\t-----------------------------------------')
except:
print(f"\tYouDao: {tips}")
print('\t-----------------------------------------')
else:
pass
print()