VBA WinHTTP pour télécharger le fichier de mot de passe protégé site https
Je suis en train d'enregistrer un fichier de mot de passe https site protégé à l'aide de WinHTTP. Voici le code:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:\myfile.xls"
myuser = "username"
mypass = "password"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "GET", fileUrl, False
WHTTP.SetCredentials myuser, mypass, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Le problème est avec l'authentification. Le fichier est sauvegardé, mais quand je l'ouvre dans Excel c'est juste le html page d'ouverture de session au lieu de la taille réelle du fichier. Si je copie le fichier directement url et la coller dans le navigateur addressbar et je ne suis pas connecté à la page web de l'effet est le même. Je me suis présenté à la page d'ouverture de session. Alors, si j'entre mon identifiant et mon mot de passe de la fenêtre de téléchargement s'affichera me permettant d'enregistrer le fichier.
Donc je pense que SetCredentials partie du code ne fonctionne pas correctement cause si je debug.imprimer WHTTP.ResponseBody c'est du code html à la place de la acutal fichier de données.
Est-il un moyen de passer l'id utilisateur et le mot de passe pour le WinHTTP pour que je puisse être en mesure de bien enregistrer le fichier?
Voici l'adresse de la page:
https://sst.msde.state.md.us/
=======================MODIFIER:========================
J'ai donc joué un peu avec elle aujourd'hui et je pense que je vais aller de l'avant. Voici ce que j'ai. Je Modyfied le code comme ceci:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:\myfile.xls"
myuser = "username"
mypass = "password"
strAuthenticate = "start-url=%2F&user=" & myuser & "&password=" & mypass & "&switch=Log+In"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "POST", fileUrl, False
WHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.Send strAuthenticate
WHTTP.Open "GET", fileUrl, False
WHTTP.Send
Debug.Print WHTTP.GetAllResponseHeaders()
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Quand Je Debug.Imprimer WHTTP.GetAllResponseHeaders (), j'ai par exemple:
Accept-Ranges: bytes
Content-Disposition: attachement; filename="xxx"
Content-Length: xxxxxx
Content-Type: application/octet-stream
Donc, je pense que l'authentification fonctionne, mais je ne peux toujours pas enregistrer le fichier. Quand je continue avec:
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
Le contenu du fichier enregistré est la page html elle-même, mais pas le fichier.
Fait je ne l'authentification droite et le problème est avec l'enregistrement du fichier sur le disque ou encore est-il un problème avec l'authentification et c'est pourquoi je ne peux pas l'enregistrer? Toute indices?
Utilisation POST/GET, où/comment? Je l'utilise dans mon code juste avant de définir les informations d'identification, mais il ne fonctionne pas. Toutes les suggestions?
Cette réponse: stackoverflow.com/questions/891427/... peut être utile. A côté de cela, vous pouvez automatiser la page de connexion par IE, inscrivez votre nom d'utilisateur et le mot de passe, puis accédez à la page pour obtenir les informations dont vous avez besoin.
J'ai déjà automatisé de l'ouverture de session pour obtenir le fichier directement les url à la première place. Mais je veux être en mesure de télécharger le fichier "silencieusement", sans un pop-up de téléchargement de windows. Obtenir WHTTP.ResponseBody fonctionne très bien pour les autres nonpassprotected sites et pour certains passprotected http sites ainsi. Le problème, c'est avec ce site en https. Et BTW, j'ai utiliser IE pour celui-ci.
Edit: en Regardant le code html du site web que j'ai fourni est-il possible de comprendre quelle méthode doit être utilisée pour transmettre le nom d'utilisateur et le mot de passe et bien télécharger le fichier?
OriginalL'auteur user2267971 | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
Ok, je l'ai fait. Voici le code:
Merci à tous pour votre aide.
BTW j'ai trouvé cette messages très utiles:
http://www.mrexcel.com/forum/excel-questions/353006-download-file-excel.html
Ne pas comprendre pourquoi WinHTTP ne PAS authentifier certains HTTPS ressources
Comment analyser ligne par ligne WinHTTP réponse: codé en UTF-8 CSV?
OriginalL'auteur user2267971