function WinInetDownload(Url:PChar; fs:TStream):Boolean; var hSession : HINTERNET; hOpenUrl : HINTERNET; Temp : array [0..MAXBLOCKSIZE-1] of Byte; dwRead : DWORD; dwResult : DWORD; agent:string; begin Result := False; agent:='Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Coolpad 8122 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'; hSession := InternetOpen(PChar(agent), //指定调用 WinINet 函数的应用程序或入口。该入口用作HTTP协议中用户代理项。 INTERNET_OPEN_TYPE_PRECONFIG,//访问要求类型,该参数可为下列值之一: { INTERNET_OPEN_TYPE_DIRECT 解析所有本地主机; INTERNET_OPEN_TYPE_PRECONFIG 返回注册表中代理或直接的配置; INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 返回注册表中代理或直接的配置,并防止对Microsoft Jscript 或 INS文件的使用; INTERNET_OPEN_TYPE_PROXY 为代理传递请求,除非代理提供了旁路列表且解析的名字可以绕过代理;此时,函数使用INTERNET_OPEN_TYPE_DIRECT。} nil, //指定了当lAccessType类型为INTERNET_OPEN_TYPE_PROXY时,代理服务器的名字。 nil, //指向一个字符串,它指定一个可选的主机名列表或IP地址,列表可包括未知元素。 0); {该参数可为下列值的任意组合: INTERNET_FLAG_ASYNC 仅能用于作用在该函数返回的句柄的子句柄上的异步请求。 INTERNET_FLAG_FROM_CACHE 不做网络请求。所有的实体都由缓存返回。如果请求条目不在缓存中,一个适当的错误将返回。 INTERNET_FLAG_OFFLINE 与 INTERNET_FLAG_FROM_CACHE 一样。} //成功:返回一个有效的句柄,该句柄将由应用程序传递给接下来的WinINet函数。 //失败:返回NULL。 if hSession = nil then Exit; //通过一个完整的FTP,Gopher或HTTP网址打开一个资源。 hOpenUrl := InternetOpenUrl(hSession, //当前的 Internet 会话句柄。句柄必须由前期的 InternetOpen 调用返回。 Url, //一个空字符结束的字符串变量的指针,指定读取的网址。只有以ftp:, gopher:, http:, 或者 https: 开头的网址被支持。 nil, //一个空字符结束的字符串变量的指针,指定发送到HTTP服务器的头信息。欲了解更多信息,请参阅HttpSendRequest函数里lpszHeaders参数的说明。 0, //额外的头的大小,以TCHAR为单位。如果这个参数是-1L并且lpszHeaders不是NULL,lpszHeaders被假设为零终止( ASCIIZ ),而长度被自动计算。 0, //INTERNET_FLAG_DONT_CACHE, //不添加返回实体到缓存 {INTERNET_FLAG_EXISTING_CONNECT 如果使用相同的必须属性创建会话,会尝试利用现有的InternetConnect对象。这只对FTP操作非常有用,因为FTP是唯一在同一会话中执行多种操作的协议。WinINet API 为每个由InternetOpen产生的HINTERNET句柄缓冲一个单独链接句柄。InternetOpenUrl使用此标志的HTTP和FTP连接。 INTERNET_FLAG_HYPERLINK 当决定何时从网络重载时,如果服务器没有返回 Expires time 和 LastModified,那么强制重载。 INTERNET_FLAG_IGNORE_CERT_CN_INVALID 停用检查从服务器对必须的主机名称返回的SSL/PCT-based证书。 WinINet函数使用简单的比较匹配主机名称和通配符的规则检查证书。 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 停用检查的SSL/PCT-based的证书的适当的有效日期。 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 禁用检测这中特殊的重定向。当使用此标志, WinINet 透明允许从HTTPS到HTTP URL的重定向。 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 禁用检测这中特殊的重定向。当使用此标志, WinINet 透明的允许的HTTP到HTTPS URL的重定向。 INTERNET_FLAG_KEEP_CONNECTION 如果可能的话,为连接使用保活语义。这个标志要求微软网络( MSN ),NTLM和其他类型的身份验证。 INTERNET_FLAG_NEED_FILE 如果要创建的文件不能被缓存,创建临时文件。 INTERNET_FLAG_NO_AUTH 不试图自动验证。 INTERNET_FLAG_NO_AUTO_REDIRECT 不自动处理HttpSendRequest中的重定向。 INTERNET_FLAG_NO_CACHE_WRITE 不添加返回实体到缓存。 INTERNET_FLAG_NO_COOKIES 不会自动添加的Cookie头到请求,并且不自动添加返回的cookie到cookie数据库。 INTERNET_FLAG_NO_UI 禁用Cookie的对话框。 INTERNET_FLAG_PASSIVE 使用被动FTP语义。InternetOpenUrl为FTP的文件和目录使用此标志。 INTERNET_FLAG_PRAGMA_NOCACHE 即使代理中存在缓存副本,也强制要求由源服务器返回。 INTERNET_FLAG_RAW_DATA 检索的Gopher目录信息时,传回的数据作为GOPHER_FIND_DATA结构,如果检索的FTP目录信息时,作为一个WIN32_FIND_DATA结构。如果此标志没有指定,或者请求通过CERN代理创建, InternetOpenUrl返回的HTML版本的目录。 INTERNET_FLAG_RELOAD 从原服务器强制下载所要求的文件,对象,或目录列表,而不是从缓存下载。 INTERNET_FLAG_RESYNCHRONIZE 重新加载的HTTP资源,如果资源在最后一次下载后已被修改。所有FTP和Gopher资源将被重载。 INTERNET_FLAG_SECURE 使用安全传输语义。这次传输使用安全套字节层/专用通信技术(的SSL / PCT ),这只有在HTTP请求时有意义。 } 0); // 返回值 // 如果已成功建立到FTP,Gopher,或HTTP URL的连接,返回一个有效的句柄,如果连接失败返回NULL。要检索特定的错误讯息,请GetLastError 。要确定为什么对服务器的访问被拒绝,请调用InternetGetLastResponseInfo。 if hOpenUrl = nil then Exit; try fs.Seek(0,soBeginning); dwRead := 1; while (dwRead > 0) do begin InternetReadFile(hOpenUrl, @Temp, MAXBLOCKSIZE, dwRead); fs.Write(Temp,dwRead); end; finally InternetCloseHandle(hOpenUrl); InternetCloseHandle(hSession); end; end; function GetUrl(url:string):Rawbytestring; var URLHTML : TStringStream ; ResultStr :string; begin URLHTML := TStringStream.Create('');//, TEncoding.GetEncoding(936)); WinInetDownload(PChar(Url) ,URLHTML ); Result :=PAnsiChar(URLHTML.Memory); // URLHTML .free; end; { procedure test(url:string):string; var ResultStr :string; rawstr:rawByteString; begin rawStr := GetUrl(url); ResultStr := UTF8Decode(rawStr); // memo1.Lines.Text:=ResultStr; end; } 下面这个是字符串转换函数 function StringChange(URLStr, UTF8str, Encode: Boolean; in_str: string): string; begin Result := in_str; try if Encode then begin if URLStr then begin if UTF8str then Result := HTTPEncode(UTF8Encode(Result)) else Result := HTTPEncode(Result); end else if UTF8str then Result := UTF8Encode(Result); end else begin if URLStr then begin if UTF8str then Result := HTTPDecode(UTF8Decode(Result)) else Result := UTF8Decode(Result); end else begin if UTF8str then Result := UTF8Decode(Result); end; end; except Result := in_str; end; end; 引用 HTTPApp |
|