ahk系列——ahk_v2实现win10任意界面ocr

news2024/11/25 20:42:10

前言:

   不依赖外部api接口,界面简洁,翻译快速,操作简单, 有网络就能用 、还可以把ocr结果非中文翻译成中文、同样可以识别中英日韩等60多个国家语言并翻译成中文,十分的nice 

1、所需环境

  • windows10及其以上环境最佳,其它windows系统也可以没有试过
  • autohotkey v2版本运行(有exe可以忽略)
  • 连接到互联网
  • snipaste截图工具  

2、使用方式

    下载并安装snipaste,

    然后运行该脚本,按截图按键进行截图,我的ctrl+alt+a,默认应该不是这个、

    然后再截图界面按下ctrl+1就会执行ocr操作、

    同样ESC:退出ocr界面 

3、效果演示

4、代码

#SingleInstance force
Persistent true ;阻止脚本自动退出
FileEncoding "UTF-8" ;读写文件编码设置
CoordMode "Mouse","Screen"
OnMessage 0x0201,WM_LBUTTONDOWN
OnMessage 0x100 ,KEYBOARD_MESSAGE_CALLBACK ;键盘事件
;ctrl+1执行选中搜狗翻译,搜狗ocr操作
onStartup()
OnClipboardChange ClipChanged ;监听剪切板
onExit onExitApp ;退出时执行


;ctrl+1执行选中搜狗翻译,搜狗ocr操作
#MaxThreadsPerHotkey 10
^1::{
   try{
       if not ak.ConnectedToInternet(){ ;互联网没有连接
          throw Error("没有互联网连接")
       }
       if not winActive(sogouocr.snipaste_title)
          return
       MouseGetPos &xpos, &ypos
       Tn4:=WinExist(loadgif.loadGuiTitle)?loadgif.loadGui.Destroy():"" ;开始删除动画
       Tn3:=WinExist(sogouocr.html_title)?sogouocr.ocrgui.Destroy():"" ;开始删除ocr gui
       setTimer(()=>loadgif.show(xpos+5,ypos+5),-1)      ;开始异步加载动画
       setTimer(()=>loadgif.loadGui.Destroy(),-4000)     ;开始4s后关闭动画
       sogouocr.showOcrResult()
   }catch as e{
       msg:=e
   }finally{
       T5:=loadgif.loadGui?loadgif.loadGui.Destroy():"" ;结束显示结果后关闭动画
   }
}

;初始化值
onStartup(socketon:=1)
 {
   setTimer ()=>sogouocr.sendGetRequest(1),-1 ;初始化ocr请求
   setTimer ()=>loadgif.initData() ,-1 ;初始loadgif
   if FileExist(sogouocr.catcheguiHtmlPath) ;删除ocr的gui缓存html文件,重新获取html并缓存
       fileDelete(sogouocr.catcheguiHtmlPath)
   imageutil.init() ;初始化gdi+
   return ;
}
;清除缓存
onExitApp(ExitReason, ExitCode)
{
  if FileExist(loadgif.loadhtmlPath) ;清除tmp中文件,在脚本启动时重新生成
      fileDelete(loadgif.loadhtmlPath)
  imageutil.close() ;关闭gdi+
  return ;
}

;移动选框GUI
WM_LBUTTONDOWN(wParam, lParam, msg, hwnd){
    OnMessage 0x0201,WM_LBUTTONDOWN
    if(A_Cursor="Arrow")
        PostMessage  0xA1, 2
}
;响应键盘事件
KEYBOARD_MESSAGE_CALLBACK(wParam, lParam, msg, hwnd)
{
   if((wparam=13 || wparam=27) and sogouocr.ocrGui){ ;ocr窗口响应回车事件和esc事件
         sogouocr.ocrGui.destroy() ;ocr
    }
}
;监听剪切板
ClipChanged(DataType)
{
    ;DataType 0:什么内容没有,1 txt内容,2:非文本的内容例如图片
    ;1 如果剪贴板中仅包含能以文本形式表示的内容 (这里也包含了从资源管理器窗口 复制的文件);
    ak.clipdataType:=DataType
}

;搜狗ocr复制原文
srcCopyButton1_OnClick()
{
;    msgBox % SoGouOcr.result_source " :" SoGouOcr.result_trans
    A_Clipboard:=sogouocr.contentObj.contents
    sogouocr.ocrgui.destroy()
}
;搜狗ocr复制翻译后
srcCopyButton2_OnClick()
{
    A_Clipboard:=sogouocr.contentObj.trans
    sogouocr.ocrgui.destroy()
}
;搜狗ocr关闭窗口事件
exitBtn1_OnClick()
{
    sogouocr.ocrgui.destroy()
}

;获取图片或者ico等的base64编码
getIco(icoName)
{
    static obj:={
       ;加载动画
       loadGif:"
               ( LTrim Join
                 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               )"
    }
    return obj.%icoName%
}

class sogouocr
{
    static url1:="https://fanyi.sogou.com/" ;搜狗主页 ,获取带有SNUID相关cookie
    static url2:="https://fanyi.sogou.com/picture" ;搜狗图片识别网页 ,获取uuid
    static url3:="https://pb.sogou.com/cl.gif?" ;打开文件会发送一个get请求 ,获取带有SNUID相关cookie
    static url4:="https://fanyi.sogou.com/api/transpc/picture/upload" ;上传文件接口,需要携带 snuid和FQV相关cookie
    static url5:="https://fanyi.sogou.com/picture" ;界面显示所需要的html
    static boundary := "----WebKitFormBoundaryaEHpMn3lywBtjPfE" ;formData边界
    static userAgent:="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
    static header:="" ;访问url产生的请求头信息包括cookie
    static uuid:="" ;方位url2返回的请求头中的uuid
    static snipaste_title:="Snipper - Snipaste"
    static html_title:="ahk_sogouocr_result_v1"
    static html_zoom:=0.7 ;网页缩放
    static font_size:=25 ;设置字体大小
    static html_top_color:="#0af59b" ;顶部边框颜色
    static pic_min_w:=40 ;图片最小允许宽度,小于这高度就会按照pic_scale放大
    static pic_min_h:=30 ;图片最小允许高度,小于这高度就会按照pic_scale放大
    static pic_scale:=2.5 ; 图片缩放比例
    static gui_w:=500 ;没有缩放之前的gui大小
    static screen_gap:=5 ;设置显示与边框的位置间隙
    static catcheguiHtmlPath:=A_temp  . "\ahkocrgui.catche.delete.html" ;缓存ocr渲染
    static catche_uuid:="b32a8d43-c01b-c3dc-1313-82fa0ddf0457-" . Random(1,10000) ;用于ocr的html页面缓存数据
    static ocrgui:="" ;ocr的gui
    static contentObj:="" ;翻译返回的json结果
    static req := comObject("WinHttp.WinHttpRequest.5.1") ;请求对象
    static xbuttonpicPath:="" ;快捷ocr保存图片所在位置

    ;剪切板中获取png图片并且恢复png
    static showOcrResult()
    {
       path:=this.capturePic() ;截图并保存到临时文件 大概100ms左右
       contentObj:=this.sendallRequest(path) ;发送请求并获取json数据,230ms左右
       this.contentObj:=contentObj
       this.showocrGui(contentObj)   ;渲染json数据到gui中
    }
    static capturePic()
    {
       if((tmp:=ak.clipdataType)!=2) ;非图片时才恢复数据
            clipboard_save:=ClipboardAll()
       A_Clipboard:="" ,placeholder:="===========♜==========="
       ControlSend "^c", ,this.snipaste_title ;发送ctrl+c
       if not clipwait(3,1){ ;1任意类型
           T3:=tmp==2?(A_Clipboard:=placeholder):(A_Clipboard:=clipboard_save)  ;恢复数据
           throw Error("等待剪切板超时")
       }
       path:=Format("{1}\{2}-{3}-{4}_{5}-{6}-{7}_ocr.png",A_Temp,A_YYYY,A_MM,A_DD,A_Hour,A_Min,A_Sec)
;       saveflag:=ak.savepic(path,this.pic_min_w,this.pic_min_h,this.pic_scale) ;用powershell方式保存图片,慢!
       imageutil.saveclip(path,this.pic_min_w,this.pic_min_h,this.pic_scale)
       T3:=tmp==2?(A_Clipboard:=placeholder):(A_Clipboard:=clipboard_save)  ;恢复数据
       return path
    }
    ;发送所有请求,并缓存cookie ,会返回一个json
    static sendallRequest(pngpath)
    {
;        req.SetProxy(2, "127.0.0.1:8888") ;设置fiddler抓包服务器
        T1:= not this.header?this.sendGetRequest():""
        json:=this.sendPostRequest(pngpath) ;大概170ms左右
        contentObj:=this.dealResult(json)
        return contentObj
    }
    ;显示ocrgui页面,添加gui并渲染html,传入json数据
    static showocrGui(contentObj)
    {
         page:=this.getGuiHtml(contentObj) ;获取渲染页面
         Tn3:=winActive(sogouocr.html_title)?sogouocr.ocrgui.Destroy():"" ;删除之前ocr gui
         this.ocrgui:=ocrGui:=Gui("+LastFound +AlwaysOnTop -Caption +ToolWindow",this.html_title) ;添加gui并渲染html
         WB := ocrGui.Add("ActiveX",Format( "x0 y0 w{1} h{2}" ,this.gui_w*this.html_zoom,1080),"Shell.Explorer").Value
         ak.display(WB,page)  ;展示页面
         div_h:=WB.document.getElementById("mainDiv").offsetHeight ;获取当前div高度
         srcBtn:= WB.document.getElementById("src-clipboard") ;复制【源数据】按钮
         tranBtn := WB.document.getElementById("target-clipboard") ;复制【翻译数据】按钮
         exitBtn1 := WB.document.getElementById("exitBtn1") ;退出【X】按钮
         srcBtn.onclick:=(()=>srcCopyButton1_OnClick())
         tranBtn.onclick:=(()=>srcCopyButton2_OnClick())
         exitBtn1.onclick:=(()=>exitBtn1_OnClick())
         mainDivW:=this.gui_w*this.html_zoom
         mainDivH:=div_h*this.html_zoom
         MouseGetPos &x, &y                ;获取鼠标位置
         ak.dealshowGui(x,y,mainDivW,mainDivH,&newX,&newY) ;重新计算坐标位置
         ocrGui.Show(Format("x{1} y{2} w{3} h{4}",newX,newY,mainDivW,mainDivH))
         ak.frameShadow(ocrGui.hwnd ) ;窗口阴影
    }
    ;请求url5,获取渲染页面所需要的html ,传入处理后的json结果 ,可以缓存页面
    static getGuiHtml(contentObj)
    {
       ;判断缓存是否存在
       if not fileExist(this.catcheguiHtmlPath){
          static req := ComObject("WinHttp.WinHttpRequest.5.1")
          req.open("GET",this.url5 ,true)  ;必须有http:// ,true 异步,false 同步(默认)
          req.Send()
          req.WaitForResponse()
          result := req.ResponseText
          start_element:='<!--[if lte IE 9]> <script>' ,end_element:='</div><script>' ;开头结尾标记
          result:=StrReplace(result,'"//','"https://')
          start_pos:=instr(result,start_element,1,1)     ;找到body开头
          if(!start_pos)
              throw Error("在html中未找到开头元素:" . start_element)
          end_pos:= instr(result,end_element,1,start_pos) ;参数依次是1.目标字符,2.要匹配的字符,3.是否大小写消息敏感,4.起始位置
          if(!end_pos)
              throw Error("在html中未找到结尾元素:" . end_element)
          html_header:=subStr(result,1,start_pos-1)
          html_footer:=subStr(result,end_pos+strLen("</div>"))
          fileAppend Format("{1}{2}{3}",html_header, this.catche_uuid ,html_footer) ,this.catcheguiHtmlPath ;缓存
       }else{
          htmlcontent:=FileRead(this.catcheguiHtmlPath)
       }
       font_size:=strLen(contentObj.contents)>40?this.font_size*0.85:this.font_size ;缩放字体
       exit_left:=this.html_zoom*this.gui_w-18,exit_top:=8,exit_zoom:=0.3 ;退出图标
       convert_left:=10, convert_bottom:=30,convert_zoom:=0.5             ;转换图标
       gui_w:=this.gui_w * this.html_zoom ,gui_r:=gui_w+10                ;右滑块宽度10px
       to_right:=Format("window.scrollTo({1},0)",gui_r), to_left:=Format("window.scrollTo(0,{1})",gui_w)
       main_div:=Format('<div id="mainDiv" style="zoom:{1};border-top:5px solid {2}">',this.html_zoom,this.html_top_color)
       div_element_start:=Format('{1}<div class="trans-box pic"><div class="pic-result-box"><div class="pic-from"><div class="text-box" style="font-size:{2}px" ><p>'
                     ,main_div,font_size)
       ;导入搜狗图片并设置图标
       html_style:=Format('<style>.source_trans_convert{width: 30px;height: 30px;z-index:100;zoom:{1};background: url("https://search.sogoucdn.com/translate/pc/static/img/sprite_common_translate.ed1fb14.png") no-repeat;background-position: -372px -176px;}.source_trans_convert:hover{	cursor:pointer;background: url("https://search.sogoucdn.com/translate/pc/static/img/sprite_common_translate.ed1fb14.png") no-repeat; background-position: -372px -142px;zoom:0.51}.html_gui_exit{width: 38px;height: 38px;zoom:{2};position: fixed;left:{3}px;top: {4}px;z-index:2;background: url("https://search.sogoucdn.com/translate/pc/static/img/sprite_common_translate.ed1fb14.png") no-repeat;background-position: -78px -319px;}.html_gui_exit:hover{cursor:pointer;background: url("https://search.sogoucdn.com/translate/pc/static/img/sprite_common_translate.ed1fb14.png") no-repeat;background-position: -38px -319px;zoom:0.32}</style>'
                     ,convert_zoom,exit_zoom,exit_left,exit_top)
       ;JS的左右(原数据,翻译)切换操作
       html_script:=Format('<script>var flag=true;window.onload = function(){var div_h = document.getElementById("mainDiv").offsetHeight;document.getElementById("convertBtn1").style.position="fixed";document.getElementById("convertBtn1").style.top=(div_h*{1}-{2})+"px";document.getElementById("convertBtn1").style.left="{3}px";};function convert_click(){if(flag){{4}}else{{5}}flag=!flag}</script>'
                     ,this.html_zoom,convert_bottom,convert_left,to_right,to_left)
       ;退出图标html
       ico_div:='<div class="html_gui_exit" id="exitBtn1"></div><div class="source_trans_convert"  onclick="convert_click()" id="convertBtn1"></div>'
       span_elements:="" ,span_elements2:=""  ;需要构造html所需要的数据
       for k,v in contentObj.contentArr{
          span_elements.=Format('<span id="left-{1}-s">{2}</span>',k,strReplace(strReplace(v,"<","&lt;"),">","&gt"))
       }
       for k2,v2 in contentObj.transArr{
          span_elements2.=Format('<span id="right-{1}-s">{2}</span>',k2,strReplace(strReplace(v2,"<","&lt;"),">","&gt"))
       }
       right_copy:=Format('<div id="target-clipboard" class="btn-copy" >{1}</div>',"复制") ;构建复制图标
       right_element:=Format('<div class="pic-to"><div class="text-box"><p>{1}</p></div>{2}</div>',span_elements2,right_copy)
       div_element_end:=Format('</p></div><div id="src-clipboard" class="btn-copy">{1}</div></div>{2}</div></div>',"复制",right_element)
       bodyhtml:=html_style html_script ico_div div_element_start span_elements div_element_end ;构造所需body
       result_html:=isSet(htmlcontent)?strReplace(htmlcontent,this.catche_uuid,bodyhtml):(html_header . bodyhtml . html_footer)  ;组装html
       return result_html
    }
    ;发送get请求打开搜狗翻译主页主要为了获取cookie中的snuid(url3,url4中),FQV(url中) ,wuid(url3中)使用
    static sendGetRequest(init:=0)
    {
        Thread "Priority" ,-1
        try{
            if not ak.ConnectedToInternet() ;互联网没有连接
                throw Error("没有互联网连连接")
            ;①请求url1
            this.req.Open("get", this.url1,true) ;true 表示异步
            this.req.setRequestHeader("User-Agent",this.userAgent) ;在open之后
            this.req.send()
            this.req.WaitForResponse()
            headers:=this.req.GetAllResponseHeaders() ;获取所有相应头 ,里面包含cookie
            this.header:=this.header?this.header:ak.getHeaderObj(headers)
            ;②请求url2
            this.req.Open("get", this.url2,true) ;true 表示异步
            this.req.send()
            this.req.WaitForResponse()
            this.uuid:=this.req.GetResponseHeader("UUID:")  ;获取相关cookie
            ;③.请求url3发送预请求
            this.sendPreGetRequest()
        }catch as e{
            throw e
        }
    }
    ;发送上传图片的预请求
    static sendPreGetRequest()
    {
        ;③请求url3
        _t:=ak.getTimeStamp() ,_r:=floor(1000* Random(0.0,1.0))
        snuid:=this.header.cookie.snuid.value
        wuid:=this.header.cookie.wuid.value
        url3WithParam := format("{1}uigs_productid=vs_web&vstype=translate&snuid={2}&pagetype=index&type=imgtrans&uuid={3}&fr=default&terminal=web&onerror=true"
                               . "&wuid={4}&overIe10=1&abtest=3&uigs_cl=upload_click_home&_t={5}&_r={6}&uigs_st=0",this.url3,snuid,this.uuid,wuid,_t,_r)
        this.req.Open("get", url3WithParam,true)
        this.req.send()
        this.req.WaitForResponse()
        return true
    }
    ;④.请求url4上传文件提交图片 并返回解析的json字符串 ,传入req请求和图片路径
    static sendPostRequest(pngpath)
    {
        ;实例:ABTEST=6|1673104302|v17; IPLOC=CN5101;SNUID=DD5759A6D2D620B6A66D186BD31414E5;FQV=c7862eb243f3dfbcf3b287dcc047f0e7
        currentCookie:=Format("ABTEST={1};IPLOC={2};SNUID={3};FQV={4}"
                    ,this.header.cookie.ABTEST.value,"",this.header.cookie.SNUID.value,this.header.cookie.FQV.value)
        while not FileExist(pngpath){ ;3s文件不存在就退出
            sleep 20
            if(A_index>=100)
                throw Error("文件不存在")
        }
        extra_data:='{"from":"auto","to":"zh-CHS","imageName":"xx.png"}'
        sec_ch_ua:= '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"'
        objParam := Map("fileData",[pngpath],"fuuid",this.uuid,"extraData",extra_data) ;post数据
        this.getPostFormBinData(&PostData,&hdr_ContentType, objParam)
        this.req.Open("POST", this.url4,true)
        this.req.SetRequestHeader("Content-Type", hdr_ContentType)
        this.req.SetRequestHeader("sec-ch-ua",sec_ch_ua)
        this.req.SetRequestHeader("sec-ch-ua-mobile","?0")
        this.req.SetRequestHeader("sec-ch-ua-platform","Windows")
        this.req.SetRequestHeader("sec-Fetch-Dest","empty")
        this.req.SetRequestHeader("sec-Fetch-Mode","cors")
        this.req.SetRequestHeader("sec-Fetch-Site","same-origin")
        this.req.SetRequestHeader("User-Agent",this.userAgent)
        this.req.SetRequestHeader("cookie",currentCookie)
        this.req.Send(PostData)
        this.req.WaitForResponse()
        jsonresult:=this.req.ResponseText
        return jsonresult
    }
    ;处理返回数据,提取json中有用的数据 ,resJson:返回的完整json
    ;返回示例一个对象:{source:"识别数据",trans:"翻译后的数据"}
    static dealResult(resjsonStr)
    {
        if not resjsonStr
            throw Error("返回json字符串为空")
        retobj:={} ,contents:="" ,trans:="",contentArr:=[] ,transArr:=[]
        jsonObj:=JSON2.parse(resjsonStr)
        if(((data:=jsonObj.data)=="null") or jsonObj.status!=0)
            return
        resultArr:=jsonObj.data.result
        for contentobj in resultArr{
            contents:=contents . contentobj.content . "`r`n"
            trans:=trans . contentobj.trans_content . "`r`n"
            contentArr.push(contentobj.content )
            transArr.push(contentobj.trans_content)
        }
        retobj.contents:=contents
        retobj.trans:=trans
        retobj.contentArr:=contentArr
        retobj.transArr:=transArr
        return retobj

    }
    ;#获取post请求中payload ,在post慢中对应数据类型为body中的form-data ,数据类型为二进制
    ;#retData 返回的二进制数据,retHeader请求头,objParam入参对象 [] 中会被认为是文件
    ;#示例:objParam := {"fileData":[src],"fuuid":"aa409350-e00c-49df-9f20-517796457e68","extraData":extra_data}
    static getPostFormBinData(&retData,&retHeader,objParam) {
       CRLF := "`r`n"
       BoundaryLine := "--" . this.boundary ;创建一个边界
       binArrs := []
       For k, v in objParam ;循环设置值
       {
           If IsObject(v) {
               For i, FileName in v{ ;当前二进制数据来源于文件
                   str := BoundaryLine . CRLF
                        . 'Content-Disposition: form-data; name="' . k . '"; filename="' . FileName . '"' . CRLF
                        . 'Content-Type: ' . this.MimeType(FileName) . CRLF . CRLF
                   binArrs.Push( this.BinArr_FromString(str) )
                   binArrs.Push( this.BinArr_FromFile(FileName) )
                   binArrs.Push( this.BinArr_FromString(CRLF) )
               }
           } Else {
               str := BoundaryLine . CRLF
                    . 'Content-Disposition: form-data; name="' . k '"' . CRLF . CRLF
                    . v . CRLF
               binArrs.Push( this.BinArr_FromString(str) )
           }
       }
       str := BoundaryLine . "--" . CRLF
       binArrs.Push(this.BinArr_FromString(str) )
       ; Finish
       retData := this.BinArr_Join(binArrs*)
       retHeader:= "multipart/form-data; boundary=" . this.boundary
    }
    ;判断当前类型
    static MimeType(FileName) {
        n := FileOpen(FileName, "r").ReadUInt()
        Return (n        = 0x474E5089) ? "image/png"
             : (n        = 0x38464947) ? "image/gif"
             : (n&0xFFFF = 0x4D42    ) ? "image/bmp"
             : (n&0xFFFF = 0xD8FF    ) ? "image/jpeg"
             : (n&0xFFFF = 0x4949    ) ? "image/tiff"
             : (n&0xFFFF = 0x4D4D    ) ? "image/tiff"
             : "application/octet-stream"
    }
    ;字符串转换为二进制
    static BinArr_FromString(str) {
         oADO := ComObject("ADODB.Stream")
         oADO.Type := 2 ; adTypeText
         oADO.Mode := 3 ; adModeReadWrite
         oADO.Open
         oADO.Charset := "UTF-8"
         oADO.WriteText(str)
         oADO.Position := 0
         oADO.Type := 1 ; adTypeBinary
         oADO.Position := 3 ; Skip UTF-8 BOM
         BinRes:=oADO.Read
         oADO.Close
         return BinRes
     }
     ;把文件转换为二进制
     static BinArr_FromFile(FileName) {
         oADO := comObject("ADODB.Stream")
         oADO.Type := 1 ; adTypeBinary
         oADO.Open
         oADO.LoadFromFile(FileName)
         BinRes:=oADO.Read
         oADO.Close
         return BinRes
     }
     ;合并二进制数据
     static BinArr_Join(Arrays*) {
         oADO := comObject("ADODB.Stream")
         oADO.Type := 1 ; adTypeBinary
         oADO.Mode := 3 ; adModeReadWrite
         oADO.Open
         For i, arr in Arrays
             oADO.Write(arr)
         oADO.Position := 0
         BinRes:=oADO.Read
         oADO.Close
         return BinRes
     }
}
;----------------------------------------------------------------------------------------------------------搜狗ocr  class
;----------------------------------------------------------------------------------------------------------等待动画类 class
class loadgif
{
    ;等待动画的html 缓存在tmp中,初始化脚本会删除配置
    static waithtml:=('<html><head></head><body style="margin: 0;background-color: {1};">' .   ;{1}#ffffff背景颜色
                                '<img src="data:image/jpeg;base64,{2}">' . ;{2}base64编码
                             '</body> ' .
                      '</html>')
    static loadhtmlPath:=Format("{1}\sogotranswaitload.tmp.html",A_Temp) ;缓存gif每次重启会删除
    static background_color:="#ffffff" ;gui和html背景色,设置为其它色会有短暂的显示
    static loadGifWb:=unset ;activeX的句柄
    static loadGifsize:=30 ;加载图标size
    static loadGuiTitle:="ahk2loaddingTitle" ;加载动画标题
    static loadGui:="" ;loadgif的GUI
    ;初始化数据,flag=0 第一次执行脚本的时候后初始化,falg=1 在运行时初始化
    static initData(flag:=0)
    {
        if not flag{
            T0:= FileExist(this.loadhtmlPath)? fileDelete(this.loadhtmlPath):""
            this.initData(1)
            return
        }
        if not FileExist(this.loadhtmlPath){
            waitLoadHtml:=Format(this.waithtml,this.background_color,getIco("loadGif"))
            FileAppend(waitLoadHtml, this.loadhtmlPath)
         }
    }
    ;显示等待动画 在指定位置
    static show(xPos,yPos)
    {
        this.initData(1)
        this.loadGui:=loadGui:=Gui("+AlwaysOnTop -Caption +ToolWindow",this.loadGuiTitle) ;参数1:gui.opt支持的任何选项,参数2:标题
        loadGui.BackColor := Ltrim(this.background_color,"#")
        WinSetTransColor(loadGui.BackColor " 250", loadGui) ;设置透明色
        this.loadGifWb:=WB:= loadGui.Add("ActiveX", Format("x0 y0 w{1} h{2}",this.loadGifsize+18,this.loadGifsize+18), "Shell.Explorer").Value ;添加activex组件最多支持IE11
        loadGui.Show(Format("x{1} y{2} w{3} h{4} NoActivate",xPos,yPos,this.loadGifsize,this.loadGifsize))
        ak.display(WB,,this.loadhtmlPath)
    }
}
;----------------------------------------------------------------------------------------------------------等待动画类 class
;----------------------------------------------------------------------------------------------------------image GDI+工具类
class imageutil
{
    ;GDI句柄
     static GdipToken := 0

     ;当前托盘图标,防止重复创建同一图标
     static trayiconFlag:=0

     ;初始化GDI+模块
     static init()
     {
         DllCall("LoadLibrary", "str", "gdiplus")
         si := Buffer(A_PtrSize = 4 ? 16:24, 0) ; sizeof(GdiplusStartupInput) = 16, 24
         NumPut("uint", 0x1, si)
         DllCall("gdiplus\GdiplusStartup", "ptr*", &GdipToken:=0, "ptr", si, "ptr", 0)
         this.GdipToken:=GdipToken
     }
    ;保存图片,默认png格式 ,filepath:路径,minW/minH:缩放的最小宽度/高度小于就缩放scale倍数,sextension文件类型png
    static saveclip(filepath,minW:=0,minH:=0,scale:=1,extension:="png")
    {
        if not (pBitmap:=this.getBitFromClip())
            throw Error("获取pBitmap异常")
        this.saveBitmap(pBitmap,filepath,minW,minH,scale,extension)
    }
    ;保存bitmap图片
    static saveBitmap(pBitmap,filepath,minW:=0,minH:=0,scale:=1,extension:="png")
    {
        if not pBitmap
            throw Error("传入pBitmap异常")
        this.select_codec(pBitmap,  &pCodec, &ep, &ci, &v ,extension)
        DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", &width:=0)  ;获取图片宽度
        DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", &height:=0) ;获取图片高度
        scale:=(width<minW or  height<minH )?scale:1
        this.BitmapScale(&pBitmap,scale)  ;缩放
        Loop {
           if !DllCall("gdiplus\GdipSaveImageToFile", "ptr", pBitmap, "wstr", filepath, "ptr", pCodec, "ptr", IsSet(ep) ? ep : 0)
              break
           else
              if A_Index < 6
                 Sleep (2**(A_Index-1) * 30)
              else
                 throw Error("保存图片异常")
        }
    }
     ;获取粘贴板数据返回bitmap的指针 pBitmap ,非图片时报错
     static getBitFromClip() {
         Loop{
             if DllCall("OpenClipboard", "ptr", A_ScriptHwnd)
                break
             else
                if A_Index < 6
                   Sleep (2**(A_Index-1) * 30)
                else
                   throw Error("打开剪切板失败")
          }
          if !DllCall("IsClipboardFormatAvailable", "uint", 2){ ;CF_BITMAP
             DllCall("CloseClipboard")
             throw Error("获取CF_BIUTMAP失败")
          }
          if !(hbm := DllCall("GetClipboardData", "uint", 2, "ptr")){
             DllCall("CloseClipboard")
             throw Error("获取剪切板数据失败")
          }
          DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "ptr", hbm, "ptr", 0, "ptr*", &pBitmap:=0)
          DllCall("DeleteObject", "ptr", hbm)
          DllCall("CloseClipboard")
          return pBitmap
     }
     ;获取图片的编码信息
     static select_codec(pBitmap, &pCodec, &ep, &ci, &v ,extension:="png", quality:=100) {
          ; Fill a buffer with the available image codec info.
          DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", &count:=0, "uint*", &size:=0)
          DllCall("gdiplus\GdipGetImageEncoders", "uint", count, "uint", size, "ptr", ci := Buffer(size))
          loop {
             if (A_Index > count) ;Could not find a matching encoder for the specified file format.
                throw Error("找不到匹配的图片编码")
             idx := (48+7*A_PtrSize)*(A_Index-1)
          } until InStr(StrGet(NumGet(ci, idx+32+3*A_PtrSize, "ptr"), "UTF-16"), extension) ; FilenameExtension
          pCodec := ci.ptr + idx ; ClassID
          return 1
     }
     ;缩放图片,scale 缩放倍数,可以是数组[m,n] 表示长度缩放m倍数,宽度缩放n倍数
     static BitmapScale(&pBitmap, scale) {
          if not (IsObject(scale) && ((scale[1] ~= "^\d+$") || (scale[2] ~= "^\d+$")) || (scale ~= "^\d+(\.\d+)?$"))
             throw Error("缩放倍数异常scale:" . scale)

          ; Get Bitmap width, height, and format.
          DllCall("gdiplus\GdipGetImageWidth", "ptr", pBitmap, "uint*", &width:=0)
          DllCall("gdiplus\GdipGetImageHeight", "ptr", pBitmap, "uint*", &height:=0)
          DllCall("gdiplus\GdipGetImagePixelFormat", "ptr", pBitmap, "int*", &format:=0)

          if IsObject(scale) {
             safe_w := (scale[1] ~= "^\d+$") ? scale[1] : Round(width / height * scale[2])
             safe_h := (scale[2] ~= "^\d+$") ? scale[2] : Round(height / width * scale[1])
          } else {
             safe_w := Ceil(width * scale)
             safe_h := Ceil(height * scale)
          }

          ; Avoid drawing if no changes detected.
          if (safe_w = width && safe_h = height)
             return pBitmap

          ; Create a new bitmap and get the graphics context.
          DllCall("gdiplus\GdipCreateBitmapFromScan0"
                   , "int", safe_w, "int", safe_h, "int", 0, "int", format, "ptr", 0, "ptr*", &pBitmapScale:=0)
          DllCall("gdiplus\GdipGetImageGraphicsContext", "ptr", pBitmapScale, "ptr*", &pGraphics:=0)

          ; Set settings in graphics context.
          DllCall("gdiplus\GdipSetPixelOffsetMode",    "ptr", pGraphics, "int", 2) ; Half pixel offset.
          DllCall("gdiplus\GdipSetCompositingMode",    "ptr", pGraphics, "int", 1) ; Overwrite/SourceCopy.
          DllCall("gdiplus\GdipSetInterpolationMode",  "ptr", pGraphics, "int", 7) ; HighQualityBicubic

          ; Draw Image.
          DllCall("gdiplus\GdipCreateImageAttributes", "ptr*", &ImageAttr:=0)
          DllCall("gdiplus\GdipSetImageAttributesWrapMode", "ptr", ImageAttr, "int", 3) ; WrapModeTileFlipXY
          DllCall("gdiplus\GdipDrawImageRectRectI"
                   ,    "ptr", pGraphics
                   ,    "ptr", pBitmap
                   ,    "int", 0, "int", 0, "int", safe_w, "int", safe_h ; destination rectangle
                   ,    "int", 0, "int", 0, "int",  width, "int", height ; source rectangle
                   ,    "int", 2
                   ,    "ptr", ImageAttr
                   ,    "ptr", 0
                   ,    "ptr", 0)
          DllCall("gdiplus\GdipDisposeImageAttributes", "ptr", ImageAttr)

          ; Clean up the graphics context.
          DllCall("gdiplus\GdipDeleteGraphics", "ptr", pGraphics)
          DllCall("gdiplus\GdipDisposeImage", "ptr", pBitmap)

          return pBitmap := pBitmapScale
     }
     ;关闭GDI+
     static close()
     {
        If (this.GdipToken) {
           DllCall("gdiplus\GdiplusShutdown", "UInt", this.GdipToken)
        }
        DllCall("FreeLibrary", "ptr", DllCall("GetModuleHandle", "str", "gdiplus", "ptr"))
     }
}
;----------------------------------------------------------------------------------------------------------image GDI+工具类
;----------------------------------------------------------------------------------------------------------JSON工具类
;可以用于把comobject对象转换为ahk对象
class JSON2
{
    static uuidA:="0763C49802734108979739D89C0CC7A4" . A_NowUTC
    static uuidB:="C8C0655017FB428FB18EECF88E6E85CF" . A_NowUTC
    static uuidC:="08E3043B62324D0C8BDDB6A2A1DB4E6A" . A_NowUTC
    ;解析json
    static parse(str)
    {
        str:=inStr(str,'\\')?strReplace(str,'\\',this.uuidC):str ;替换 \\
        str:=inStr(str,'\"')?strReplace(str,'\"',this.uuidA):str ;替换 \"
        str:=inStr(str,"'")?strReplace(str,"'",this.uuidB):str   ;替换 '
        return this.recurve(str)
    }
    ;Func 把对象转换为字符串
    static stringify(obj)
    {
        return  this.GetJS().JSON.stringify(obj)
    }
    ;递归解析json
    static recurve(str,recFlag:=0)
    {
        static eval := ObjBindMethod(this.GetJS(), 'eval')
        if not recFlag{
            obj:= eval(Format('(function(){obj=JSON.parse({1}{2}{3});tmp=obj.length?"":obj["keys"]=Object.keys(obj);return obj})()'
            ,"'",str,"'"))
            return this.recurve(obj,1)
        }
        if(type(str)=="ComObject"){
           if(str.hasOwnProperty("length")){ ;数组
               tmpArr:=[]
               Loop str.length {
                 if type(value:=str.%A_index-1%)=="ComObject"
                    tmpArr.push(this.recurve(this.recurve(this.stringify(value),0),1))
                 else
                    tmpArr.push(this.recurve(value,1))
               }
               return tmpArr
           }else{  ;对象 注意js的下标是0开始
               tmpObject:={}
               Loop str.keys.length{
                  key:=str.keys.%A_index-1%
                  if type(value:=str.%key%)=="ComObject"{
                     tmpObject.%key%:=this.recurve(this.recurve(this.stringify(value),0),1)
                  }else
                    tmpObject.%key%:=this.recurve(value,1) ;
               }
               return tmpObject
           }
        }else{ ;普通类型,可能是已经组装好的map或者是组装好的array
;            msgBox type(str)
           if type(str)=="Object" or type(str)=="Array"
                return str
           str:=inStr(str,this.uuidA)?strReplace(str,this.uuidA,'"'):str
           str:=inStr(str,this.uuidB)?strReplace(str,this.uuidB,"'"):str
           str:=inStr(str,this.uuidC)?strReplace(str,this.uuidC,"\"):str
           return str
        }
    }
    ;获取JS对象
    static GetJS() {
        static document := '', JS
        if !document {
            document := ComObject('HTMLFILE')
            document.write('<meta http-equiv="X-UA-Compatible" content="IE=9">')
            JS := document.parentWindow
            (document.documentMode < 9 && JS.execScript())
        }
        return JS
    }
}
;----------------------------------------------------------------------------------------------------------JSON工具类
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class
class ak{
    static clipdataType:=1
   ;判断是否连接互联网
   static ConnectedToInternet(flag:=0x40) {
      Return DllCall("Wininet.dll\InternetGetConnectedState", "Str", flag,"Int",0)
   }

   ;Func 显示网页 WB:activeX句柄 ,content:html内容,path:文件位置,timeout:=300
   static display(WB,content:="",path:="",timeout:=300)
   {
       if not content and not path
           throw Error("展示html时content和path同时为空")
       WB.silent := true
       if(content and not path and count:=1 ){
           while(FileExist(f:=Format("{1}\{2}{3}-tmp{4}DELETEME.html",A_Temp,A_TickCount,A_NowUTC,count)))
               count+=1
           FileAppend content,f
       }else if(path and not content)
           f:=path
       WB.Navigate("file://" . f)
       while((WB.readystate != 4) and --timeout>0)
            sleep 10
       return true
   }

   ;Func 处理在屏幕上显示的位置,返回图像所在x,y
   static dealshowGui(x,y,w,h,&newX, &newY,gap:=5)
   {
       newX:=x+w>A_ScreenWidth-gap ? A_ScreenWidth-gap -w:x ;处理右边界
       newY:=y+h>A_ScreenHeight-20?y-20-h:y ;处理下边界
   }
   ;Func frameShadow 窗口阴影
   static frameShadow(HGui)
   {
      _MARGINS:=Buffer(16)
      NumPut("UInt",0,_MARGINS,0),NumPut("UInt",0,_MARGINS,4),NumPut("UInt",1,_MARGINS,8),NumPut("UInt",0,_MARGINS,12)
      DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", HGui, "UInt", 2, "Int*", 2, "UInt", 4)
      DllCall("dwmapi\DwmExtendFrameIntoClientArea", "Ptr", HGui, "Ptr", _MARGINS)
   }
   ;Func 获取请求头中的数据返回一个obj对象传入一个请求头 map={a:{value:"hello",path:"/" , expires:"Sun, 22 Jan 2023 03:46:59 GMT",size:n},xx:"xxx"}
   static getHeaderObj(header)
   {
       resobj:={},cookieobj:={},size:=0
       Loop parse ,header, "`n" {
          if  A_loopField and index:=inStr(A_loopField,":"){
             key:=trim(subStr(A_loopField,1,index-1))
             value:=trim(subStr(A_loopField,index+1))
             if(key=="Set-Cookie"){
                lineobj:={} , cookieKey:=""
                for v in strSplit(value,";"){
                   if indexb:=inStr(v,"=") {
                       a:=trim(subStr(v,1,indexb-1))
                       b:=trim(subStr(v,indexb+1))
                       A_index==1 ?((lineobj.value:=b)and (cookieKey:=a)):(lineobj.%a%:=b)
                   }
                }
                cookieobj.%cookieKey%:=lineobj
                size+=1
             }
             cookieobj.size:=size
             resobj.%key%:=value
          }
       }
       resobj.cookie:=cookieobj
       return resobj
   }
   ;Func 获取时间戳
   static getTimeStamp(){
       ; datediff 计算现在的utc时间到unix时间戳的起始时间经过的秒数
       return DateDiff(A_NowUTC,'19700101000000','S')*1000+A_MSec
   }
}
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class

5、总结

    和翻译原理一样也是爬取翻译网页界面,不同的是这个ocr过程比较复杂,需要请求各种网页得到cookie和一些标识码等、总之还是取之于互联网,整合用于互联网,不自己造轮子、

exe下载链接:https://download.csdn.net/download/qq_34407846/88382059

上一篇 :ahk系列——ahk_v2实现win10任意界面搜狗翻译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小沐学C++】C++ 基于Premake构建工程项目(Windows)

文章目录 1、简介2、下载和安装2.1 下载2.3 快速入门 3、使用3.1 支持的工程文件Project Files3.2 构建设置Build Settings3.3 链接Linking3.4 配置Configurations3.5 平台Platforms3.6 过滤Filters3.7 预设值Tokens 4、测试4.1 测试1&#xff1a;入门例子4.2 测试2&#xff1a…

STL upper_bound和lower_bound函数

声明&#xff1a; 首先包含头文件#include<algorithm> 这里的两个函数所运用的对象必须是非递减的序列&#xff08;也就是数组&#xff0c;数组必须是非递减的&#xff09;&#xff0c;只有这样才可以使用upper_bound和lower_bound这两个函数。 还有一点&#xff0c;就…

手摸手带你 在Windows系统中安装Istio

Istio简介 通过负载均衡、服务间的身份验证、监控等方法&#xff0c;Istio 可以轻松地创建一个已经部署了服务的网络&#xff0c;而服务的代码只需很少更改甚至无需更改。 通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持&#xff0c;而代理会拦截微服务…

【C++】string 之 find、rfind、replace、compare函数的学习

前言 上篇文章&#xff0c;我们学习了assign、at、append这三个函数 今天&#xff0c;我们来学习find、 函数 find函数 引入 我们都知道&#xff0c;find函数可以是string类中&#xff0c;用于查找字符或者字符串的函数 也可以是&#xff0c;<algorithm>头文件中&am…

帝国CMS插件-最全免费帝国CMS插件大全

在如今的数字时代&#xff0c;网站管理员和内容创作者面临着一个共同的挑战&#xff1a;如何快速而有效地生成并发布大量内容&#xff0c;以吸引更多的用户和读者。帝国CMS&#xff08;Empire CMS&#xff09;是一个备受欢迎的内容管理系统&#xff0c;许多网站使用它来创建和管…

3.物联网射频识别,RFID

一。ISO14443-2协议简介 1.ISO14443协议组成及部分缩略语 &#xff08;1&#xff09;14443协议组成 14443-1 物理特性 14443-2 射频功率和信号接口 14443-3 初始化和防冲突 14443-4 传输协议 &#xff08;2&#xff09;针对前两节的名词&#xff0c;对应的英语缩略语 PCD&…

解决webpack报错:You forgot to add ‘mini-css-extract-plugin‘ plugin

现象&#xff1a; 原因&#xff1a; webpack5.72跟mini-css-extract-plugin有兼容性问题 解决办法&#xff1a;把 new MiniCssExtractPlugin()放在webpack配置文件中plugins数组的第一项&#xff1a; plugins: [ // 此处解决报错&#xff1a;You forgot to add mini-css-extra…

Lua表公共操作

--表的公共操作 t1 {{age 1,name "123"},{age 2,name "456"}} t2 {name "Holens" , sex true} --插入 print(#t1) table.insert(t1,t2) print(#t1) print(t1[3].sex) print("*************************************")--删除 -…

媒体编解码器MediaCodec

目录 1.介绍MediaCodec类 2.创建MediaCodec的方式 3.MediaCodec流程 &#xff08;1&#xff09;配置编码参数 &#xff08;2&#xff09;创建编码器 &#xff08;3&#xff09;创建混合器 &#xff08;4&#xff09;开始编码 4.MediaCodec编码的工作方式 5.MediaCodec…

整型提升——(巩固提高——字符截取oneNote笔记详解)

文章目录 前言一、整型提升是什么&#xff1f;二、详细图解1.图解展示 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 整型提升是数据存储的重要题型&#xff0c;也是计算机组成原理的核心知识点。学习c语言进阶的时候,了解内存中数据怎么存&#…

Lua表实现类

--类 Student { name "Holens",age 1,sex true,Say1 function()print(Student.name.."说话了")end,Say2 function(t)print(t.name.."说话了2")end } Student.Say1() print("*************************************")--声明后添加…

Python大数据之pandas快速入门(一)

文章目录 pandas快速入门学习目标1. DataFrame 和 Series 简介2. 加载数据集(csv和tsv)2.1 csv和tsv文件格式简介2.2 加载数据集(tsv和csv) pandas快速入门 学习目标 能够知道 DataFrame 和 Series 数据结构能够加载 csv 和 tsv 数据集能够区分 DataFrame 的行列标签和行列位…

Windows11安装MySQL8.1

安装过程中遇到任何问题均可以参考(这个博客只是单纯升级个版本和简化流程) Windows安装MySQL8教程-CSDN博客 到官网下载mysql8数据库软件 MySQL :: Download MySQL Community Server 下载完后,解压到你需要安装的文件夹 其中的配置文件内容了如下 [mysqld]# 设置3306端口po…

设计模式4、建造者模式 Builder

解释说明&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示 UML 结构图&#xff1a; 抽象建造者&#xff08;Builder&#xff09;&#xff1a;这个接口规定要实现复杂对象的那些部分的创建&#xff0c;并不设计具体部件对象的创…

【Spring Cloud】Ribbon 实现负载均衡的原理,策略以及饥饿加载

文章目录 前言一、什么是 Ribbon二、Ribbon 实现负载均衡的原理2.1 负载均衡的流程2.2 Ribbon 实现负载均衡的源码剖析 三、Ribbon 负载均衡策略3.1 负载均衡策略3.2 演示 Ribbon 负载均衡策略的更改 四、Ribbon 的饥饿加载4.1查看 Ribbon 的懒加载4.2 Ribbon 的饥饿加载模式 前…

《The Rise and Potential of Large Language Model Based Agents: A Survey》全文翻译

The Rise and Potential of Large Language Model Based Agents: A Surve - 基于 LLMs 的代理的兴起和潜力&#xff1a;一项调查 论文信息摘要1. 介绍2. 背景2.1 AI 代理的起源2.2 代理研究的技术趋势2.3 为什么大语言模型适合作为代理大脑的主要组件 3. 代理的诞生&#xff1a…

【文档智能】:GeoLayoutLM:一种用于视觉信息提取(VIE)的预训练模型

前言 文章介绍了一种用于视觉信息提取&#xff08;VIE&#xff09;的预训练模型&#xff1a;GeoLayoutLM。GeoLayoutLM通过显式建模几何关系和特殊的预训练任务来提高文本和布局的特征表示。该模型能够提高文档信息抽取的性能。 一、提出背景 当前多模态预训练模型在 SER 任…

c/c++中如何输入pi

标准的 C/C 语言中没有π这个符号及常量&#xff0c;一般在开发过程中是通过开发人员自己定义这个常量的&#xff0c;最常见的方式是使用宏定义&#xff1a; 方法1&#xff1a;#define pi 3.1415926 方法2&#xff1a;使用反三角函数const double pi acos(-1.0);

如何使用记事本制作一个简陋的小网页(2)——表格的建立

前情题要&#xff1a;http://t.csdnimg.cn/bK3H9 1.首先在之前的基础上建立一个新的标签页面。 2.使用<body></body>建立背景颜色 3.表格的填充和使用 如图所示&#xff0c;<table></table>是建立一个表格所需要使用的标签&#xff0c;可以使用width来…

Docker 容器跨主机通信 - Flannel

Author&#xff1a;rab 目录 前言一、架构及环境二、服务部署2.1 Etcd 部署2.2 Flannel 部署2.3 Docker 网络配置 三、容器通信验证及路由分析3.1 通信验证3.2 路由转发分析3.3 数据分发分析 总结 前言 今天是中秋佳节&#xff0c;首先在此祝大家“中秋快乐&#xff0c;阖家团…