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):
Die API gibt dabei zurück:
Für die POST-Anfrage habe ich eine Input TXT Datei:
Jetzt würde ich gerne für den POST eine Output TXT Datei, die wie folgt aufgebaut ist, haben:
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):
Die API gibt dabei zurück:
Für die GET-Anfrage habe ich eine Input TXT Datei:
Jetzt würde ich gerne für den POST eine Output TXT Datei, die wie folgt aufgebaut ist, haben:
Wie bekomme ich in einer Batch mehrere cURL Abfragen hin, die sich die Daten "Fett" dargestellt, in einer Schleife o.ä. automatisch ziehen.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3856079105
Url: https://administrator.de/contentid/3856079105
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
23 Kommentare
Neuester Kommentar
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
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
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.
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.
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.
Hab mich mal angemeldet. Bzw. auf deren Tool Seite sind ja die Dummy Daten hinten.
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.
[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.
$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
}
certguy
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.
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.
Also wenn du das nun mit der Steilvorlage nicht selbst schaffst , pfff .... Dienstags-Basar ...
$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
}
Der eingebaute Virus freut sich auf euer Netzwerk ;-P ...
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.
Removes the #TYPE information header from the output. This parameter became the default in PowerShell 6.0 and is included for backwards compatibility.
Alte Datei natürlich vorher löschen du Clown, was bedeutet wohl "-Append"? Drei mal darfst du raten...
Macht zwar keinen Sinn Zugangsdaten als Plaintext in einer Textdatei zu speichern, aber joa mach halt ne extra Spalte rein.
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.
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.
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.Das würde in diesem Skript bedeuten, dass nicht mehr als 100 Datensätzen in der Input-Datei stehen dürfen?