freshman2017
Goto Top

CURL - POST - GET - Batch - Sendungstracking

Liebe Gemeinde,

ich arbeite gerade an einem Tracking-Skript (mithilfe von Trackingmore), um Paketsendungen zu tracken. Hierzu habe nachfolgende cURL Abfrage in einer Batch, um die Paketsendungen zunächst zu registrieren (POST-Befehl):

@echo off
curl -X POST -k "https://api.trackingmore.com/v3/trackings/create" -H "Content-Type:application/json" -H "Tracking-Api-Key:XXXXXXXXXXXXX" -d "[{\"tracking_number\":\"01425083170XXX\",\"courier_code\":\"**dpd-de**\",\"lang\":\"de\"}]"  

Die API gibt dabei zurück:

{"code":200,"message":"Request response is successful","data":{"success":[{"tracking_number":01425083170XXX","courier_code":"dpd-de","id":"6be373242fa7d5de0e10fe8e908518a9"}],"error":}}  

Für die POST-Anfrage habe ich eine Input TXT Datei:

DPD Standard;01425083170XXX;dpd-de;
DPD Standard;01325083170XXX;dpd-de;
DPD Standard;01325183170XXX;dpd-de;

Jetzt würde ich gerne für den POST eine Output TXT Datei, die wie folgt aufgebaut ist, haben:

DPD Standard;01425083170XXX;dpd-de;True;Kompletter Datenstring (API-Rückmeldung von oben);
DPD Standard;01325083170XXX;dpd-de;True;Kompletter Datenstring (API-Rückmeldung von oben);
DPD Standard;01325183170XXX;dpd-de;True;Kompletter Datenstring (API-Rückmeldung von oben);

Wie bekomme ich in einer Batch mehrere cURL Abfragen hin, die sich die Daten "Fett" dargestellt, in einer Schleife o.ä. automatisch ziehen.

Um den aktuellen Sendungsstatus zu bekommen, nutze ich folgende Batch (GET-Befehl):

@echo off
curl -X GET -k "https://api.trackingmore.com/v3/trackings/get?tracking_numbers=**01425083170XXX**" -H "Content-Type:application/json" -H "Tracking-Api-Key:XXXXXXXXXXXXX"  

Die API gibt dabei zurück:

{"code":200,"message":"Request response is successful","data":[{"id":"84a3647272a7f3a2d4312eb8b91dcace","tracking_number":"**01425083170XXX**","courier_code":"dpd-de","order_number":null,"delivery_status":"pickup","archived":false,"updating":true,"created_at":"2022-09-06T08:13:14+00:00","update_date":"2022-09-06T08:13:18+00:00","shipping_date":null,"customer_name":null,"customer_email":null,"customer_phone":null,"title":null,"logistics_channel":null,"note":null,"destination":null,"original":null,"service_code":null,"weight":null,"substatus":"pickup001","status_info":null,"previously":null,"destination_track_number":null,"exchangeNumber":null,"consignee":null,"scheduled_delivery_date":null,"Scheduled_Address":null,"latest_event":"Out for delivery.,Gudensberg (DE),2022-09-06 08:21:49","lastest_checkpoint_time":"2022-09-06T08:21:49+00:00","transit_time":1,"stay_time":1,"origin_info":{"courier_code":"dpd-de","courier_phone":null,"weblink":"https:\/\/tracking.dpd.de\/status\/gb_GB\/404","reference_number":null,"received_date":"2022-09-05 19:20:25","dispatched_date":null,"departed_airport_date":null,"arrived_abroad_date":null,"customs_received_date":null,"arrived_destination_date":null,"trackinfo":[{"checkpoint_date":"2022-09-06 08:21:49","tracking_detail":"Out for delivery.","location":"Gudensberg (DE)","checkpoint_delivery_status":"pickup","checkpoint_delivery_substatus":"pickup001"},{"checkpoint_date":"2022-09-06 06:11:17","tracking_detail":"At parcel delivery centre.","location":"Gudensberg (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 23:24:16","tracking_detail":"In transit.","location":"Hagen (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 19:20:25","tracking_detail":"In transit.","location":"Wuppertal (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 07:05:34","tracking_detail":"Order information has been transmitted to DPD.","location":"DPD data centre","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"notfound001"}]},"destination_info":{"courier_code":null,"courier_phone":null,"weblink":null,"reference_number":null,"received_date":null,"dispatched_date":null,"departed_airport_date":null,"arrived_abroad_date":null,"customs_received_date":null,"arrived_destination_date":null,"trackinfo":}}]}  

Für die GET-Anfrage habe ich eine Input TXT Datei:

DPD Standard;01425083170XXX;dpd-de;
DPD Standard;01325083170XXX;dpd-de;
DPD Standard;01325183170XXX;dpd-de;

Jetzt würde ich gerne für den POST eine Output TXT Datei, die wie folgt aufgebaut ist, haben:

DPD Standard;01425083170XXX;dpd-de;delivery_status von aus der GET-Abfrage -> bspw: pickup;;substatus aus der GET-Abfrage -> bspw: pickup001;Kompletter Datenstring (API-Rückmeldung von oben);
DPD Standard;01325083170XXX;dpd-de;delivery_status von aus der GET-Abfrage -> bspw: pickup;;substatus aus der GET-Abfrage -> bspw: pickup001;Kompletter Datenstring (API-Rückmeldung von oben);
DPD Standard;01325183170XXX;dpd-de;delivery_status von aus der GET-Abfrage -> bspw: pickup;;substatus aus der GET-Abfrage -> bspw: pickup001;Kompletter Datenstring (API-Rückmeldung von oben);

Wie bekomme ich in einer Batch mehrere cURL Abfragen hin, die sich die Daten "Fett" dargestellt, in einer Schleife o.ä. automatisch ziehen.

Content-ID: 3856079105

Url: https://administrator.de/contentid/3856079105

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Crusher79
Crusher79 06.09.2022 um 14:49:40 Uhr
Goto Top
Hallo,

würde API nur noch mit PowerShell konsumieren .Alles andere ist umständlich. Egal ob plain-text, XML oder JSON - man kann die Antwort sofort verweten.

https://jsonformatter.curiousconcept.com/#

Gibt deine Antwort mal dort ein. Dann siehst du was ich meine. Da ist so einiges enthalten. An die JSON Elemente komst du mit PS besser ran. Kannst einzelne entnehmen und irgendwo wieder einbauen....

Du müsstest nur curl durch invoke-webrequest ersetzen und ein bissel was rum bauen.

Sehe gerade: Ohne Auth kommt Fehlermeldung. Aber auch in JSON. data ist dann leer. Würde aber ggf. zum erstellen reichen. Es sei denn du bestehst auf Batch.

mfg Crushser
freshman2017
freshman2017 06.09.2022 um 14:59:47 Uhr
Goto Top
Zitat von @Crusher79:

Hallo,

würde API nur noch mit PowerShell konsumieren .Alles andere ist umständlich. Egal ob plain-text, XML oder JSON - man kann die Antwort sofort verweten.

https://jsonformatter.curiousconcept.com/#

Gibt deine Antwort mal dort ein. Dann siehst du was ich meine. Da ist so einiges enthalten. An die JSON Elemente komst du mit PS besser ran. Kannst einzelne entnehmen und irgendwo wieder einbauen....

Du müsstest nur curl durch invoke-webrequest ersetzen und ein bissel was rum bauen.

Sehe gerade: Ohne Auth kommt Fehlermeldung. Aber auch in JSON. data ist dann leer. Würde aber ggf. zum erstellen reichen. Es sei denn du bestehst auf Batch.

mfg Crushser

Hallo Crushser,

mit Powershell kenne ich mich nur sehr wenig aus, wie würde es denn in Powershell aussehen?
Crusher79
Crusher79 06.09.2022 aktualisiert um 15:19:51 Uhr
Goto Top
Suche greade Beispiel. Trackingmore fliegt mir gerade um die Ohren. Hab ja keine Key.

Die haben PHP, Python C# Beispiele. Alles gut. Nur kenne das System nicht. Und ob Test-Account was liefert.

Die Tracking Number kommt normal auch in eine Variable. Die ersten beiden Schnipsel dienen den SSL Handling. Sind nicht immer notwendig.

Ist nur fix zusammen kopiert.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Tls11,Tls12'  

add-type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

    [string]$TrackingURL = "https://api.trackingmore.com/v3/trackings/get?tracking_numbers=**01425083170XXX**"  
    [string]$headerAPIkey = "XXXXXXXXXXXXX"  
    
    $ResponseJSON = Invoke-WebRequest $TrackingURL -Method Get -Headers @{"Tracking-Api-Key"="$headerAPIkey";} -ContentType "application/json" -TimeoutSec 2  
    $j = $ResponseJSON | ConvertFrom-Json
    $j.code

Antwort:
Hier mal in $j reinlaufen lassen.

$j.code = "412" <- liefert in dem Fall den Code der Antwort zurück. 412, weil eben nocho fehlerhaft.

So ungefähr könnte es aussehen.
tacking
freshman2017
freshman2017 06.09.2022 um 15:23:41 Uhr
Goto Top
OK - ich verstehe da gerade nur Bahnhof, ist der Code oben jetzt Powershell?

Ich arbeite da auch mit einem TEST-Api Key.

Zitat von @Crusher79:

Suche greade Beispiel. Trackingmore fliegt mir gerade um die Ohren. Hab ja keine Key.

Die haben PHP, Python C# Beispiele. Alles gut. Nur kenne das System nicht. Und ob Test-Account was liefert.

Die Tracking Number kommt normal auch in eine Variable. Die ersten beiden Schnipsel dienen den SSL Handling. Sind nicht immer notwendig.

Ist nur fix zusammen kopiert.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Tls11,Tls12'  

add-type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

    [string]$TrackingURL = "https://api.trackingmore.com/v3/trackings/get?tracking_numbers=**01425083170XXX**"  
    [string]$headerAPIkey = "XXXXXXXXXXXXX"  
    
    $ResponseJSON = Invoke-WebRequest $TrackingURL -Method Get -Headers @{"Tracking-Api-Key"="$headerAPIkey";} -ContentType "application/json" -TimeoutSec 2  
    $j = $ResponseJSON | ConvertFrom-Json
    $j.code

Antwort:
Hier mal in $j reinlaufen lassen.

$j.code = "412" <- liefert in dem Fall den Code der Antwort zurück. 412, weil eben nocho fehlerhaft.

So ungefähr könnte es aussehen.
Crusher79
Crusher79 06.09.2022 um 15:48:21 Uhr
Goto Top
Hab mich mal angemeldet. Bzw. auf deren Tool Seite sind ja die Dummy Daten hinten.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Tls11,Tls12'  

add-type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

    [string]$TrackingURL = "https://api.trackingmore.com/v3/trackings/courier"  
    [string]$headerAPIkey = "o0txcyra-xxx-xf2p-arkr-xxxxxxxxxx"  
    
    $ResponseJSON = Invoke-WebRequest $TrackingURL -Method Get -Headers @{"Tracking-Api-Key"="$headerAPIkey"} -ContentType "application/json" -TimeoutSec 2  
    $j = $ResponseJSON | ConvertFrom-Json 
    $couriers = $j.data
 
    ForEach ($Courier in $couriers) {$Courier.courier_name}

Liefert hier nur die Namen aller Kuriere. Sind mein ich über 1.000 Stück. So ungefährt wäre es auch in deinen Fall. Finde nur grad nichts für Bestell Tracking. Hab die Seite nur überflogen. Aber so z.B. würde es mit Invoke-Webrequest aussehen.
tracking_courer
freshman2017
freshman2017 06.09.2022 um 15:55:53 Uhr
Goto Top
Ich frage mich gerade, wie es sauber mit meinem Input / Output hinbekommen könnte ?

Zitat von @Crusher79:

Hab mich mal angemeldet. Bzw. auf deren Tool Seite sind ja die Dummy Daten hinten.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Tls11,Tls12'  

add-type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

    [string]$TrackingURL = "https://api.trackingmore.com/v3/trackings/courier"  
    [string]$headerAPIkey = "o0txcyra-xxx-xf2p-arkr-xxxxxxxxxx"  
    
    $ResponseJSON = Invoke-WebRequest $TrackingURL -Method Get -Headers @{"Tracking-Api-Key"="$headerAPIkey"} -ContentType "application/json" -TimeoutSec 2  
    $j = $ResponseJSON | ConvertFrom-Json 
    $couriers = $j.data
 
    ForEach ($Courier in $couriers) {$Courier.courier_name}

Liefert hier nur die Namen aller Kuriere. Sind mein ich über 1.000 Stück. So ungefährt wäre es auch in deinen Fall. Finde nur grad nichts für Bestell Tracking. Hab die Seite nur überflogen. Aber so z.B. würde es mit Invoke-Webrequest aussehen.
3803037559
3803037559 06.09.2022 aktualisiert um 16:13:48 Uhr
Goto Top
$url = 'https://api.trackingmore.com/v3/trackings/create'  
$inputfile = '.\input.csv'  
$outputfile = '.\output.csv'  
$APIKEY = 'XXXXXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100 -Compress  
    $response = Invoke-RestMethod $url -Method Post -Body $body -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Response';e={$response | ConvertTo-JSON -Depth 100 -Compress}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append  
}
Cheers
certguy
Crusher79
Crusher79 06.09.2022 um 16:09:12 Uhr
Goto Top
https://www.trackingmore.com/api-tools-de.html

https://www.trackingmore.com/v3/api-tools.html

Das ist jetzt nur mal ein Beispiel oben gewesen!

Bei v3 wird scheinbar "test" Key gesetzt. Du kansnt aber damit arbeiten, und sehen ob du mit dem Aufruf und den Antworten klar kommst.

Die Antwort kannst du dann in Dateien schreiben, Umformatieren etc. etc. Nimm doch ruhig die Kuriere als Beispiel. Leider bekomme ich gerade dein Beispiel nicht nachgebaut. Bzw. ist die Anfrage OK aber die Daten sind leer.


Ich würde an deiner Stelle mal oben den Abruf der Kuriere nachbauen und schauen was so geht und ob das überhaupt was für dich ist.
tacking_dpd
freshman2017
freshman2017 06.09.2022 um 16:14:05 Uhr
Goto Top
Hey Certguy,

wie würde es denn für das Get aussehen?

Zitat von @3803037559:

$url = 'https://api.trackingmore.com/v3/trackings/create'  
$inputfile = '.\input.csv'  
$outputfile = '.\output.csv'  
$APIKEY = 'XXXXXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100  
    $response = Invoke-RestMethod $url -Method Post -Body $body -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Response';e={$response | ConvertTo-JSON -Depth 100 -Compress}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append  
}
Cheers
certguy
3803037559
3803037559 06.09.2022 aktualisiert um 16:17:29 Uhr
Goto Top
Zitat von @freshman2017:
wie würde es denn für das Get aussehen?
Also wenn du das nun mit der Steilvorlage nicht selbst schaffst , pfff .... Dienstags-Basar ...
freshman2017
freshman2017 06.09.2022 um 16:19:55 Uhr
Goto Top
Wenn Du mir da nochmal helfen könntest, wäre super face-smile


Zitat von @3803037559:

Zitat von @freshman2017:
wie würde es denn für das Get aussehen?
Also wenn du das nun mit der Steilvorlage nicht selbst schaffst , pfff .... Dienstags-Basar ...
3803037559
Lösung 3803037559 06.09.2022 aktualisiert um 16:43:16 Uhr
Goto Top
$url_post = 'https://api.trackingmore.com/v3/trackings/create'  
$url_get = 'https://api.trackingmore.com/v3/trackings/get'  
$inputfile = '.\input.csv'  
$outputfile = '.\output.csv'  
$APIKEY = 'XXXXXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    "20202020202020202020202020202020202020202020202020206F6F6F6F2424242424242424242424246F6F6F6F1F1F202020202020202020202020202020202020202020206F6F2424242424242424242424242424242424242424242424246F1F1F202020202020202020202020202020202020206F6F2424242424242424242424242424242424242424242424242424242424246F2020202020202020206F242020202424206F241F1F2020206F2024206F6F20202020202020206F2424242424242424242424242424242424242424242424242424242424242424242424246F2020202020202024242024242024246F241F1F6F6F202420242022242020202020206F2424242424242424242020202024242424242424242424242424202020202424242424242424246F202020202020202424246F24246F241F1F222424242424246F2420202020206F2424242424242424242020202020202424242424242424242424202020202020242424242424242424246F2020202024242424242424241F1F202024242424242424202020202424242424242424242424202020202020242424242424242424242420202020202024242424242424242424242424242424242424242424241F1F20202424242424242424242424242424242424242424242424202020202424242424242424242424242420202020242424242424242424242424242420202222222424241F1F2020202224242422222222242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242020202020222424241F1F202020202424242020206F24242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242020202020222424246F1F1F2020206F242422202020242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424202020202020202424246F1F1F202020242424202020202424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242220222424242424246F6F6F6F6F242424246F1F1F20206F2424246F6F6F6F24242424242020242424242424242424242424242424242424242424242424242424242424242424242424242020206F24242424242424242424242424242424241F1F2020242424242424242422242424242020202424242424242424242424242424242424242424242424242424242424242424242420202020202424242422222222222222221F1F20222222222020202020202024242424202020202224242424242424242424242424242424242424242424242424242424222020202020206F2424241F1F202020202020202020202020222424246F2020202020222222242424242424242424242424242424242424222424222020202020202020202424241F1F20202020202020202020202020202424246F2020202020202020202022242422222424242424242222222220202020202020202020206F2424241F1F202020202020202020202020202020242424246F20202020202020202020202020202020202020202020202020202020202020206F242424221F1F2020202020202020202020202020202022242424246F2020202020206F2424242424246F22242424246F20202020202020206F242424241F1F2020202020202020202020202020202020202224242424246F6F20202020202222242424246F24242424246F2020206F2424242422221F1F202020202020202020202020202020202020202020222224242424246F6F6F6F2020222424246F2424242424242424242222221F1F2020202020202020202020202020202020202020202020202222242424242424246F6F20242424242424242424241F1F20202020202020202020202020202020202020202020202020202020202020202222222224242424242424242424241F1F2020202020202020202020202020202020202020202020202020202020202020202020202424242424242424242424241F1F2020202020202020202020202020202020202020202020202020202020202020202020202024242424242424242424221F1F2020202020202020202020202020202020202020202020202020202020202020202020202020222424242222".Replace("1F1F","#").Split("#") | %{$a=$_.ToCharArray();for($i=0;$i -le $a.Length-2;$i+=2){write-host "$([Convert]::ToChar([Convert]::toUInt32($a[$i]+$a[$i+1],16)))" -NoNewline}; write-host "`r`n"}   
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100  
    $response_post = Invoke-RestMethod $url_post -Method Post -Body $body -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $response_get = Invoke-RestMethod "${url_get}?tracking_numbers=$($line.TrackingNumber)" -Method Get -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Delivery_status';e={$response_get.data.delivery_status}},@{n='substatus';e={$response_get.data.substatus}},@{n='Response_Post';e={$response_post | ConvertTo-JSON -Depth 100 -Compress}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append -NoTypeInformation  
}
 
=> me = out

Der eingebaute Virus freut sich auf euer Netzwerk ;-P ...
freshman2017
freshman2017 06.09.2022 aktualisiert um 16:42:53 Uhr
Goto Top
Vielen lieben Dank face-wink

Noch eine letzte Frage; ich bekomme noch in der ersten Zeile:

#TYPE Selected.System.Management.Automation.PSCustomObject

Wie kann ich das neben des Hochkommas in der Ausgabe verhindern?

$url_get = 'https://api.trackingmore.com/v3/trackings/get'  
$inputfile = 'C:\Users\User-01\Desktop\input.csv'  
$outputfile = 'C:\Users\User-01\Desktop\output.csv'  
$APIKEY = 'XXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100  
    $response_get = Invoke-RestMethod "${url_get}?tracking_numbers=$($line.TrackingNumber)" -Method Get -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Delivery_status';e={$response_get.data.delivery_status}},@{n='substatus';e={$response_get.data.substatus}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append  
}


Zitat von @3803037559:

$url_post = 'https://api.trackingmore.com/v3/trackings/create'  
$url_get = 'https://api.trackingmore.com/v3/trackings/get'  
$inputfile = '.\input.csv'  
$outputfile = '.\output.csv'  
$APIKEY = 'XXXXXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    "20202020202020202020202020202020202020202020202020206F6F6F6F2424242424242424242424246F6F6F6F1F1F202020202020202020202020202020202020202020206F6F2424242424242424242424242424242424242424242424246F1F1F202020202020202020202020202020202020206F6F2424242424242424242424242424242424242424242424242424242424246F2020202020202020206F242020202424206F241F1F2020206F2024206F6F20202020202020206F2424242424242424242424242424242424242424242424242424242424242424242424246F2020202020202024242024242024246F241F1F6F6F202420242022242020202020206F2424242424242424242020202024242424242424242424242424202020202424242424242424246F202020202020202424246F24246F241F1F222424242424246F2420202020206F2424242424242424242020202020202424242424242424242424202020202020242424242424242424246F2020202024242424242424241F1F202024242424242424202020202424242424242424242424202020202020242424242424242424242420202020202024242424242424242424242424242424242424242424241F1F20202424242424242424242424242424242424242424242424202020202424242424242424242424242420202020242424242424242424242424242420202222222424241F1F2020202224242422222222242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242020202020222424241F1F202020202424242020206F24242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242020202020222424246F1F1F2020206F242422202020242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424202020202020202424246F1F1F202020242424202020202424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242220222424242424246F6F6F6F6F242424246F1F1F20206F2424246F6F6F6F24242424242020242424242424242424242424242424242424242424242424242424242424242424242424242020206F24242424242424242424242424242424241F1F2020242424242424242422242424242020202424242424242424242424242424242424242424242424242424242424242424242420202020202424242422222222222222221F1F20222222222020202020202024242424202020202224242424242424242424242424242424242424242424242424242424222020202020206F2424241F1F202020202020202020202020222424246F2020202020222222242424242424242424242424242424242424222424222020202020202020202424241F1F20202020202020202020202020202424246F2020202020202020202022242422222424242424242222222220202020202020202020206F2424241F1F202020202020202020202020202020242424246F20202020202020202020202020202020202020202020202020202020202020206F242424221F1F2020202020202020202020202020202022242424246F2020202020206F2424242424246F22242424246F20202020202020206F242424241F1F2020202020202020202020202020202020202224242424246F6F20202020202222242424246F24242424246F2020206F2424242422221F1F202020202020202020202020202020202020202020222224242424246F6F6F6F2020222424246F2424242424242424242222221F1F2020202020202020202020202020202020202020202020202222242424242424246F6F20242424242424242424241F1F20202020202020202020202020202020202020202020202020202020202020202222222224242424242424242424241F1F2020202020202020202020202020202020202020202020202020202020202020202020202424242424242424242424241F1F2020202020202020202020202020202020202020202020202020202020202020202020202024242424242424242424221F1F2020202020202020202020202020202020202020202020202020202020202020202020202020222424242222".Replace("1F1F","#").Split("#") | %{$a=$_.ToCharArray();for($i=0;$i -le $a.Length-2;$i+=2){write-host "$([Convert]::ToChar([Convert]::toUInt32($a[$i]+$a[$i+1],16)))" -NoNewline}; write-host "`r`n"}   
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100  
    $response_post = Invoke-RestMethod $url_post -Method Post -Body $body -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $response_get = Invoke-RestMethod "${url_get}?tracking_numbers=$($line.TrackingNumber)" -Method Get -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Delivery_status';e={$response_get.data.delivery_status}},@{n='substatus';e={$response_get.data.substatus}},@{n='Response_Post';e={$response_post | ConvertTo-JSON -Depth 100 -Compress}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append  
}
 
=> me = out

Der eingebaute Virus freut sich auf euer Netzwerk ;-P ...
3803037559
3803037559 06.09.2022 aktualisiert um 16:48:02 Uhr
Goto Top
Export-Csv
-NoTypeInformation
Removes the #TYPE information header from the output. This parameter became the default in PowerShell 6.0 and is included for backwards compatibility.
freshman2017
freshman2017 06.09.2022 um 17:22:09 Uhr
Goto Top
-NoTypeInformation bringt bei mir irgendwie nichts... ist das die richtige Position?

$url = 'https://api.trackingmore.com/v3/trackings/create'  
$inputfile = 'C:\Users\User-01\Desktop\input.csv'  
$outputfile = 'C:\Users\User-01\Desktop\output.csv'  
$APIKEY = 'XXXXXXXX'  
foreach($line in Import-CSV $inputfile -Delimiter ";" -Header 'Art','TrackingNumber','CourierCode'){  
    $body = @{'tracking_number' = $line.TrackingNumber;'courier_code' = $line.CourierCode;'lang' = 'de'} | ConvertTo-JSON -Depth 100  
    $response_post = Invoke-RestMethod $url -Method Post -Body $body -ContentType 'application/json' -Headers @{'Tracking-Api-Key'=$APIKEY}  
    $line | select *,@{n='Delivery_status';e={$response_get.data.delivery_status}},@{n='substatus';e={$response_get.data.substatus}},@{n='Response_Post';e={$response_post | ConvertTo-JSON -Depth 100 -Compress}} | export-csv $outputfile -Delimiter ";" -Encoding UTF8 -Append -NoTypeInformation  
}


Zitat von @3803037559:

Export-Csv
-NoTypeInformation
Removes the #TYPE information header from the output. This parameter became the default in PowerShell 6.0 and is included for backwards compatibility.
3803037559
3803037559 06.09.2022 aktualisiert um 18:39:07 Uhr
Goto Top
Alte Datei natürlich vorher löschen du Clown, was bedeutet wohl "-Append"? Drei mal darfst du raten...
freshman2017
freshman2017 07.09.2022 um 10:23:40 Uhr
Goto Top
Guten Morgen certguy,

besten Dank für die Unterstützung: habe es hinbekommen face-smile

Letzte Frage noch: In der Input-Datei würde ich gerne direkt den API-Key mitgeben, ist das möglich?


Zitat von @3803037559:

Alte Datei natürlich vorher löschen du Clown, was bedeutet wohl "-Append"? Drei mal darfst du raten...
3803037559
3803037559 07.09.2022 aktualisiert um 10:28:54 Uhr
Goto Top
Macht zwar keinen Sinn Zugangsdaten als Plaintext in einer Textdatei zu speichern, aber joa mach halt ne extra Spalte rein.
freshman2017
freshman2017 07.09.2022 um 12:36:05 Uhr
Goto Top
Super, danke, hab´s gelassen.

Was genau bewirkt -Depth 100 weiter oben im Code?
3803037559
3803037559 07.09.2022 aktualisiert um 12:40:25 Uhr
Goto Top
Zitat von @freshman2017:
Was genau bewirkt -Depth 100 weiter oben im Code?
ConvertTo-Json
-Depth
Specifies how many levels of contained objects are included in the JSON representation. The value can be any number from 0 to 100. The default value is 2. ConvertTo-Json emits a warning if the number of levels in an input object exceeds this number.
freshman2017
freshman2017 07.09.2022 um 12:45:39 Uhr
Goto Top
Das würde in diesem Skript bedeuten, dass nicht mehr als 100 Datensätzen in der Input-Datei stehen dürfen?
3803037559
3803037559 07.09.2022 aktualisiert um 13:17:13 Uhr
Goto Top
Zitat von @freshman2017:

Das würde in diesem Skript bedeuten, dass nicht mehr als 100 Datensätzen in der Input-Datei stehen dürfen?
Nö. Das bedeutet das das HashtableObject vollständig umgewandelt wird wenn es mehr wie 2 verschachtelte Ebenen haben sollte. Hat es hier zwar nicht, aber zur Sicherheit trotzdem hinzugefügt falls sich das mal ändern sollte.
freshman2017
freshman2017 12.09.2022 um 08:36:10 Uhr
Goto Top
Vielen lieben Dank @3803037559 für deine perfekte Unterstützung.

Wie können in die Get TXT Datei noch die Trackinfo am besten mit aufgenommen werden:

checkpoint_date checkpoint_delivery_status checkpoint_delivery_substatus

mit der letzten Info ganz oben sortiert.

"trackinfo":[{"checkpoint_date":"2022-09-06 08:21:49","tracking_detail":"Out for delivery.","location":"Gudensberg (DE)","checkpoint_delivery_status":"pickup","checkpoint_delivery_substatus":"pickup001"},{"checkpoint_date":"2022-09-06 06:11:17","tracking_detail":"At parcel delivery centre.","location":"Gudensberg (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 23:24:16","tracking_detail":"In transit.","location":"Hagen (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 19:20:25","tracking_detail":"In transit.","location":"Wuppertal (DE)","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"transit001"},{"checkpoint_date":"2022-09-05 07:05:34","tracking_detail":"Order information has been transmitted to DPD.","location":"DPD data centre","checkpoint_delivery_status":"transit","checkpoint_delivery_substatus":"notfound001"}]}  



Zitat von @3803037559:

Zitat von @freshman2017:

Das würde in diesem Skript bedeuten, dass nicht mehr als 100 Datensätzen in der Input-Datei stehen dürfen?
Nö. Das bedeutet das das HashtableObject vollständig umgewandelt wird wenn es mehr wie 2 verschachtelte Ebenen haben sollte. Hat es hier zwar nicht, aber zur Sicherheit trotzdem hinzugefügt falls sich das mal ändern sollte.