httpQuery 强大的网络下载函数


取自:http://www.autohotkey.com/board/topic/30624-function-httpquery-get-and-post-requests-update-036


httpQuery(byref p1 = "", p2 = "", p3="", p4="")
{   ; v0.3.6 (w) Oct, 26 2010 by derRaphael / zLib-Style release
    ; currently the verbs showHeader, storeHeader, and updateSize are supported in httpQueryOps
    ; in case u need a different UserAgent, Proxy, ProxyByPass, Referrer, and AcceptType just
    ; specify them as global variables - mind the varname for referrer is httpQueryReferer [sic].
    ; Also if any special dwFlags are needed such as INTERNET_FLAG_NO_AUTO_REDIRECT or cache
    ; handling this might be set using the httpQueryDwFlags variable as global
    global httpQueryOps, httpAgent, httpProxy, httpProxyByPass, httpQueryReferer, httpQueryAcceptType
        , httpQueryDwFlags
    ; Get any missing default Values
 
    ;v0.3.6
    ; check for syntax
    if ( VarSetCapacity(p1) != 0 )
        dreturn:=true,  result := "", lpszUrl := p1, POSTDATA := p2, HEADERS  := p3
    else
        result := p1, lpszUrl := p2, POSTDATA := p3, HEADERS  := p4
 
    DefaultOps =
    (LTrim Join|
        httpAgent=AutoHotkeyScript|httpProxy=0|httpProxyByPass=0|INTERNET_FLAG_SECURE=0x00800000
        SECURITY_FLAG_IGNORE_UNKNOWN_CA=0x00000100|SECURITY_FLAG_IGNORE_CERT_CN_INVALID=0x00001000
        SECURITY_FLAG_IGNORE_CERT_DATE_INVALID=0x00002000|SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE=0x00000200
        INTERNET_OPEN_TYPE_PROXY=3|INTERNET_OPEN_TYPE_DIRECT=1|INTERNET_SERVICE_HTTP=3
    )
    Loop,Parse,DefaultOps,|
    {
        RegExMatch(A_LoopField,"(?P


函数功能:


● 支持URL含有端口

● “用户名:密码@域名”格式的URL

● SSL(https)

● HTTP 报头信息 / Dumping(转储) / Storing(存储)

● 下载进度条界面

● 网络连接处理的标识 (自动跟踪特性等)

● 来源页支持

● 客户端接受到的MIME类型的支持

● 代理支持

● 超时支持

● 自定义浏览器UserAgent


使用方法:


0.3.6版本引入另外一种语法与功能支持。从而简化了功能的使用。长话短说:

如果第一个参数不是空变量且包含有URL,httpquery会直接返回数据,消除了额外varsetcapacity的调用需要。然而旧的语法仍然是可用的和工作,所以使用此功能的脚本都需要进行改变。

记住,当处理二进制数据为压缩文件、下载可执行文件、或图片,我们将第一个参数为空值和第二包含URL。


新的语法:


html := httpQUERY(URL:="http://url") 将会返回获取到的html全文,长度为Errorlevel,使用的是GET方式,postparams(POST参数)长度为零。

html := httpQUERY(URL:="http://url",POSTDATA) 将会POST数据如果POSTDATA长度不为0


旧的语法:


你需要定义一个变量将接收返回的数据缓存。所以VarSetCapacity(buffer,-1)释放内存是有必要的。

httpQUERY(buffer:="",URL) 将会返回长度,第一个参数将会缓存获取到的html全文,使用的是GET方式,postparams(POST参数)长度为零。

httpQUERY(buffer:="",URL,POSTDATA) 将会POST数据如果POSTDATA长度不为0


现在支持以下格式的URL:

<!– m –>http://username:pass… … s#fragment<!– m –>


Since httpQuery has been updated to use InternetCrackURL from winINet, all essential parts will be recognized. so there is no need to set up any additional parameters. Attention: When u need to authetificate in the Website the username / password attempt will not work. u have to submit those parameters via POST or GET method. 


额外的参数:


To see a dump of the received httpHeaders, there is buildIn support for a global Variable named httpQueryOps. It may consist of one or more Verbs. For now "showHeader", "storeHeader", and "updateSize" verbs are supported. If You use storeHeader the complete Header will be saved in a variable named HttpQueryHeader which will be made global at runtime. The verb updateSize will make two variables globally Available: httpQueryFullSize and httpQueryCurrentSize. An usage example to show a download status indicator is included


全局变量

httpAgent:UserAgent,默认是AutoHotkeyScript

httpProxy: 代理,default = 0

httpProxyByPass: 不使用代理的网址列表. default = 0

httpQueryReferer: 来源页

httpQueryAcceptType: 客户端接受到的MIME类型

httpQueryDwFlags: if in need for any special flags for the current connection this is the variable to set (example V shows an useCase for this feat)


示例1 POST数据

url := "http://thinkai.net/test.php"
MsgBox, % httpQUERY(url,"a=1&b=我")

示例2 GET数据

url := "http://thinkai.net/test.php"
MsgBox, % httpQUERY(url "?a=1&b=我")


示例3 下载文件并存储

#noenv
data     := ""
URL      := "http://www.autohotkey.net/programs/AutoHotkey104706.zip"
httpQueryOps := "updateSize"
SetTimer,showSize,10
length   := httpQuery(data,URL)
Tooltip
if (write_bin(data,"ahk.exe",length)!=1)
    MsgBox "出错!"
else
    MsgBox "ahk.zip"已保存!
Return
 
showSize:
   Tooltip,% HttpQueryCurrentSize "/" HttpQueryFullSize
return
 
GuiClose:
GuiEscape:
   ExitApp
 
write_bin(byref bin,filename,size){
   h := DllCall("CreateFile","str",filename,"Uint",0x40000000
            ,"Uint",0,"UInt",0,"UInt",4,"Uint",0,"UInt",0)
   IfEqual h,-1, SetEnv, ErrorLevel, -1
   IfNotEqual ErrorLevel,0,ExitApp ; couldn't create the file
   r := DllCall("SetFilePointerEx","Uint",h,"Int64",0,"UInt *",p,"Int",0)
   IfEqual r,0, SetEnv, ErrorLevel, -3
   IfNotEqual ErrorLevel,0, {
      t = %ErrorLevel%              ; save ErrorLevel to be returned
      DllCall("CloseHandle", "Uint", h)
      ErrorLevel = %t%              ; return seek error
   }
   result := DllCall("WriteFile","UInt",h,"Str",bin,"UInt"
               ,size,"UInt *",Written,"UInt",0)
   h := DllCall("CloseHandle", "Uint", h)
   return, 1
}
 
#include httpQuery.ahk

示例4  上传图片到Imageshack使用官方(免费)API

; exmpl.imageshack.httpQuery.ahk
; This example uploads an image and constructs a multipart/form-data Type
; for fileuploading and returns the XML which is returned to show the stored Imagepath
    FileSelectFile,image
    FileGetSize,size,%image%
    SplitPath,image,OFN
    FileRead,img,%image%
    VarSetCapacity(placeholder,size,32)
    boundary := makeProperBoundary()
    post:="--" boundary "`ncontent-disposition: form-data; name=""MAX_FILE_SIZE""`n`n"
        . "1048576`n--" boundary "`ncontent-disposition: form-data; name=""xml""`n`nyes`n--"
        . boundary "`ncontent-disposition: form-data; name=""fileupload""; filename="""
        . ofn """`nContent-type: " MimeType(img) "`nContent-Transfer-Encoding: binary`n`n" 
        . placeholder "`n--" boundary "--"
    headers:="Content-type: multipart/form-data, boundary=" boundary "`nContent-Length: " strlen(post)
    DllCall("RtlMoveMemory","uInt",(offset:=&post+strlen(post)-strlen(Boundary)-size-5)
            ,"uInt",&img,"uInt",size)
    size := httpQuery(result:="","http://www.imageshack.us/index.php",post,headers)
    VarSetCapacity(result,-1)
    Gui,Add,Edit,w800 h600, % result
    Gui,Show
return
 
GuiClose:
GuiEscape:
    ExitApp
 
makeProperBoundary(){
    Loop,26
        n .= chr(64+a_index)
    n .= "0123456789"
    Loop,% StrLen(A_Now) {
        Random,rnd,1,% StrLen(n)
        Random,UL,0,1
        b .= RegExReplace(SubStr(n,rnd,1),".$","$" (round(UL)? "U":"L") "0")
    }
    Return b
}
 
MimeType(ByRef Binary) {
    MimeTypes:="424d image/bmp|4749463 image/gif|ffd8ffe image/jpeg|89504e4 image/png|4657530"
             . " application/x-shockwave-flash|49492a0 image/tiff"
    @:="0123456789abcdef"
    Loop,8
        hex .= substr(@,(*(a:=&Binary-1+a_index)>>4)+1,1) substr(@,((*a)&15)+1,1)
    Loop,Parse,MimeTypes,|
        if ((substr(hex,1,strlen(n:=RegExReplace(A_Loopfield,"\s.*"))))=n) 
            Mime := RegExReplace(A_LoopField,".*?\s")
    Return (Mime!="") ? Mime : "application/octet-stream"
}
 
#include httpQuery.ahk












查词典
 
Dict.cn 海词 - 划词释义
已开启划词
设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值