Wednesday 6 December 2017

Winhttp download binary option


Exemplo VBScript WinHttp. WinHttpRequest.5.1 com tratamento de erros Este script de exemplo WSH pode acessar (usando HTTP GET ou POST) o conteúdo texthtmlxml de um determinado URL. Se um tempo limite de conexão WinHttpRequest ou erro ocorrer, ou o servidor remoto responde com um erro, os detalhes do erro são retornados em vez do conteúdo. Para usar o código em uma página ASP em vez de WSH, substitua Wscript. Echo com Response. Write e CreateObject com Server. CreateObject. (Veja também como baixar um arquivo binário usando uma versão derivada deste código.) Função GetDataFromURL (strURL, strMethod, strPostData) Dim lngTimeout Dim strUserAgentString Dim intSslErrorIgnoreFlags Dim blnEnableRedirects Dim blnEnableHttpsToHttpRedirects Dim strHostOverride Dim strLogin Dim strPassword Dim strResponseText Dim objWinHttp lngTimeout 59000 strUserAgentString httprequester0.1 intSslErrorIgnoreFlags 13056 13056: ignorar todos erram, 0: não aceitar blnEnableRedirects err blnEnableHttpsToHttpRedirects verdadeiro verdadeiro strHostOverride strLogin strPassword Set objWinHttp CreateObject (WinHttp. WinHttpRequest.5.1) objWinHttp. SetTimeouts lngTimeout, lngTimeout, lngTimeout, lngTimeout objWinHttp. Open strMethod, strURL If StrMethod POST Então objWinHttp. setRequestHeader Content-type, applicationx-www-form-urlencoded End If If strHostOverride ltgt Então objWinHttp. SetRequestHeader Host, strHostOverride End If objWinHttp. Option (0) strUserAgentString objWinHttp. Option (4) intSslEr RorIgnoreFlags objWinHttp. Option (6) blnEnableRedirects objWinHttp. Option (12) blnEnableHttpsToHttpRedirects If (strLogin ltgt) e (strPassword ltgt) Então objWinHttp. SetCredentials strLogin, strPassword, 0 End If On Error Resume Next objWinHttp. Send (strPostData) If Err. Number 0 Então, se objWinHttp. Status 200, então GetDataFromURL objWinHttp. ResponseText Else GetDataFromURL HTTP amp objWinHttp. Status amplificador amp objWinHttp. StatusText End If else GetDataFromURL Erro amp Err. Number amp amp Err. Source amp amp Err. Description End If On Error GoTo 0 Set ObjWinHttp Nothing End FunctionVBScript arquivo binário http downloader Este script WSH pode baixar um arquivo de um determinado URL e salvá-lo no disco usando um fluxo binário. Para usar o código em uma página ASP em vez de WSH, basta usar as funções BinaryGetURL () e SaveBinaryData () e substituir CreateObject por Server. CreateObject. Dim objArgs Dim strURL Dim strFileName Definir objArgs WScript. Arguments Se objArgs. count 0 Então Wscript. echo (Sintaxe: GetBinary URL target file name amp vbcrlf amp vbcrlf amp Exemplos: amp vbcrlf amp GetBinary serverfolderfile. zip amp vbcrlf amp GetBinary serverdat. zip c : Dlfile. zip amp vbcrlf amp GetBinary serverfile. dat secure. dat amp vbcrlf amp GetBinary servernews. htm d: dataservernews. html) ElseIf objArgs. count 1 Então strURL objArgs. Item (0) strFileName strURL strFileName Substitua (strFileName,,) strFileName Substituir (strFileName, amp,) strFileName Substituir (strFileName,,) strFileName Direito (strFileName, Len (strFileName) - InStrRev (strFileName,)) Se strFileName Então strFileName strURL strFileName Substituir (strFileName,,) strFileName Substituir (strFileName,,) strFileName Substituir (strFileName,,) End If SaveBinaryData BinaryGetURL (strURL), strFileName ElseIf objArgs. count 2 Então strURL objArgs. Item (0) strFileName objArgs. Item (1) SaveBinaryData BinaryGetURL (strURL), StrFileName Else Wscript. echo (Demasiados argumentos. Se um caminho contiver espaços, o amplificador coloque aspas em torno dos argumentos.) End If Function BinaryGetURL (strURL) Dim objWinHttp Dim lngTimeout Dim strMethod Dim strPostData Dim strUserAgentString Dim intSslErrorIgnoreFlags Dim blnEnableRedirects Dim blnEnableHttpsToHttpRedirects lngTimeout 59000 milissegundos. strMethod GET strPostData strUserAgentString binarygetter1.0 intSslErrorIgnoreFlags 13056 13056 ignorar todos erram, 0 não aceitar blnEnableRedirects err blnEnableHttpsToHttpRedirects verdadeiro verdadeiro Set objWinHttp CreateObject (WinHttp. WinHttpRequest.5.1) objWinHttp. SetTimeouts lngTimeout, lngTimeout, lngTimeout, lngTimeout objWinHttp. Option (0) strUserAgentString objWinHttp. Option (4) intSslErrorIgnoreFlags objWinHttp. Option (6) blnEnableRedirects objWinHttp. Option (12) blnEnableHttpsToHttpRedirects objWinHttp. Open strMethod, strURL, False Se strMethod POST Então objWinHttp. setRequestHeader Content-type, applicationx-www-form-urlencoded End If objWinHttp. Enviar (strPostData) Se (objWinHttp. Status 200) Então BinaryGetURL objWinHttp. ResponseBody End If Set objWinHttp Nothing End Function Function SaveBinaryData (arrByteArray, strFileName) Se VarType (arrByteArray) gt 8192 Então Dim objBinaryStream Set objBinaryStream CreateObject (ADODB. Stream) objBinaryStream. Tipo 1 objBinaryStream. Open () ObjBinaryStream. Write (arrByteArray) objBinaryStream. SaveToFile strFileName, 2 End If End FunctionWeb Métodos de download binário Aqui está o método usual de realizar um download binário por HTTP. Ele tenta quatro diferentes objetos de download binário, e tem dois métodos separados para salvar o binário no disco. Bastante à prova de balas: estava jogando ao redor e encontrei outras maneiras de usar o sistema para fazer um arquivo WSC de download binário: você não precisa registrar arquivos WSC. Em vez disso, você pode especificar sua localização em seu script. Você pode até especificar uma localização HTTP. O arquivo é baixado automaticamente e acaba em seu cache do IE. Se você especificar algo diferente de um arquivo WSC real como destino, ele será baixado e executado como um script. O que vai lançar um erro Então, basta bloquear o erro: No resumo do erro Próximo script GetObject: ericphelpsimagelogo1.gif O código acima é o código VBS comum. Nada a ver com os arquivos WSC, exceto que o método GetObject com o script: o protocolo é NORMALMENTE usado para obter um arquivo WSC. Usamos isso aqui para obter outra coisa. O código VBS acima irá baixar um gráfico da minha página da Web e soltá-lo no cache do IE. Para localizar o arquivo no cache, use um código semelhante a este: Na vida real, você quer pesquisar o cache FIRST, excluir as correspondências encontradas e, em seguida, baixar o arquivo que você deseja. Então, o que quer que você encontre no cache, certamente será o que você deseja. Arquivo WSF: se você escrever seu código VBS em arquivos WSH em vez de em arquivos VBS, você precisa especificar mais opções. Incluindo onde obter código externo: ltjobgt ltscript languagevbscript srcericphelpsimagelogo1.gifgt ltjobgt Infelizmente, isso trava todo o arquivo FSM, então você precisa ter seu arquivo VBS criar ou usar um arquivo FSM como o acima e executá-lo com wsh. Run ou wsh. Exec, então seu código principal irá sobreviver. Experimente algo como esse código VBS: É importante que o wsh. Run aconteça com CSCRIPT. EXE como o motor em execução e que ele seja executado com zero como tipo de janela. Quando o arquivo WSF lança seu erro, se o mecanismo fosse wscript, ele exibiria uma caixa de diálogo de erro. Isso é ruim. Ao usar o mecanismo cscript, o erro simplesmente é escrito na caixa do DOS. E, configurando o tipo de janela para zero, ninguém vê a caixa do DOS. E com certeza, o arquivo logo1.gif apareceria no seu cache do IE. Mais uma vez, uma vez que o arquivo está no seu cache, use um código semelhante às funções FindInCache e SearchForFile que mostrei acima acima mencionadas acima para localizar seu arquivo. Greetings para todos. Por alguns dias, codifiquei um pequeno aplicativo que usa WinHTTP, e este fórum tem sido uma ótima ajuda para questios comuns. Agora eu tenho uma função de trabalho que baixa um arquivo de texto via WinHTTP. O problema é que eu preciso fazer um download binário. Eu modifiquei meu código de download de texto para ver se ele funcionou, mas não. Estou usando uma versão modificada do código de exemplo: DWORD dwSize 0 DWORD dwDownloaded 0 LPSTR pszOutBuffer BOOL bResults FALSE HINTERNET hSession NULL, hConnect NULL, hRequest NULL Use WinHttpOpen para obter um identificador de sessão. HSession WinHttpOpen (LquotWinHTTP Example1.0quot, WINHTTPACCESSTYPEDEFAULTPROXY, WINHTTPNOPROXYNAME, WINHTTPNOPROXYBYPASS, 0) Especifique um servidor HTTP. Se (hSession) hConnect WinHttpConnect (hSession, Lquotmicrosoft quot, INTERNETDEFAULTHTTPSPORT, 0) Crie um identificador de solicitação HTTP. Se (hConnect) hRequest WinHttpOpenRequest (hConnect, LquotGETquot, NULL, NULL, WINHTTPNOREFERER, WINHTTPDEFAULTACCEPTTYPES, WINHTTPFLAGSECURE) Envie uma solicitação. Se (hRequest) bResults WinHttpSendRequest (hRequest, WINHTTPNOADDITIONALHEADERS, 0, WINHTTPNOREQUESTDATA, 0, 0, 0) Termine o pedido. Se (bResults) bResults WinHttpReceiveResponse (hRequest, NULL) Mantenha a verificação de dados até não haver mais nada. Se (bResults) fazer Verifique os dados disponíveis. DwSize 0 if (WinHttpQueryDataAvailable (hRequest, ampdwSize)) printf (quotError u in WinHttpQueryDataAvailable. nquot, GetLastError ()) Alocar espaço para o buffer. PszOutBuffer novo chardwSize1 se (pszOutBuffer) printf (quotOut of memorynquot) dwSize0 else Leia os dados. ZeroMemory (pszOutBuffer, dwSize1) se (WinHttpReadData (hRequest, (LPVOID) pszOutBuffer, dwSize, ampdwDownloaded)) printf (quotError u in WinHttpReadData. nquot, GetLastError ()) else printf (quotsquot, pszOutBuffer) Libera a memória alocada para o buffer. Delete pszOutBuffer enquanto (dwSize gt 0) Denuncie quaisquer erros. Se (bResults) printf (quotError d ocorreu. nquot, GetLastError ()) Feche todas as alças abertas. Se (hRequest) WinHttpCloseHandle (hRequest) se (hConnect) WinHttpCloseHandle (hConnect) se (hSession) WinHttpCloseHandle (hSession) Qualquer sugestão de como fazer este código funcionar com downloads binários Estou pensando em algum arquivo ofstream com ios :: binário, mas eu não pude faça funcionar. Agradecemos antecipadamente. Funciona agora. Eu tive que abrir o arquivo em modo binário: assim, pode-se baixar um resource, mantendo o código de exemplo MSDN intacto. As únicas adições estão abrindo um arquivo, escrevendo para ele usando fwrite (no lugar do printf para stdout) e fechando o arquivo. Observe também que a URL do recurso deve ser dividida manualmente no host e no caminho e cada parte dessa informação passou para duas chamadas de API diferentes. Por exemplo, se você aponta para o rosource da seguinte maneira: então certifique-se de passar algo apenas para WinHttpConnect e folderfile. xyz WinHttpOpenRequest. E não funcionará se você passar um objeto de corrente para uma API WinHTTP. Use buffers de plano char. E, em seguida, escreva o buffer para seus fluxos. Isso funcionará. Sábado, 17 de maio de 2008 9:26 Re: Download binário com WinHTTP Eu vou marcar esse tópico como respondido, pois você não seguiu com mais informações sobre seu problema conforme solicitado - Eu suponho que você resolveu o problema sozinho ou um Das sugestões neste tópico ajudaram você a resolver o problema. Se você tiver uma solução, pode publicá-la para que outros possam encontrá-la. Se você não tiver uma solução, então envie mais detalhes e marque o tópico como sem resposta. Sexta-feira, 09 de maio de 2008 8:56 Eu acho que o problema está na seguinte declaração, printf (quotsquot, pszOutBuffer) Parará de proceder mais após a primeira ocorrência de 0, ou seja, um byte com valor numérico 0. Em vez disso, escreva diretamente o pszOutBuffer no arquivo. Sexta-feira, 09 de maio de 2008 5:56 PM Eu tenho um problema idêntico. Agora podemos avançar para concluir a discussão. Eu também estou usando a amostra WinHttp do MSDN e quero baixar uma imagem (jpeg, gif, png.). Mantendo o código inalterado (ou seja, passando WINHTTPDEFAULTACCEPTTYPES para WinHttpOpenRequest) Estou usando fwrite para gravar em um arquivo no disco. No código, eu log o valor do parâmetro dwDownloaded passado para WinHttpReadData. Eu também registro os bytes escritos por fwrite: fwrite (pszDataBuffer, (sizet) dwDownloaded, (sizet) 1, fp) Ambos combinam e também correspondem ao tamanho da imagem residente no servidor web, que estou fazendo o download. Mas o arquivo baixado não abre em um visualizador de imagens como uma imagem. Além disso, o tamanho desse arquivo baixado no disco é quase o dobro do tamanho real. Como é que vem e por que os dados escritos não são um arquivo de imagem As etapas acima não funcionaram, passei uma matriz de seqüências terminadas em zero para WinHttpOpenRequest, desta maneira: for (int i0 ilt10 i) ZeroMemory (mediatypesi, 20) StringCchCopy ( mediatypes0, 20, Lquottexthtmlquot) StringCchCopy (mediatypes1, 20, Lquotimagepjpegquot) StringCchCopy (mediatypes2, 20, Lquotimagegifquot) WinHttpOpenRequest (hConnect, LquotGETquot, resourcePath, null, WINHTTPNOREFERER, (LPCWSTR) mediatypes, WINHTTPFLAGBYPASSPROXYCACHE) eo correspondente enviar solicitação de chamada é (inalterado ): WinHttpSendRequest (hRequest, WINHTTPNOADDITIONALHEADERS, 0, WINHTTPNOREQUESTDATA, 0, 0, 0) Desta vez WinHttpSendRequest falha com o seguinte erro: 87: Parâmetro incorreto. Se o erro funciona agora. Eu tive que abrir o arquivo em modo binário: assim, pode-se baixar um resource, mantendo o código de exemplo MSDN intacto. As únicas adições estão abrindo um arquivo, escrevendo para ele usando fwrite (no lugar do printf para stdout) e fechando o arquivo. Observe também que a URL do recurso deve ser dividida manualmente no host e no caminho e cada parte dessa informação passou para duas chamadas de API diferentes. Por exemplo, se você aponta para o rosource da seguinte maneira: então certifique-se de passar algo apenas para WinHttpConnect e folderfile. xyz WinHttpOpenRequest. E não funcionará se você passar um objeto de corrente para uma API WinHTTP. Use buffers de plano char. E, em seguida, escreva o buffer para seus fluxos. Isso funcionará. Sábado, 17 de maio de 2008 9:26

No comments:

Post a Comment