ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4098|回复: 18

[讨论] 多语言自动翻译

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-11-28 19:48 | 显示全部楼层 |阅读模式
学习网抓的一个练习,供有兴趣的参考。。。
多语言翻译成中文:美日韩俄法德等-->中文,当然中文也可以翻译成英文附件为各种语言的你好翻译为中文,速度设定在1秒左右一个。



2.gif

多语言翻译.rar

29.89 KB, 下载次数: 348

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-11-29 06:22 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享,代码贴出,方便手机查看。
#if win64这段有点复杂。。。

=有道翻译.xlsm=============
Attribute VB_Name = "GETMD5"
Public Function CreateObjectx86(Optional sProgID, Optional bClose = False)
    Static oWnd As Object
    Dim bRunning As Boolean
    #If Win64 Then
        bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
        If bClose Then
            If bRunning Then oWnd.Close
            Exit Function
        End If
        If Not bRunning Then
            Set oWnd = CreateWindow()
            oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
        End If
        Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
    #Else
        Set CreateObjectx86 = CreateObject("MSScriptControl.ScriptControl")
    #End If
End Function
Public Function CreateWindow()
    Dim sSignature, oShellWnd, oProc
    On Error Resume Next
    sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
    CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""about:<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False
    Do
        For Each oShellWnd In CreateObject("Shell.Application").Windows
            Set CreateWindow = oShellWnd.GetProperty(sSignature)
            If Err.Number = 0 Then Exit Function
            Err.Clear
        Next
    Loop
End Function

Public Function MD5(s)
    Dim js, res
    Set mx = CreateObject("Msxml2.XMLHTTP.6.0")
    mx.Open "GET", "http://www.cmd5.com/md5.js", False
    mx.send
    Set js = CreateObjectx86("msscriptcontrol.scriptcontrol")
    js.Language = "JavaScript"
    js.AddCode mx.responsetext
    res = js.CodeObject.hex_md5(s)
    CreateObjectx86 , True
    MD5 = res
End Function
Attribute VB_Name = "fanyi"
Option Explicit
    Dim objWin As Object, objDom As Object
    #If VBA7 And Win64 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    #Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    #End If

Sub Fy_YD()
    Dim Url$, Postdata$, Cookie$, User_Agent$, i&, xmlhttp, arr, res
    Set objDom = CreateObject("htmlfile"): Set objWin = objDom.parentWindow: Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    User_Agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"

    With xmlhttp
        Url = "http://fanyi.youdao.com"
        .Open "GET", Url, False
        .setRequestHeader "User-Agent", User_Agent
        .send
        Cookie = .GetResponseHeader("set-cookie")
    End With
    arr = Range("a1:a" & Cells(Rows.Count, 1).End(3).Row)
    ReDim res(1 To UBound(arr), 0 To 1)

    With xmlhttp
        Url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
        .Open "POST", Url, False
        .setRequestHeader "User-Agent", User_Agent
        .setRequestHeader "Referer", "http://fanyi.youdao.com/"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        For i = 2 To UBound(arr)
            Postdata = Post_Data(arr(i, 1))
            .send (Postdata)
            Sleep 888
            If InStr(.responsetext, "errorCode"":0") > 0 Then
                Cells(i, 2) = Split(Split(.responsetext, "translateResult"":[""")(1), """],""errorCode")(0)
            End If
            If InStr(.responsetext, "entries"":[") > 0 Then
                Cells(i, 3) = Replace(Split(Split(.responsetext, "entries"":[""")(1), """],""type")(0), "\r\n", "  ")
            End If
        Next
    End With
End Sub


Function Post_Data(word)
    objWin.execScript "var s =encodeURI('" & word & "')"
    Post_Data = "i=" & objWin.s & "&client=fanyideskweb&keyfrom=fanyi.web&salt=1&sign=" & MD5("fanyideskweb" & word & "1]BjuETDhU)zqSxf-=B#7m")
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-29 11:59 | 显示全部楼层
zpy2 发表于 2020-11-29 06:22
谢谢分享,代码贴出,方便手机查看。
#if win64这段有点复杂。。。

感谢回复,因为64位没法直接使用CreateObject("MSScriptControl.ScriptControl"),那一段只是网上现成的轮子,为了兼容32位和64位调用js就行MD5加密用的,其他没什么用。关键是AJAX请求时参数的处理,当时用python试了试,发现提供如下5个参数就行,对应的VBA语句就是这一句:
Post_Data = "i=" & objWin.s & "&client=fanyideskweb&keyfrom=fanyi.web&salt=1&sign=" & MD5("fanyideskweb" & word & "1]BjuETDhU)zqSxf-=B#7m")
image.png
发现虽然参数的处理是经过时间戳、随机数、浏览器版本号及查询字段混合在一起进行MD5加密的,直接复制粘贴好像是不行的,因为是通过JS动态生成的,关键就是取到salt和sign值,但后来发现其实salt值也就是那个时间戳其实并不需要准确提取,只需salt和sign中的值时一样的,进行MD5加密就可以,猜测应该是服务器进行认证时,只要计算salt和sign的值符合上面那个JS公式就行,而不管你的salt是多少,后来用salt=1同样可以通过验证。
JS源码如下:
image.png

初学网抓,说的不对的地方,还请指正。



评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-11-29 12:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wodewan 发表于 2020-11-29 11:59
感谢回复,因为64位没法直接使用CreateObject("MSScriptControl.ScriptControl"),那一段只是网上现成的 ...

salt  也有个俗称"盐",MD加盐。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-29 14:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-11-29 15:00 来自手机 | 显示全部楼层
wodewan 发表于 2020-11-29 11:59
感谢回复,因为64位没法直接使用CreateObject("MSScriptControl.ScriptControl"),那一段只是网上现成的 ...

调用js就行MD5加密用的
厉害的,vba的md5是个麻烦事。

TA的精华主题

TA的得分主题

发表于 2020-11-29 16:57 | 显示全部楼层
Cookie = .GetResponseHeader("set-cookie")

請問拿 responseheader這段有什麼用?
也不見後段有用處?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-29 17:14 | 显示全部楼层
chis3 发表于 2020-11-29 16:57
Cookie = .GetResponseHeader("set-cookie")

請問拿 responseheader這段有什麼用?

测试时用的,原来用于加在第二段的POST请求里的,后来发现第二段POST只要,refer,User-Agent,Content-Type就行,上面的忘记删了

TA的精华主题

TA的得分主题

发表于 2020-11-29 17:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-11-29 17:24 | 显示全部楼层
wodewan 发表于 2020-11-29 17:14
测试时用的,原来用于加在第二段的POST请求里的,后来发现第二段POST只要,refer,User-Agent,Content-T ...

請教一下
responseheader 加在請求有用的嗎?
我只看到需要requestheader的請教,response的都沒什用處
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-7 04:09 , Processed in 0.039781 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表