Avatar billede Jørgen Kirkegaard Professor
22. oktober 2020 - 14:06 Der er 7 kommentarer og
1 løsning

Læse streng fra nettet, som giver filnavn. Powershell?

Jeg skal hente indholdet af en fil på nettet. Filnavnet, som ændres løbende, gives her på denne adresse, og jeg skal således læse denne streng for at få navnet:

https://leidata-preview.gleif.org/api/v2/golden-copies/publishes

I powershell er det nemt:
powershell wget 'https://leidata-preview.gleif.org/api/v2/golden-copies/publishes' -outfile data.txt

Jeg kunne starte et dos prompt med SHELL, men Access fortsætter jo, uden SHELL er færdig. Så skulle jeg teste på, om data er fundet osv osv.
Er der ikke en nemmere måde i Access?
Til info er strengen lige nu
{"data":[{"publish_date":"2020-10-22 08:00:00","lei2":{"type":"lei2","publish_date":"2020-10-22 08:00:00","full_file":{"csv":{"type":"lei2","format":"csv","record_count":1729054,"size":185501253,"size_human_readable":"176.91 MB","delta_type":"GoldenCopy","url":"https:\/\/leidata-preview.gleif.org\/storage\/golden-copy-files\/2020\/10\/22\/404909\/20201022-0800-gleif-goldencopy-lei2-golden-copy.csv.zip"},"js ....

For at være mere præcis er det altså filnavnet, jeg skal bruge, så det må gerne være svaret, men ellers henter jeg det selv ud fra strengen. Altså her er det:
https:\\leidata-preview.gleif.org\storage\golden-copy-files\2020\10\22\404909\20201022-0800-gleif-goldencopy-lei2-golden-copy.csv.zip
og det ændrer sig løbende...

Det er meget ligetil og meget besværligt beskrevet :-).
Any clues?
Avatar billede Gustav Ekspert
22. oktober 2020 - 14:33 #1
I vores project VBA.CVRAPI:

https://github.com/CactusData/VBA.CVRAPI

både hentes og parses en Json-streng.
Du kan nok ikke bruge funktionerne direkte til at fiske dit filnavn ud, men det skulle give et godt startpunkt.
Det er RetrieveDataResponse, der er kernefunktionen:

' Retrieve a Json response from a service URL.
' Retrieved data is returned in parameter ResponseText.
'
' Returns True if success.
'
Public Function RetrieveDataResponse( _
    ByVal ServiceUrl As String, _
    ByRef ResponseText As String, _
    Optional ByVal UserAgent As String) _
    As Boolean

    ' ServiceUrl is expected to have URL encoded parameters.
   
    ' User defined constants.
    Const DefaultUserAgent  As String = "Min organisation - Mit projekt"
    ' Fixed constants.
    Const Async            As Boolean = False
    Const StatusOk          As Integer = 200
    Const StatusNotFound    As Integer = 404
   
    ' Engine to communicate with the Json service.
    Dim XmlHttp            As XMLHTTP60
   
    Dim Result              As Boolean
 
    On Error GoTo Err_RetrieveDataResponse
   
    Set XmlHttp = New XMLHTTP60
   
    If UserAgent = "" Then
        ' Set default string for User-Agent.
        UserAgent = DefaultUserAgent
    End If
   
    XmlHttp.Open "GET", ServiceUrl, Async
    XmlHttp.setRequestHeader "User-Agent", UserAgent

    XmlHttp.send

    ResponseText = XmlHttp.ResponseText
    Select Case XmlHttp.status
        Case StatusOk
            Result = True
        Case StatusNotFound
            ' Special case for CVRAPI which returns 404 and a valid Json error message:
            ' {"error":"NOT_FOUND","t":0,"version":6}
            If _
                InStr(1, ResponseText, "{", vbBinaryCompare) = 1 And _
                InStr(1, ResponseText, "error", vbBinaryCompare) = 3 And _
                InStr(1, ResponseText, "}", vbBinaryCompare) = 39 Then
                ' Json error message received.
                Result = True
            End If
    End Select
    If Result = False Then
        If ResponseText = "" Then
            ResponseText = XmlHttp.statusText
        End If
        ResponseText = CStr(XmlHttp.status) & ":" & vbCrLf & ResponseText
    End If
   
    RetrieveDataResponse = Result

Exit_RetrieveDataResponse:
    Set XmlHttp = Nothing
    Exit Function

Err_RetrieveDataResponse:
    MsgBox "Error" & Str(Err.Number) & ": " & Err.Description, vbCritical + vbOKOnly, "Web Service Error"
    Resume Exit_RetrieveDataResponse

End Function
Avatar billede terry Ekspert
22. oktober 2020 - 15:03 #2
Simple example to download file here, found on YouTube

Option Explicit
'Tutorial link: https://youtu.be/H4-w6ULc_qs
#If VBA7 Then
  Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
    "URLDownloadToFileA" (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal _
      szFileName As String, ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As LongPtr
#Else
  Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
    "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
      szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If

Function download_file()
'-----------------------------
'Thanks for downloading the code.
'Please visit our channel for a quick explainer on how to use this code.
'Feel free to update the code as per your need and also share with your friends.
'Download free codes from http://vbaa2z.blogspot.com
'Support our channel: youtube.com/vbaa2z
'Author: L Pamai (vbaa2z.team@gmail.com)
'-----------------------------

Dim downloadStatus As Variant
Dim url As String
Dim destinationFile_local As String

url = "https://leidata-preview.gleif.org/api/v2/golden-copies/publishes"

destinationFile_local = "C:\Users\Terry\Downloads\" & fileName(url)

downloadStatus = URLDownloadToFile(0, url, destinationFile_local, 0, 0)

If downloadStatus = 0 Then
    MsgBox "Downloaded Succcessfully!"
    Else
    MsgBox "Download failed"
End If

End Function

Function fileName(file_fullname) As String

    fileName = Mid(file_fullname, InStrRev(file_fullname, "/") + 1)

End Function
Avatar billede Gustav Ekspert
22. oktober 2020 - 15:16 #3
Det er ikke en fil, der skal downloades.
Det er et filnavn, der skal findes i en streng med Json-data. Der er ingen grund til at skrive denne streng til en fil.
Avatar billede terry Ekspert
22. oktober 2020 - 15:31 #4
If your code does whats required then no problem Gustav ;-)
Avatar billede Jørgen Kirkegaard Professor
22. oktober 2020 - 15:35 #5
Gustav - jeg skal lige tygge mig igennem koden. Jeg skulle jo gerne kunne vedligeholde den, og jeg skal øjensynligt også trylle lidt mere for at få det til at virke.
Filen er en zipfil og skal faktisk downloades og unzippes efterfølgende.
Avatar billede Gustav Ekspert
22. oktober 2020 - 16:00 #6
Ja. Da kan du med fordel bruge function DownloadCacheFile i modulet Internet.bas i mit projekt VBA.PictureURL:

https://github.com/GustavBrock/VBA.PictureUrl

og funktionen UnZip fra et andet project, VBA.Compress:

https://github.com/GustavBrock/VBA.Compress

Med hensyn til trylleriet, er det sandt nok, især hvad angår Json. Her er et andet eksempel:

https://github.com/GustavBrock/VBA.CurrencyCode
Avatar billede terry Ekspert
22. oktober 2020 - 17:18 #7
Some nice usefull links there Gustav.

Once you have downloaded the file you can use the Instr() function to extract the filename which can then be downloaded ready to unzip
Avatar billede Jørgen Kirkegaard Professor
22. oktober 2020 - 19:12 #8
Gustav, det ser cool ud. Jeg tjekker det ud senere, når jeg er blevet træt af min høkerløsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester