基于AutoHotkey的便捷翻译器SmartTranslator

  • 用AHK写的智能翻译器,支持查词和翻译
    • 1.API接口
    • 2.功能简述
    • 3.使用方法
    • 4.操作演示
    • 5.源代码
    • 6.软件及代码下载

用AHK写的智能翻译器,支持查词和翻译

1.API接口

  • 词典接口:海词、词霸、有道。
  • 翻译接口:谷歌、百度、有道。

2.功能简述

  • 支持中英文自动识别,无需设置源语言和目标语言
  • 支持句子和单词自动识别,不需要其他切换操作
  • 未完待续···

3.使用方法

  • 第一步:选择需要查询的单词或者需要翻译的句子
  • 第二步:长按右键(或者按下快捷键window + c )直接查词或者翻译
  • 第三步:翻译完成后,在鼠标附近弹出窗口显示翻译结果,鼠标置于文字上,弹窗永不消失,离开弹窗一秒,窗口自动关闭
  • 第四步:在翻译结果文字上按下左键,会替换当前被翻译的内容;按下右键,则将结果复制到剪贴板

4.操作演示

5.源代码

  • ①主函数
;@Ahk2Exe-SetMainIcon Icon\SmartTranslator.ico
;@Ahk2Exe-AddResource Icon\SmartTranslator.ico, 160
;@Ahk2Exe-SetProductName SmartTranslator;不显示托盘图标
;#NoTrayIcon
;跳过对话框, 自动替换旧实例
#SingleInstance force
;设置工作目录
SetWorkingDir %A_ScriptDir%
;不检查空变量是否为环境变量
#NoEnv
;启用或禁用可能产生错误的特定状况时的警告, 例如书写错误或缺少全局声明
;#Warn
;让脚本保持后台运行
#Persistent
;防止用户的击键与发送的击键穿插在一起
SendMode Input
/*
**********************************include Start*******************************************
*/#include WinHttpRequests.ahk
#include TranslateAPI.ahk
#Include <Basic>/*
**********************************include End*********************************************
*//*
**********************************Global start*********************************************
*/Global TranslateResults := "Welcome to the SmartTranslator"
/*
**********************************global End*********************************************
*//*
**********************************Init Code Start*******************************************
*/
ShowWizard()
ConfingInit()
TrayInit()
return
/*
**********************************Init Code End*********************************************
*//*
**********************************User Code Start*******************************************
*/#c::ClipboardAnalyze()
return
$RButton::KeyWait, RButton, T0.25if (ErrorLevel = 1)ClipboardAnalyze()elseSend, {RButton}
ReturnClipboardAnalyze()
{Globalclipboard := ""send ^{c}ClipWait, 1Clipboard := StrReplace(Clipboard, "`r`n", " ")if RegExMatch(clipboard, "[一-鬼]")  ;查找汉字.{;中文模式dictOut := StrReplace(Clipboard, A_Tab)dictOut := StrReplace(dictOut, A_Space)if (strlen(dictOut) >3 || RegExMatch(dictOut, "[^一-鬼]") != 0 ){   ;翻译模式TranslateResults := Select_Dict_Trans("Trans",dictOut)}Else{   ;词典模式TranslateResults :=    Select_Dict_Trans("Dict",dictOut)if(strlen(Results) = 0)TranslateResults := Select_Dict_Trans("Trans",dictOut)}}else{;英文模式dictOut := StrReplace(Clipboard, A_Tab)pos := RegExMatch(dictOut, "\s")pos += 1;查找是否含有字母、空格之外的符号if (RegExMatch(dictOut, "[^a-zA-Z\s]", var) || RegExMatch(dictOut, "\s",, pos))    {   ;翻译模式TranslateResults := Select_Dict_Trans("Trans",dictOut)}Else{   ;词典模式TranslateResults :=   Select_Dict_Trans("Dict",dictOut)if(strlen(TranslateResults)=0)TranslateResults :=  Select_Dict_Trans("Trans",dictOut)}}GuiTip(TranslateResults)Clipboard := ""return
}/*
**********************************User Code End*********************************************
*//*
**********************************Gui Code Start*********************************************
*/
/*
GUI内容显示
*/
;@Ahk2Exe-Bin ,,"UTF-8"
GuiTip(message := "Welcome to use the SmartTranslator!")
{Global varText := messageIf (StrLen(message)>=300) {W_0 := "w950"} Else If (StrLen(message)>=100) {W_0 := "w700"} Else If (StrLen(message)>=55) {W_0 := "w500"} ElseW_0 := ""Gui, GuiTip:Destroy Gui, GuiTip:+ToolWindow +HwndGuiTip_A -Caption +AlwaysOnTop border -DPIScaleGui, GuiTip:Color, cDDDDDDGui, GuiTip:Font, s13 c2D2D2D Q5, 微软雅黑Gui, GuiTip:Margin, 5, 5Gui, GuiTip:Add, Text, X0 %W_0% gGuiTipText, %message%Gui, GuiTip:Font, s10 c333333 Q5, 微软雅黑CoordMode, MouseMouseGetPos, Mu_XX, Mu_YYGui_XX := Mu_XX+10, Gui_YY := Mu_YY+10Gui, GuiTip:Show, x%Gui_XX% y%Gui_YY%,GuiTipGui, GuiTip:Show, x%Gui_XX% y%Gui_YY%,GuiTipSetTimer, GUISet, -1000
}
return
/*
替换动作标签(左键)
*/
GuiTipText:
ToolTip, 原文已被替换
SetTimer, Move_TT, -500
Gui, GuiTip:Destroy
Clipboard := varText
Send ^{v}
Sleep, 100
Clipboard := ""
return
/*
复制动作标签(右键)
*/
GuiTipGuiContextMenu:
ToolTip, 译文已被复制
SetTimer, Move_TT, -500
Gui, GuiTip:Destroy
Clipboard := varText
return
/*
GUI窗口管理,悬浮则保持,离开则关闭
*/
GuiSet:
MouseGetPos, mx,my
WinGetPos,  wx, wy, wd, wh,GuiTip
if((mx < wd) && (my < wh))
{SetTimer, GUISet, -500
}
Else
{Gui, GuiTip:Destroy
}
Return
/*
关闭提示
*/
Move_TT()
{ToolTipReturn
}/*
**********************************Gui Code End*********************************************
*//*
调用翻译和词典接口
*/
Select_Dict_Trans(mode:= "Trans",str := "hello")
{if(mode = "Dict"){DictChoice := Ini.Read("BasicSetting","DictChoice")if(DictChoice = 1)TheResults := Dict.Dict(str)if(DictChoice = 2)TheResults :=  Dict.Youdao(str)if(DictChoice = 3)TheResults :=  Dict.Ciba(str)}if(mode = "Trans"){TransChoice := Ini.Read("BasicSetting","TransChoice")if(TransChoice = 1)TheResults := Trans.Google(str)if(TransChoice = 2)TheResults := Trans.Youdao(str)if(TransChoice = 3)TheResults := Trans.Baidu(str)}return TheResults
}
/*
初始化配置文件
*/
ConfingInit()
{if !(FileExist("config.ini")) {Ini.Write("BasicSetting","StartUp",False)Ini.Write("BasicSetting","DictChoice",3)Ini.Write("BasicSetting","TransChoice",3)}
}
/*
托盘菜单初始化
*/
TrayInit()
{Menu, Tray, NoStandardMenu, Tray, Add, 设置, TraySettingMenu, Tray, Default, 设置Menu, Tray, Add, 关于, TrayAboutMenu, Tray, Add, 退出, TrayExitIniRead, OnStart, config.ini, Setting, StartUp ,0"if(OnStart = 1)Menu, Tray, Check, 开机自启return
}
/*
软件设置
*/
TraySetting()
{GlobalDictChoice := Ini.Read("BasicSetting","DictChoice")TransChoice := Ini.Read("BasicSetting","TransChoice")StartUpCheck := Ini.Read("BasicSetting","StartUp")Gui SettingGui:NewGui SettingGui:-MaximizeBox -MinimizeBoxGUi SettingGui:Font, s10, VerdanaGui SettingGui:Add, GroupBox, w375 h100, 基本设置GUi SettingGui:Add, Text, X20 Y35, 词典引擎Gui SettingGui:Add, DropDownList, X80 Y35 W70 vDictChoice AltSubmit Choose%DictChoice%, 海词|词霸|有道GUi  SettingGui:Add, Text,X20 Y70, 翻译引擎Gui SettingGui:Add, DropDownList, X80 Y70  W70 vTransChoice AltSubmit Choose%TransChoice%, 百度|谷歌|有道Gui SettingGui:Add, Checkbox, X200 Y35 vStartUpBtn Checked%StartUpCheck%, 开机自启动 Gui SettingGui:Add, GroupBox, X12 Y110 w375 h150, 高级设置GUi SettingGui:Add, Button, X80 Y268 W60 gSettingGuiOK, 确定GUi SettingGui:Add, Button, X160 Y268 W60 gSettingGuiCancel, 取消GUi SettingGui:Add, Button, X240 Y268 W60 gSettingGuiApply, 应用Gui SettingGui:Show, W400 H300 Center, 设置returnSettingGuiOK:
SettingGuiApply:
GUi SettingGui:Submit
Ini.Write("BasicSetting","StartUp",False)
Ini.Write("BasicSetting","DictChoice",DictChoice)
Ini.Write("BasicSetting","TransChoice",TransChoice)
SetStartup(StartUpBtn)
Ini.Write("BasicSetting","StartUp",StartUpBtn)
returnSettingGuiCancel:
Gui SettingGui:Destroy
return}
/*
设置开机自启动
*/
SetStartup(State)
{StratName := StrReplace(StrReplace(A_ScriptName,".ahk"),".exe")if(State){ RegRead, RegVar, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, %StratName%if(ErrorLevel = 1){RegWrite, REG_SZ, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, %StratName%, %A_ScriptFullPath%TrayTip,,已设置开机自启!,1,1}}else{RegRead, RegVar, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, %StratName%if(ErrorLevel = 0){RegDelete, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, %StratName%TrayTip,,已取消开机自启!,1,1}}return
}
/*
关于软件
*/
TrayAbout()
{MsgBox ,,关于,by 冷月风华!return
}
/*
退出软件
*/
TrayExit()
{ExitApp
}ShowWizard()
{if !(FileExist("config.ini")) {MsgBox ,,使用帮助,
(欢迎使用SmartTranslator翻译小助手!初次使用,先看一下使用方法吧!
一、选择文本后,使用默认快捷键win+c或长按右键进行查词和翻译。
二、软件查词\翻译完成后,左键文本可以用译文替换当前所选,右键文本可以复制译文。
)}
}
  • ② API接口处理类
#include WinHttpRequests.ahk
#Include <Basic>Class Dict
{Dict(wd := "hello"){DictDictionaryAPI := "https://apii.dict.cn/mini.php?q="DictUrl := DictDictionaryAPI . URLEncode(wd)TranslateRes := UrlDownloadToVar(DictUrl, "GET") if TranslateRes = -1 return "网络异常"RegExMatch(TranslateRes,"(?<=id=""e"">).*?(?=</div><br><div)",res)return StrReplace(res, "<br>", "`r`n")}Youdao(wd := "hello"){YoudaoDictionaryAPI := "https://dict.youdao.com/suggest?num=1&doctype=json&q="YoudaotUrl := YoudaoDictionaryAPI . URLEncode(wd)TranslateRes := UrlDownloadToVar(YoudaotUrl, "GET")if TranslateRes = -1 return "网络异常"RegExMatch(TranslateRes,"(?<=explain"":"").*?(?="",""entry)",res)s := RegExMatchAll(res,"\w+\.")for index,each in s{if index != 1{res := StrReplace(res, each, "`r`n" . each)}}res := StrReplace(res, "...")res:= StrReplace(res, "`r`n`r`n", "`r`n")return res}Ciba(wd := "hello"){;c := RegExMatch(wd, "[^\x00-\xff]+")CibaDictionaryAPI := "http://dict-co.iciba.com/search.php?word="CibaUrl := CibaDictionaryAPI . URLEncode(wd)TranslateRes := UrlDownloadToVar(CibaUrl, "GET")if TranslateRes = -1 return "网络异常"RegExMatch(TranslateRes,"(?<=<br><br>`n).*&nbsp;&nbsp;<br",res)res := StrReplace(res,"&nbsp;&nbsp;")res := StrReplace(res,"<br />","`n")return StrReplace(res,"<br","")}
}Class Trans
{Google(wd := "Hello World!"){wd := StrReplace(wd, "`r"), wd := StrReplace(wd, "`n")sl := RegExMatch(wd, "[^\x00-\xff]+") ? "zh-CN" : "en" ;查找汉字tl := (sl = "zh-CN") ? "en" : "zh-CN"GoogleTranslatorAPI := "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t"GoogleUrl := GoogleTranslatorAPI . "&sl=" . sl . "&tl=" . tl . "&q=" . URLEncode(wdTranslateRes := UrlDownloadToVar(GoogleUrl, "GET") if TranslateRes = -1 return "网络异常"TranslateRes := StrReplace(StrReplace(TranslateRes,"[[]],[[[",""), "[", "#")ResArray := RegExMatchAll(TranslateRes,"(?<=#"").*?(?=""`,"")")return  ArrayToString(ResArray," ")   }Youdao(wd := "Hello World!"){wd := StrReplace(wd, "`r"), wd := StrReplace(wd, "`n")YoudaoTranslatorAPI := "https://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i="YoudaoUrl := YoudaoTranslatorAPI . URLEncode(wd)TranslateRes := UrlDownloadToVar(YoudaoUrl, "GET")   if TranslateRes = -1 return "网络异常"ResArray := RegExMatchAll(TranslateRes,"(?<=tgt"":"").*?(?=""})")res := ArrayToString(ResArray," ")return StrReplace(res, "\u201D")}Baidu(wd := "hello world!"){wd := StrReplace(wd, "`r"), wd := StrReplace(wd, "`n")BaiduTranslatorAPI := "https://fanyi.baidu.com/transapi?&source=txt"from := RegExMatch(wd, "[^\x00-\xff]+") ? "zh" : "en" ;查找汉字to := (from = "en") ? "zh" : "en"query := URLEncode(wd)BaiduUrl := BaiduTranslatorAPI . "&from=" . from . "&to=" . to . "&query=" . queryTranslateRes := UrlDownloadToVar(BaiduUrl, "GET")    if TranslateRes = -1 return "网络异常"RegExMatch(TranslateRes,"(?<=data).*?(?=src)", JsonData)ResArray := RegExMatchAll(JsonData,"(?<=dst"":"").*?(?="","")")res := ArrayToString(ResArray," ")return (from = "zh") ? res : Encoding.UnicodeToCN(res)}Baidu_(wd := "hello world!"){BaiduTranslatorAPI := "https://fanyi.baidu.com/v2transapi?transtype=realtime&simple_means_flag=3&token=11354f5ab91beb1035869f9fe75e11bf&domain=common"from := RegExMatch(wd, "[^\x00-\xff]+") ? "zh" : "en" ;查找汉字to := (from = "en") ? "zh" : "en"query := URLEncode(wd)Sign := RunJS.BaiduJS(wd)BaiduUrl := BaiduTranslatorAPI . "&from=" . from . "&to=" . to . "&query=" . query . "&sign=" . SignTranslateRes := UrlDownloadToVar(BaiduUrl, "GET")   if TranslateRes = -1return "网络异常"RegExMatch(TranslateRes,"(?<=data).*?(?=from)", JsonData)ResArray := RegExMatchAll(JsonData,"(?<=dst"":"").*?(?="","")")res := ArrayToString(ResArray," ")return (from = "zh") ? res : Encoding.UnicodeToUTF8(res)}}
  • ③网页请求类
/*
简单数组转字符串
*/
ArrayToString(array,Delimiters := ",")
{for index,each in array{if(index = array.Count()){res .= eachContinue}res .= each . Delimiters}return res
}
/*
log日志函数
*/
PrintLog(logstr)
{FileAppend, %logstr%, *, UTF-8-RAW
}
/*
url参数配置
*/
FormatData(Array)
{   var := Truedata := ""if IsObject(Array){for each,value in Array{Data .= "&" . each . "=" . value}return data}return data
}
/*
下载网页内容到变量
https://docs.microsoft.com/zh-cn/windows/win32/winhttp/iwinhttprequest-interface
*/
UrlDownloadToVar(url,method := "GET", touch := 0)   ;网页爬取
{UA := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"Cookie := "BIDUPSID=810580A9A87034829F016DC79C4FAE90; PSTM=1629958394; BAIDUID=B83FE1AF5CECBA53EA2FF0545752EEBF:FG=1; __yjs_duid=1_eb6e98ca526fec92ed2a9ab430a438521629958877719; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BDUSS=hzMHR4bGNRelN4NTZlUmhhM3RHeEFYWERiQlBpWml2WTk4NGI3MzR2cGN4SEJoSVFBQUFBJCQAAAAAAAAAAAEAAABlG~zCaW5vdmlzaW9uNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFw3SWFcN0lhT3; BDUSS_BFESS=hzMHR4bGNRelN4NTZlUmhhM3RHeEFYWERiQlBpWml2WTk4NGI3MzR2cGN4SEJoSVFBQUFBJCQAAAAAAAAAAAEAAABlG~zCaW5vdmlzaW9uNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFw3SWFcN0lhT3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_PSSID=31660_26350; delPer=0; BAIDUID_BFESS=B83FE1AF5CECBA53EA2FF0545752EEBF:FG=1; BDRCVFR[NPt2Vg_wYt_]=mk3SLVN4HKm; PSINO=5; BA_HECTOR=8k8g002g850g01ahpj1gpn0p50r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1637509857,1637511433,1637576328,1637581609; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1637581609"whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")Try {whr.Open(method, url, true)whr.SetRequestHeader("User-Agent",UA)whr.SetRequestHeader("Cookie",Cookie)whr.Send()a := whr.WaitForResponse(1)if a = 0{return -1}if (touch){html := whr.ResponseTextFileEncoding, UTF-8-RAWfile := FileOpen("HTML.html", "w")file.Write(html)file.Close()}return whr.ResponseText}Catch e{return -1}}
/*
正则匹配进阶版
*/
RegExMatchAll(Haystack, NeedleRegEx)
{res := Array()StartPos := 1while(FoundPos := RegExMatch(Haystack,NeedleRegEx,s,StartPos)){StartPos := FoundPos + StrLen(s)res.Push(s)}return res
}
/*
URLEncode函数
by dbgba @ https://www.autoahk.com/archives/35086
https://gitee.com/barbarla/AHK_Lib/blob/master/Encode.ahk
*/
URLEncode(str, encoding := "UTF-8")
{VarSetCapacity(var, StrPut(str, encoding))StrPut(str, &var, encoding)While code := NumGet(Var, A_Index - 1, "UChar") {bool := (code > 0x7F || code < 0x30 || code = 0x3D)UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)} Return UrlStr
}/*
Hash() v0.37 by SKAN on D444/D445 @ tiny.cc/hashit
https://www.autohotkey.com/boards/viewtopic.php?f=6&t=88975&p=392052&hilit=tiny.cc%2Fhashit#p392052
哈希校验函数
*/
Hash(Options, ByRef Var, nBytes:="",lowe := true)
{ LocalHA := {"ALG":"SHA256","BAS":0, "UPP":1, "ENC":"UTF-8"}Loop, Parse, % Format("{:U}", Options), %A_Space%, +A := StrSplit(A_LoopField, ":", "+"), HA[ SubStr(A[1], 1, 3) ] := A[2]HA.X := ( HA.ENC="UTF-16" ? 2 : 1)OK1 := { "SHA1":1, "SHA256":1, "SHA384":1, "SHA512":1, "MD2":1, "MD4":1, "MD5":1 }[ HA.ALG ]OK2 := { "CP0":1, "UTF-8":1, "UTF-16":1}[ HA.ENC ]NaN := ( StrLen(nBytes) And (nBytes != Round(nBytes)) ), lVar := StrLen(Var)pNum := ( lVar And [var].GetCapacity(1)="" And (Var = Abs(Round(Var))) ), nVar := VarSetCapacity(Var)If ( OK1="" Or OK2="" Or NaN=1 Or lVar<1 Or (pNum=1 And nBytes<1) Or (pNum=0 And nVar<nBytes))Return ( 0, ErrorLevel := OK1="" ? "Algorithm not known.`n=> MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512`nDefault: SHA256": OK2="" ? "Codepage incorrect.`n=> CP0 UTF-16 UTF-8`nDefault: UTF-8": NaN=1 ? "nBytes in incorrect format": lVar<1 ? "Var is empty. Nothing to hash.": (pNum=1 And nBytes<1) ? "Pointer requires nBytes greater than 0.": (pNum=0 And nVar<nBytes) ? "Var's capacity is lesser than nBytes." : "" )hBcrypt := DllCall("Kernel32.dll\LoadLibrary", "Str","Bcrypt.dll", "Ptr")DllCall("Bcrypt.dll\BCryptOpenAlgorithmProvider", "PtrP",hAlg:=0, "WStr",HA.ALG, "Ptr",0, "Int",0, "UInt")DllCall("Bcrypt.dll\BCryptCreateHash", "Ptr",hAlg, "PtrP",hHash:=0, "Ptr", 0, "Int", 0, "Ptr",0, "Int",0, "Int", 0)nLen := 0, FileLen := File := rBytes := sStr := nErr := ""If ( nBytes!="" And (pBuf:=pNum ? Var+0 : &Var) ){If ( nBytes<=0 )nBytes := StrPut(Var, HA.ENC), VarSetCapacity(sStr, nBytes * HA.X), nBytes := ( StrPut(Var, pBuf := &sStr, nBytes, HA.ENC) - 1 ) * HA.XnErr := DllCall("Bcrypt.dll\BCryptHashData", "Ptr",hHash, "Ptr",pBuf, "Int",nBytes, "Int", 0, "UInt")} Else {File := FileOpen(Var, "r -rwd")If ( (FileLen := File.Length) And VarSetCapacity(Bin, 65536) )LoopIf ( rBytes := File.RawRead(&Bin, 65536) )nErr := DllCall("Bcrypt.dll\BCryptHashData", "Ptr",hHash, "Ptr",&Bin, "Int",rBytes, "Int", 0, "Uint")Until ( nErr Or File.AtEOF Or !rBytes )File := ( FileLen="" ? 0 : File.Close() )}DllCall("Bcrypt.dll\BCryptGetProperty", "Ptr",hAlg, "WStr", "HashDigestLength", "UIntP",nLen, "Int",4, "PtrP",0, "Int",0)VarSetCapacity(Hash, nLen)DllCall("Bcrypt.dll\BCryptFinishHash", "Ptr",hHash, "Ptr",&Hash, "Int",nLen, "Int", 0)DllCall("Bcrypt.dll\BCryptDestroyHash", "Ptr",hHash)DllCall("Bcrypt.dll\BCryptCloseAlgorithmProvider", "Ptr",hAlg, "Int",0)DllCall("Kernel32.dll\FreeLibrary", "Ptr",hBCrypt)If ( nErr=0 )VarSetCapacity(sStr, 260, 0), nFlags := HA.BAS ? 0x40000001 : 0x4000000C, DllCall("Crypt32\CryptBinaryToString", "Ptr",&Hash, "Int",nLen, "Int",nFlags, "Str",sStr, "UIntP",130), sStr := ( nFlags=0x4000000C And HA.UPP ? Format("{:U}", sStr) : sStr )if lowe{StringLower, md5, sStrreturn md5}Return ( sStr, ErrorLevel := File=0 ? ( FileExist(Var) ? "Open file error. File in use." : "File does not exist." ): FileLen=0 ? "Zero byte file. Nothing to hash.": (FileLen & rBytes=0) ? "Read file error.": nErr ? Format("Bcrypt error. 0x{:08X}", nErr): nErr="" ? "Unknown error." : "" )
}/*
进制转换函数
ToBase / FromBase by Lazslo @ http://www.autohotkey.com/forum/post-276241.html#276241
*/
ToBase(n,b){return (n < b ? "" : ToBase(n//b,b)) . ((d:=Mod(n,b)) < 10 ? d : Chr(d+55))
}
  • ④附加操作类
;https://github.com/ahkscript/libcrypt.ahk
;基础类
Class Basic
{LIB(Name := "Gitte"){if (Name = "Gitte"){run https://gitee.com/barbarla/AHK_Lib/tree/master}}
}
;用于调试的打印输出
Class Console
{Log(str := "-1", mode := "stdout"){if(mode = "Stdout"){FileAppend, %str%, *, UTF-8-RAW}else if(mode = "Stderr"){FileAppend, %str%, **, UTF-8-RAW}else if(mode = "File"){FileAppend, %str% . `n, %A_ScriptDir%\ConsoleLog.log, UTF-8-RAW}else if(mode = "Enter"){FileAppend, %str%`n, *, UTF-8-RAW}else{Msgbox,, Console.Log, Parameter error!}return}};简化ini文件的读写操作
Class Ini
{Write(Section, Key, Value, fname := "config.ini"){IniWrite, %Value%, %fname%, %Section%, %Key%return this}Read(Section, Key,  fname := "config.ini"){IniRead, IniVar, %fname%, %Section%, %Key%return IniVar}Delete(Section, Key,  fname := "config.ini"){if key is spaceIniDelete, %fname%, %Section%elseIniDelete, %fname%, %Section%, %Key%return}
};哈希计算
;https://www.autohotkey.com/boards/viewtopic.php?f=6&t=88975
Class Hash
{MD5(ByRef Var){return this.Hash("alg:MD5",Var,-1)}Hash(Options, ByRef Var, nBytes:="") {LocalHA := {"ALG":"SHA256","BAS":0, "UPP":1, "ENC":"UTF-8"}Loop, Parse, % Format("{:U}", Options), %A_Space%, +A := StrSplit(A_LoopField, ":", "+"), HA[ SubStr(A[1], 1, 3) ] := A[2]HA.X := ( HA.ENC="UTF-16" ? 2 : 1)OK1  := { "SHA1":1, "SHA256":1, "SHA384":1, "SHA512":1, "MD2":1, "MD4":1, "MD5":1 }[ HA.ALG ]OK2  := { "CP0":1, "UTF-8":1, "UTF-16":1}[ HA.ENC ]NaN  := ( StrLen(nBytes) And (nBytes != Round(nBytes)) ),                    lVar := StrLen(Var)pNum := ( lVar And [var].GetCapacity(1)="" And (Var = Abs(Round(Var))) ),    nVar := VarSetCapacity(Var)If ( OK1="" Or OK2="" Or NaN=1 Or lVar<1 Or (pNum=1 And nBytes<1) Or (pNum=0 And nVar<nBytes))Return ( 0, ErrorLevel  := OK1="" ? "Algorithm not known.`n=> MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512`nDefault: SHA256":  OK2="" ? "Codepage incorrect.`n=> CP0 UTF-16 UTF-8`nDefault: UTF-8":  NaN=1  ? "nBytes in incorrect format":  lVar<1 ? "Var is empty. Nothing to hash.": (pNum=1 And nBytes<1) ? "Pointer requires nBytes greater than 0.": (pNum=0 And nVar<nBytes) ? "Var's capacity is lesser than nBytes." : "" )hBcrypt := DllCall("Kernel32.dll\LoadLibrary", "Str","Bcrypt.dll", "Ptr")DllCall("Bcrypt.dll\BCryptOpenAlgorithmProvider", "PtrP",hAlg:=0, "WStr",HA.ALG, "Ptr",0, "Int",0, "UInt")DllCall("Bcrypt.dll\BCryptCreateHash", "Ptr",hAlg, "PtrP",hHash:=0, "Ptr", 0, "Int", 0, "Ptr",0, "Int",0, "Int", 0)nLen := 0, FileLen := File := rBytes := sStr := nErr := ""If ( nBytes!="" And (pBuf:=pNum ? Var+0 : &Var) ){If ( nBytes<=0  )nBytes := StrPut(Var, HA.ENC), VarSetCapacity(sStr, nBytes * HA.X), nBytes := ( StrPut(Var, pBuf := &sStr, nBytes, HA.ENC) - 1 ) * HA.XnErr := DllCall("Bcrypt.dll\BCryptHashData", "Ptr",hHash, "Ptr",pBuf, "Int",nBytes, "Int", 0, "UInt")} Else {File := FileOpen(Var, "r -rwd")If  ( (FileLen := File.Length) And VarSetCapacity(Bin, 65536) )LoopIf ( rBytes := File.RawRead(&Bin, 65536) )nErr   := DllCall("Bcrypt.dll\BCryptHashData", "Ptr",hHash, "Ptr",&Bin, "Int",rBytes, "Int", 0, "Uint")Until ( nErr Or File.AtEOF Or !rBytes )File := ( FileLen="" ? 0 : File.Close() )}DllCall("Bcrypt.dll\BCryptGetProperty", "Ptr",hAlg, "WStr", "HashDigestLength", "UIntP",nLen, "Int",4, "PtrP",0, "Int",0)VarSetCapacity(Hash, nLen)DllCall("Bcrypt.dll\BCryptFinishHash", "Ptr",hHash, "Ptr",&Hash, "Int",nLen, "Int", 0)DllCall("Bcrypt.dll\BCryptDestroyHash", "Ptr",hHash)DllCall("Bcrypt.dll\BCryptCloseAlgorithmProvider", "Ptr",hAlg, "Int",0)DllCall("Kernel32.dll\FreeLibrary", "Ptr",hBCrypt)If ( nErr=0 )VarSetCapacity(sStr, 260, 0),  nFlags := HA.BAS ? 0x40000001 : 0x4000000C, DllCall("Crypt32\CryptBinaryToString", "Ptr",&Hash, "Int",nLen, "Int",nFlags, "Str",sStr, "UIntP",130), sStr := ( nFlags=0x4000000C And HA.UPP ? Format("{:U}", sStr) : sStr )Return ( sStr, ErrorLevel := File=0    ? ( FileExist(Var) ? "Open file error. File in use." : "File does not exist." ): FileLen=0 ? "Zero byte file. Nothing to hash.": (FileLen & rBytes=0) ? "Read file error.": nErr ? Format("Bcrypt error. 0x{:08X}", nErr): nErr="" ? "Unknown error." : "" )}
};自用正则表达式
;https://www.freesion.com/article/4025847450/
class RegExp
{Match(Haystack, NeedleRegEx){MatchRes := []FoundPos := 1Match := {Len: {0: 0}}SubMode := "O)"NeedleRegEx := SubMode . NeedleRegExWhile (FoundPos := RegExMatch(Haystack, NeedleRegEx, Match, FoundPos + Match.Len[0])){MatchRes.Push(Match.Value(0))}return MatchRes}Replace(Haystack, NeedleRegEx, Replacement := "", Limit := -1){RegExReplace(Haystack, NeedleRegEx, Replacement, Limit)}MatchChinese(Haystack){MatchRes := []FoundPos := 1Match := {Len: {0: 0}}NeedleRegEx := "O)[^\x00-\xff]+"While (FoundPos := RegExMatch(Haystack, NeedleRegEx, Match, FoundPos + Match.Len[0])){MatchRes.Push(Match.Value(0))}return MatchRes}MatchWord(Haystack){MatchRes := []FoundPos := 1Match := {Len: {0: 0}}NeedleRegEx := "O)[a-zA-Z]+"While (FoundPos := RegExMatch(Haystack, NeedleRegEx, Match, FoundPos + Match.Len[0])){MatchRes.Push(Match.Value(0))}return MatchRes}
}Class Encoding
{;https://www.autohotkey.com/boards/viewtopic.php?f=28&t=3897;中文转UnicodeCNToUnicode(str){OldFormat := A_FormatIntegerSetFormat, Integer, HexLoop, Parse, strres .= "\u" . SubStr( Asc(A_LoopField), 3 )SetFormat, Integer, %OldFormat%Return res};https://www.autohotkey.com/boards/viewtopic.php?f=28&t=3897;Unicode转中文UnicodeToCN(str){Loop, Parse, str, u, \res .= Chr("0x" . A_LoopField)return res}/*URLEncode函数by dbgba @ https://www.autoahk.com/archives/35086https://gitee.com/barbarla/AHK_Lib/blob/master/Encode.ahk*/URLEncode(str, encoding := "UTF-8") {VarSetCapacity(var, StrPut(str, encoding))StrPut(str, &var, encoding)While code := NumGet(Var, A_Index - 1, "UChar") {bool := (code > 0x7F || code < 0x30 || code = 0x3D)UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)} Return UrlStr}
}Class WinHttpRequests
{static DefaultHeader :=   {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36","Cookie" : "BIDUPSID=810580A9A87034829F016DC79C4FAE90; PSTM=1629958394; BAIDUID=B83FE1AF5CECBA53EA2FF0545752EEBF:FG=1; __yjs_duid=1_eb6e98ca526fec92ed2a9ab430a438521629958877719; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BDUSS=hzMHR4bGNRelN4NTZlUmhhM3RHeEFYWERiQlBpWml2WTk4NGI3MzR2cGN4SEJoSVFBQUFBJCQAAAAAAAAAAAEAAABlG~zCaW5vdmlzaW9uNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFw3SWFcN0lhT3; BDUSS_BFESS=hzMHR4bGNRelN4NTZlUmhhM3RHeEFYWERiQlBpWml2WTk4NGI3MzR2cGN4SEJoSVFBQUFBJCQAAAAAAAAAAAEAAABlG~zCaW5vdmlzaW9uNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFw3SWFcN0lhT3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_PSSID=31660_26350; delPer=0; BAIDUID_BFESS=B83FE1AF5CECBA53EA2FF0545752EEBF:FG=1; BDRCVFR[NPt2Vg_wYt_]=mk3SLVN4HKm; PSINO=5; BA_HECTOR=8k8g002g850g01ahpj1gpn0p50r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1637509857,1637511433,1637576328,1637581609; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1637581609"}static HTTPREQUEST_PROXYSETTING_PROXY := 2static FullUrl := "https://www.autohotkey.com/boards"Post(Url := "https://www.autohotkey.com/boards", FormData := "", Headers := "", SaveHtml := "", Proxy := "", Asyns := True, ResponseTimeout := 1){Try{whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")for k,v in FormDataUrl := Url . "&" . k . "=" . vthis.FullUrl := Urlwhr.Open("POST", Url, Asyns)if (Headers = ""){for k,v in this.DefaultHeaderwhr.SetRequestHeader(k,v)}else{for k,v in Headerswhr.SetRequestHeader(k,v)}if (Proxy != "")whr.SetProxy(this.HTTPREQUEST_PROXYSETTING_PROXY,Proxy)whr.Send()State := whr.WaitForResponse(ResponseTimeout)    if (State = 0)return -1if (SaveHtml != ""){Result := whr.ResponseTextFileEncoding, UTF-8-RAWSaveHtml := SaveHtml . ".html"file := FileOpen(SaveHtml, "w")file.Write(Result)file.Close()}return whr.ResponseText}catch err{Throw, err}}Get(Url := "https://www.autohotkey.com/boards", FormData := "", Headers := "", SaveHtml := "", Proxy := "", Asyns := True, ResponseTimeout := 1){Try{whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")for k,v in FormDataUrl := Url . "&" . k . "=" . vthis.FullUrl := Urlwhr.Open("Get", Url, Asyns)if (Headers = ""){for k,v in this.DefaultHeaderwhr.SetRequestHeader(k,v)}else{for k,v in Headerswhr.SetRequestHeader(k,v)}if (Proxy != "")whr.SetProxy(this.HTTPREQUEST_PROXYSETTING_PROXY,Proxy)whr.Send()State := whr.WaitForResponse(ResponseTimeout)  if (State = 0)return -1if (SaveHtml != ""){Result := whr.ResponseTextFileEncoding, UTF-8-RAWSaveHtml := SaveHtml . ".html"file := FileOpen(SaveHtml, "w")file.Write(Result)file.Close()}return whr.ResponseText}catch err{Throw, err}}GetCurrentFullUrl(){return this.FullUrl}
}

6.软件及代码下载

蓝奏云:点击下载 密码:0000
Github: 待添加

基于AutoHotkey的智能翻译器相关推荐

  1. 原创 | 基于AI的智能急性颅内出血类型检测

    作者:杨毅远 本文约6400字,建议阅读10分钟 本文介绍了通过AI技术检测急性颅内出血类型方面的知识. 颅内出血(颅骨内出血)是医疗领域严重的健康问题,需要快速且经常进行密集的医学治疗.在美国,颅内 ...

  2. 李飞飞高徒:斯坦福如何打造基于视觉的智能医院?

    作者:Albert Haque.Michelle Guo 来源:机器之心 自 2009 年担任斯坦福人工智能实验室和视觉实验室的负责人,李飞飞在推动计算机视觉方面研究的同时,还密切关注 AI 医疗的发 ...

  3. 基于RT106x电磁智能车AI算法

      今天,来自NXP公司的宋岩和张岩向我展示和讨论了他们使用部署在智能车单片机中上的人工神经网络控制电磁车模运行的实验情况情况.下面的视频中,车模的方向控制是由单片机中的神经网络模型给出了.车模运行速 ...

  4. 单片机声光电子琴程序流程图_基于单片机的智能家居控制系统毕业设计

    次毕业设计主要包括硬件端和软件端,硬件端功能如下: 使用 DS1302 模块产生时钟数据并实现时间和日历实时显示: 使用 DS18B20 模块检测周围环境温度并实时显示: 使用烟雾和光敏传感器模块对房 ...

  5. 智能手环功能模块设计_基于STM32实现智能手环设计

    龙源期刊网 http://www.qikan.com.cn 基于 STM32 实现智能手环设计 作者:付海生 陈婷婷 韩百科 涂曾兵 来源:<科学导报 · 学术> 2017 年第 10 期 ...

  6. 【CF 应用开发大赛】JEECG 基于代码生成器J2EE智能开发框架

    为什么80%的码农都做不了架构师?>>>    应用名称:JEECG(J2EE Code Generation) 基于代码生成器J2EE智能开发框架 应用URL地址:http://j ...

  7. java调试生命周期,一种基于JAVA的智能合约生命周期的管理方法与流程

    本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约生命周期的管理方法. 背景技术: 区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交 ...

  8. 单片机c语言慧尾灯编码,(参考)基于单片机的智能尾灯开发文档.doc

    基于单片机的智能尾灯的设计 摘要 本设计是基于单片机的自行车智能尾灯控制器,该设计为STC89S52单片机做为主控芯片的自行车尾灯控制电路的设计方法,用发光二极管模拟自行车尾灯,按键开关作为转弯等控制 ...

  9. 微信扫一扫背后的秘密:基于运动估计的智能传图算法

    一.项目背景 图1.1 常见的图像识别应用 本项目提出的图像算法主要解决如下问题:在移动设备实时获取图像的过程中,让算法自动决定何时进行图片发送请求.何时中断发送请求,并将此策略用在实时的图像检索应用 ...

最新文章

  1. upstream--负载
  2. python之模块csv之CSV文件的写入(按行写入)
  3. 版本信息文件、虚拟环境创建
  4. Python 3.3.2 中文版
  5. [Python_6] Python 配置 MySQL 访问
  6. django框架 day05
  7. GraphQL —— 标量类型
  8. 近67万辆奔驰汽车被召回,涉及C级、SLC级等车型
  9. oracle 下和 db2的syscat 对应的,oracle db2命令对比(整理中)
  10. html 块级注释,HTML blockquote 标签 | 教程 | codingbefore
  11. webstorm怎样查找历史记录
  12. 简介 - 有哪些冗余技术?我应该用哪个,注意什么?
  13. SSM整合案例分析(详解)
  14. KNN和K-Means
  15. axure转化成代码_​教大家如何查看Axure页面的代码
  16. Mixly 数码管时钟
  17. python具体学什么-python主要用于什么开发
  18. Vue table 点击按钮展开折叠面板
  19. VCS+Verdi ubuntu18.04安装教程
  20. Android WebView清除缓存,总有一个方法适合你

热门文章

  1. 荐书丨《进化心理学》:刘耕宏、王心凌背后的魔力之谜
  2. mac地址储存在计算机的内存,mac地址通常存在计算机的
  3. 90后准程序猿写给前辈们的一封信
  4. 【水位传感器与 Arduino 连接测量水位】
  5. 超全总结 | 阿里电商故障治理和故障演练实践
  6. 内存泄漏试试AScan
  7. 截流式合流制设计流量计算_[2018年最新整理]合流制排水管网设计与计算.ppt
  8. 大数据hbase nosql数据库
  9. 【5. ROS机器人的运动控制】
  10. fluent中的压力