似水流年2015 发表于 2020-9-24 20:09

Python练习小工具——有道JS接口翻译( 附源码)

本帖最后由 似水流年2015 于 2020-9-24 20:15 编辑




初衷:
学习编程时,不少命令不懂是啥意思,不好记,有时编程报错英文,要手动把错误复制发到微信的文件助手,翻译一下,看看啥意思,用过有道或金山词霸或熊猫ocr识别翻译,总感觉不够省时,翻译也不算准确,快捷键鼠标采词自动翻译,有时会误翻译,有时会和其它软件冲突,总感觉不对劲,有点乱七八糟的感觉。就自己写了一个简简单单的。


不接受任何反驳,我自己的崽才是最好的崽


使用说明:
1.自动复制第0行翻译结果。
2.中英文翻译不用切换,直接输入就行,有道会自动识别的。其它语言不知道会不会自动翻译,因为我打不出。


下载地址:https://www.lanzoux.com/ixMGbgwa65e




开始是用易语言+JS写的,因为有道翻译时post包会传送加密的md5参数,所以得读取JS或用易语言模拟其加密过程。易语言写完后,却发现只能翻译中文,输入英文翻译会卡死。
改用python写就没有这个现象,流畅自如,于是就用python了。




#pyperclip是复制粘贴 到剪贴板

importtime,requests,random,hashlib,json,pyperclip
from bs4 import BeautifulSoup

#不加cookie不行
handers={
    "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=829686996@10.108.160.17; JSESSIONID=aaaXBZwTtQCgucOlrZFnx; OUTFOX_SEARCH_USER_ID_NCOO=491472124.65368974; ___rl__test__cookies="+str(int(time.time()* 1000) )
}


# with open(r'D:\ZM\test.js') as f:   这段是js文件读取的,印象深刻啊,用乐易自带的md5.js 弄出来的md5竟然不对,后来百度找了一段,对了
#   jsdata = f.read()
# ctx = execjs.compile(jsdata)
# result=ctx.call('fz',text)#ts,bv,salt,sign
# #print(result)
# ts=result
# salt=result
# sign=result
# bv=result

#print(len(sign),len(bv))
text=""   #定义为空
while text!="exit":   #如果内容不等于 exit 退出命令,则循环翻译
    # 构造各项参数
    if text =="":   #是空的话,就提示输入翻译内容
      text = input("请输入要翻译的内容:\n")
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    ts = int(time.time() * 1000)# 取13位的时间戳整数
    salt = str(ts) + str(random.randint(1, 9))# 用时间戳和一位随机整数 连接成字符串
    # 用指定的字符 和翻译 和 salt 连接后,编码,再求出16位加密md5
    sign = hashlib.md5(("fanyideskweb" + text + salt + "]BjuETDhU)zqSxf-=B#7m").encode(encoding='UTF-8')).hexdigest()
    bv = hashlib.md5(handers["User-Agent"].encode(encoding='UTF-8')).hexdigest()# ua 也求md5
    data = {
      "i": text,
      "from": "AUTO",
      "to": "AUTO",
      "smartresult": "dict",
      "client": "fanyideskweb",
      "salt": salt,
      "sign": sign,
      "ts": ts,
      "bv": bv,
      "doctype": "json",
      "version": "2.1",
      "keyfrom": "fanyi.web",
      "action": "FY_BY_CLICKBUTTION",
    }
    R = requests.post(url, headers=handers, data=data)
    # Be=BeautifulSoup(R.text,"lxml")
    dict_text = json.loads(R.text)#转为json
    #print(R.text)
    text=""    #设置为空,免得后面循环都是翻译同一个词语
    boolf=True#当为假是,表示在循环时,要用户输入 新的待翻译词语,如果为真,则表示用户没有选择序号复制已翻译的结果,自动去进行翻译、
    appp=[]#把上一次的翻译列表清空
    #print(dict_text["errorCode"])
    if dict_text["errorCode"]==0:#错误码为0 表示翻译成功
      a="0--%s"%dict_text["translateResult"]["tgt"]#取出翻译结果
      appp.append(a)            #加到已翻译词语列表里
      pyperclip.copy(dict_text["translateResult"]["tgt"])
      print("\n")
      print(a)
      if"smartResult" in dict_text.keys():   #如果存在 智慧翻译词语
            for index,i in enumerate(range(len(dict_text["smartResult"]["entries"]))):#从智慧翻译词语组 循环取出翻译结果
                m=dict_text["smartResult"]["entries"].strip()      #取出一个智慧翻译结果
                if m!="": #这个智慧翻译的结果不是空的
                  b="%d--%s"%(index,m)
                  print(b)
                  appp.append(b)

      selce=input("已自动复制第一行翻译,需要其它行可以输入相应的序号回车即复制,若要继续翻译,请直接输入要翻译的内容,再按回车:\n\n")#存着用户输入的命令,用于等会判断用户是要复制翻译结果,还是要继续翻译内容。
      for app in appp:    #循环把翻译结果取出
            if selce in app:   #逐个判断翻译的结果中是否存在 相应的序号
                c = app.split("--")   #如果序号存在,表示用户想复制翻译结果
                #print(c)
                pyperclip.copy(c)   #自动复制结果
                boolf=False    #置假,表示下面的 if boolf: 为假,不成立,不给text赋值,然后在循环头,会判断到text为空,让用户输入要翻译的词语
                print("已自动复制,请粘贴使用!\n")
                break
      if boolf:#为真,就是用户没输入要复制的序号,直接去执行翻译。
            text = selce

似水流年2015 发表于 2020-9-25 09:54

simdabo 发表于 2020-9-24 23:18
能不能添加红色圈圈这一行??

查了一下,接口返回的数据没有这个,只有下面的json内容{"translateResult":[[{"tgt":"请注意","src":"notice"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 通知,布告;注意;公告\r\n","vt. 通知;注意到;留心\r\n","vi. 引起注意\r\n"],"type":1}}

似水流年2015 发表于 2020-9-24 22:37

simdabo 发表于 2020-9-24 22:32
Traceback (most recent call last):
File "C:\YD.py", line 3, in
    importtime,requests,random ...

没有 pyperclip 这个模块,这个模块作用是自动复制   pip install pyperclip 安装一下

不负韶华 发表于 2020-9-24 20:17

对于简单封装调用别人的接口的程序不算原创
发错板块了,版主大大@风之暇想

beyond1994 发表于 2020-9-24 20:44

想问一下,这种和网站对接需要html基础吗

似水流年2015 发表于 2020-9-24 20:48

beyond1994 发表于 2020-9-24 20:44
想问一下,这种和网站对接需要html基础吗

少少html基础和Js加解密基础,当初我也觉得不容易 ,咬牙看了一些html基础,和js基础,发现js语法和python差不多的,反正学就是了,学到一定程序,以前的问题都不是问题了

beyond1994 发表于 2020-9-24 20:50

似水流年2015 发表于 2020-9-24 20:48
少少html基础和Js加解密基础,当初我也觉得不容易 ,咬牙看了一些html基础,和js基础,发现js语法和pytho ...

哈哈,我现在就在学Python基础,现阶段的疑问可能在后面就没了

似水流年2015 发表于 2020-9-24 21:03

beyond1994 发表于 2020-9-24 20:50
哈哈,我现在就在学Python基础,现阶段的疑问可能在后面就没了

是的,加油

Lara 发表于 2020-9-24 21:37

beyond1994 发表于 2020-9-24 20:50
哈哈,我现在就在学Python基础,现阶段的疑问可能在后面就没了

教程来一份。

fafaer 发表于 2020-9-24 21:59

好用,顶顶顶顶顶顶顶一下

simdabo 发表于 2020-9-24 22:31

from bs4 import BeautifulSoup

怎么我的说这一行错误了

simdabo 发表于 2020-9-24 22:32

Traceback (most recent call last):
File "C:\YD.py", line 3, in <module>
    importtime,requests,random,hashlib,json,pyperclip
ModuleNotFoundError: No module named 'pyperclip'
页: [1] 2 3
查看完整版本: Python练习小工具——有道JS接口翻译( 附源码)