2017-10-16 6 views
0

Ich verwende die Qualtrics API, um Umfragedaten in geplanten Intervallen abzurufen. Unten ist mein Shell-Skript (Bash) get_responses.sh, das den Export, misst die Download-Abschlussrate, ruft den Export, und speichert/entpackt die Datei.Beschädigte ZIP-Datei nach Lockenanforderung

STARTDATE=$(date -v-7d "+%Y-%m-%d") 
STARTDATESTRING=$STARTDATE"T00:00:00-07:00:00" 
ENDDATE=$(date "+%Y-%m-%d") 
ENDDATESTRING=$ENDDATE"T00:00:00-07:00:00" 

result=$(curl -X POST -H 'X-API-TOKEN: MYAPITOKEN' -H 'Content-Type: application/json' -d '{ 
    "surveyId": "SV_000000000000", 
    "startDate": "startDate": "'"$STARTDATESTRING"'", 
    "endDate": "endDate": "'"$ENDDATESTRING"'", 
    "format": "csv", 
    "useLocalTime": true, 
    "useLabels": true 
}' "https://myorg.qualtrics.com/API/v3/responseexports") 

es_id=$(echo "$result" | /usr/local/Cellar/jq/1.5_2/bin/jq --raw-output '.result.id') 

curl -H "X-API-TOKEN: MYAPITOKEN" "https://myorg.qualtrics.com/API/v3/responseexports/${es_id}" 

curl -X GET -H "Content-Type: application/json" -H "X-API-TOKEN: MYAPITOKEN" "https://myorg.qualtrics.com/API/v3/responseexports/${es_id}/file" -o "/Users/myname/Desktop/WEA/response.zip" 

unzip "/Users/myname/Desktop/WEA/response.zip" -d "/Users/myname/Desktop/WEA/" 

ich zeitweise die folgende fehler-

% Gesamt Received%% Xferd Durchschnittliche Geschwindigkeit Zeit Zeit Zeit Aktuelle Dload Hochladen Gesamt Verbrauchte Links Geschwindigkeit 100 339 100 133 100 206 165 256 - : -: - -: -: - -: -: - 256 {"result": {"percentComplete": 0.0, "Datei": null, "status": "in progress" }, "meta": {"httpStatus": "200 - OK", "requestId": "2c55524c-03aa-495c-8de7-b54d5b441b34"}}% Gesamt% Empfangen% Xferd Durchschnittliche Geschwindigkeit Zeit Zeit Zeit Aktuell Dload Upload Gesamt Verbrauchte Linke Geschwindigkeit 100 129 100 129 0 0 405 0 -: -: - -: -: - -: -: - 405

Ende der zentralen Verzeichnissignatur nicht gefunden. Entweder ist diese Datei nicht eine ZIP-Datei, oder sie bildet eine Festplatte eines mehrteiligen Archivs. Im letzteren Fall wird der Kommentar des zentralen Verzeichnisses und der ZIP-Datei unter der letzten Platte (n) dieses Archivs gefunden.

unzip: nicht zipfile Verzeichnis in einem der /Users/myname/Desktop/response.zip oder /Users/myname/Desktop/WEA/response.zip.zip finden und nicht finden können/Users/myname/Desktop /WEA/response.zip.ZIP, Punkt.

Der ungerade Teil ist, dass dieser Fehler in der Regel nur auftritt, wenn ich das Skript zum ersten Mal ausführen. Wenn ich es wiederhole, ohne irgendwelche Änderungen vorzunehmen, wird es ohne Fehler durchlaufen. Nach meinem Verständnis bedeutet diese Fehlermeldung eine beschädigte Zip-Datei. Korrumpiere ich die POST-Anfrage, indem ich sie in eine Variable speichere? Ich muss die post-Anfrage-Ausgabe irgendwie erfassen, da es die es_id liefert, die ich für die nachfolgende GET-Anfrage benötige. Ich würde es hart codieren, aber die es_id wird wöchentlich aktualisiert.

+2

Meine Vermutung ist, dass der Grund, dass Ihre Zip-Datei ungültig ist, weil der Export nicht abgeschlossen ist. Sie müssen https://myorg.qualtrics.com/API/v3/responsexports/${es_id} in eine Schleife einfügen und das Ergebnis prüfen, um zu sehen, ob der Export abgeschlossen ist, bevor Sie die ZIP-Datei herunterladen. –

+0

@ T.Gibbons Sie sind richtig, ich habe falsch angenommen, dass das ist, was der zweite curl-Befehl tat, da die Dokumentation zum Export-Status [hier] (https://api.qualtrics.com/docs/get-response-export-progress) . Aber ich bin zurück gegangen und habe gesehen, dass alle erfolgreichen Pulls 'percentComplete: 100' haben, während alle nicht erfolgreichen Pulls% complete: 0' haben, wie oben zu sehen ist. Warum sollte der Code anfangs nicht vollständig ausgeführt werden, aber wenn er erneut ausgeführt wird, ergibt sich ein voller Pull? –

+0

Ich weiß nicht die Antwort auf Ihre Frage. Meine Vermutung ist, dass beim ersten Versuch etwas zwischengespeichert wird, also läuft der zweite Versuch schneller. –

Antwort

1

Mit Hilfe von @ T.Gibbons konnte ich den Fehler beim ersten Durchlauf beseitigen, indem ich eine While-Schleife in das Skript integrierte.

STARTDATE=$(date -v-7d "+%Y-%m-%d") 
STARTDATESTRING=$STARTDATE"T00:00:00-07:00:00" 
ENDDATE=$(date "+%Y-%m-%d") 
ENDDATESTRING=$ENDDATE"T00:00:00-07:00:00" 
post_response=$(curl -X POST -H 'X-API-TOKEN: MYAPITOKEN' -H 'Content-Type: application/json' -d '{ 
    "surveyId": "SV_00000000000000", 
    "startDate": "'"$STARTDATESTRING"'", 
    "endDate": "'"$ENDDATESTRING"'", 
    "format": "csv", 
    "useLocalTime": true, 
    "useLabels": true 
}' "https://myorg.qualtrics.com/API/v3/responseexports") 

es_id=$(echo "$post_response" | /usr/local/Cellar/jq/1.5_2/bin/jq --raw-output '.result.id') 

percent_complete=0 
while [ $percent_complete -ne 100 ] 
do 
    response=$(curl -H "X-API-TOKEN: MYAPITOKEN" "https://myorg.qualtrics.com/API/v3/responseexports/${es_id}") 
    percent_complete=$(echo "$response" | /usr/local/Cellar/jq/1.5_2/bin/jq --raw-output '.result.percentComplete') 
done 

curl -X GET -H "Content-Type: application/json" -H "X-API-TOKEN: MYAPITOKEN" "https://myorg.qualtrics.com/API/v3/responseexports/${es_id}/file" -o "/Users/myname/Desktop/WEA/response.zip" 

unzip "/Users/myname/Desktop/WEA/response.zip" -d "/Users/myname/Desktop/WEA" 

rm "/Users/myname/Desktop/WEA/response.zip" 
Verwandte Themen