post 实现在线翻译小工具

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值