Ich schließe das Thema, da für mich alle wichtigen punkte aktuell funktionieren.
Gruß gmmg
Ich schließe das Thema, da für mich alle wichtigen punkte aktuell funktionieren.
Gruß gmmg
Habe das Script "Attachment" in Post 1 entsprechend angepasst:
- SurveyID's + Surveynamen aus ini File
- Survey Import/Export Pfade aus ini File
- das RegEx von BananaJoe in der Funktion "get_session_key ergänzt
Gruß gmmg
Um eine Fehlerabfrage einzubauen benötige ich etwas Hilfe beim Splitten/ bereinigen der folgenden Return Strings.
;{"id":1,"result":"ulKeUwSWS5V5zKcyohTHtB8XfIo~91OJ","error":null}
;{"id":1,"result":{"status":"Invalid user name or password"},"error":null}
;{"id":1,"result":{"status":"Sie haben die maximale Anzahl an Anmeldeversuchen erreicht. Bitte warten Sie 10 Minuten, bevor Sie es erneut versuchen."},"error":null}
nach dem Splitten soll das Ergebis so sein:
"ulKeUwSWS5V5zKcyohTHtB8XfIo~91OJ"
"Invalid user name or password"
"Sie haben die maximale Anzahl an Anmeldeversuchen erreicht. Bitte warten Sie 10 Minuten, bevor Sie es erneut versuchen."
Kann man da mit Regex was machen oder muss ich das mit StringReplace umsetzen?
Habe es jetzt so lösen können:
$oReceived = StringReplace($oReceived, '{"id":1,"result":', "")
$oReceived = StringReplace($oReceived, ',"error":null}', "")
$oReceived = StringReplace($oReceived, '{"status":', "")
$oReceived = StringReplace($oReceived, '}', "")
Gruß gmmg
BugFix Habe den Export als CSV + das Zusammenfügen der 2 Exportdateien zu einer CSV Datei wie folgt gelöst.
;-- While Wend ---codeschnipsel-----------------------
Case $btn_export_responses ; GUI Button export responses
For $sid = 0 To 3 ; $Survey_idArray - oben definiert
$SurveyID_Splitt = StringSplit($Survey_idArray[$sid],"|")
MsgBox(0,"",$SurveyID_Splitt[1] & @crlf & $SurveyID_Splitt[2])
;----------------------------------------------------------
_export_responses($SurveyID_Splitt[2],0) ;ohne Zusatz attribute
$exp_response_0 = BinaryToString($Decoded,4)
_csv_file_create($SurveyID_Splitt[1],0)
;----------------------------------------------------------
_export_responses($SurveyID_Splitt[2],1) ;mit Zusatz attributen
$exp_response_1= BinaryToString($Decoded,4)
_csv_file_create($SurveyID_Splitt[1],1)
;----------------------------------------------------------
_csv_files_merge($SurveyID_Splitt[1]) ; merge csv files
;MsgBox(0,"",$csv_array_merge)
Next
;-------------------------------------------------------------------------------------
Func _csv_file_create($SurveyID, $zF) ; csv_files_create + base64 decode
;results-bigxtra
$exportFile_xx = $Folderpath & "\results-"& $SurveyID & "_" & $zF & ".csv"
If FileExists($exportFile_xx) Then FileDelete($exportFile_xx)
If Not FileExists($exportFile_xx) Then _FileCreate($exportFile_xx)
FileWrite($exportFile_xx, BinaryToString($Decoded,4)); & @CRLF)
EndFunc
Func _csv_files_merge($Survey_Name) ; csv_files_create to array and merge 2 files in one csv
$csv_array_merge = ""
;----------------------------------------------------------------------
$exportFile_merge = $Folderpath & "\results-" & $Survey_Name & ".csv"
If FileExists($exportFile_merge) Then FileDelete($exportFile_merge)
If Not FileExists($exportFile_merge) Then _FileCreate($exportFile_merge)
;----------------------------------------------------------------------
$exportFile_0 = $Folderpath & "\results-" & $Survey_Name & "_0.csv"
$exportFile_1 = $Folderpath & "\results-" & $Survey_Name & "_1.csv"
_FileReadToArray($exportFile_0, $csv_array_0) ; ohne Zusatzfelder
;_ArrayDisplay($csv_array_0)
_FileReadToArray($exportFile_1, $csv_array_1) ; mit Zusatzfeldern
;_ArrayDisplay($csv_array_1)
For $a = 1 to UBound($csv_array_1) -2
$csv_array_1_splitt = StringSplit($csv_array_1[$a],";")
$sRange = "0-12"
_ArrayDelete($csv_array_1_splitt, $sRange)
$csv_array_merge &= $csv_array_0[$a] &";"& $csv_array_1_splitt[0] &";"& $csv_array_1_splitt[1] &";"& $csv_array_1_splitt[2] &";"& $csv_array_1_splitt[3] &";"& $csv_array_1_splitt[4] & @CR
Next
FileWrite($exportFile_merge, $csv_array_merge)
FileDelete($exportFile_0)
FileDelete($exportFile_1)
EndFunc
Alles anzeigen
Scriptdatei siehe Post 1
Gruß gmmg ![]()
ok, ich versuche mal mein Glück ![]()
Bin erstmal dabei den Rückgabewert, welcher als Base64 codiert ausgegeben wird umzuwandeln.
Das mache ich mit der base64 Funktion (https://www.autoitscript.com/forum/topic/19…ode-extra-fast/)
$Decoded = base64($export_Received[6], False)
Die Variable $decoded würde ich jetzt in die jeweilige CSV Datei mit Filewrite speichern, um die dann wieder in ein Array einzulesen.
Gruß gmmg
Danke für deine Antwort.
Genau, die sind identisch, nur das die Felder der Antworten des Survey fehlt, deshalb gehe ich auch davon aus, dass dies ein Fehler der Remote API schnittstelle ist.
So richtig weiß ich noch nicht, wie ich das angehen soll, Ich habe ja im Endeffekt 2 CSV Dateien bzw. diese Datensätze in 2 Variablen.
Gruß gmmg
Wenn ich die Funktion "mail_registered_participants" nutze, kann es vorkommen, dass bereits alle Email Empfänger über LimeSurvey angeschrieben wurden.
Hier kommt dann folgender Rückgabestring: {"id":1,"result":{"status":"Error: No candidate tokens"},"error":null}
Ich hätte für die Logdatei, Auswertung usw. nun folgenden Teilstring. Wie kann ich das am Besten umsetzen ? Mit Stringsplitt geht das ja, aber das geht sicher noch eleganter.
"Error: No candidate tokens"
Des weiteren gibt es wohl ein Problem mit der Funktion Export_Responses über die Remote API.
Hier bekomme ich, wenn ich die Zusatzfelder mit exportieren möchte kein Ergbnis der Umfrage mehr angezeigt. Ohne die Zusatzfelder kommen diese Ergebnisse.
Hier ein Beipiel:
Export ohne Zusatzfelder, die Ergebnisse sind gefüllt (gelb markiert)
----------------------------------------------------------------------------------------------------------------------------------
"id";"submitdate";"lastpage";"startlanguage";"seed";"token";"startdate";"datestamp";"refurl";"G01Q01";"G01Q02";"G01Q03"
"9";"2022-06-23 16:18:07";"1";"de";"1139653681";"XiL38ODU1PR1gGa";"2022-06-23 16:17:50";"2022-06-23 16:18:07";"";"5";"5";"5"
"10";"2022-06-23 18:37:29";"1";"de";"163171948";"2vLLAR9HAHYgOCm";"2022-06-23 18:37:01";"2022-06-23 18:37:29";"";"5";"5";"5"
Export mit Zusatzfeldern ("firstname";"lastname";"email";"attribute_1";"attribute_2"), die Ergebnisse sind leer (gelb markiert)
----------------------------------------------------------------------------------------------------------------------------------
"id";"submitdate";"lastpage";"startlanguage";"seed";"token";"startdate";"datestamp";"refurl";"G01Q01";"G01Q02";"G01Q03";"firstname";"lastname";"email";"attribute_1";"attribute_2"
"9";"2022-06-23 16:18:07";"1";"de";"1139653681";"XiL38ODU1PR1gGa";"2022-06-23 16:17:50";"2022-06-23 16:18:07";"";"";"";"";"Herbert";"Behr";"herbert.behr@xyz.de";"2540";"Herr"
"10";"2022-06-23 18:37:29";"1";"de";"163171948";"2vLLAR9HAHYgOCm";"2022-06-23 18:37:01";"2022-06-23 18:37:29";"";"";"";"";"Heidi";"Schmauch";"schmauch.heidi@xyz.de";"2529";"Frau"
Das Problem liegt mit Sicherheit an LimeSurvey, da der Export über die Weboberfläche ja klappt.
Jetzt ist meine Idee, bis es da mal eine Lösung gibt, beide CSV zusammenzufügen.
Das heißt ich Exportiere beide Dateien (einmal mit, einmal ohne Zusatzfelder) und hole mir entwerder aus der Datei ohne Zusatzfelder die 3 Ergbebnisse zu jeweiliger Zeile oder versuche die irgendwie anders zusammenzufügen.
Als Ergebnis soll die CSV (Export mit Zusatzfeldern) die Werte von "G01Q01";"G01Q02";"G01Q03" enthalten.
Hat da jemand eine Idee, wie ich das am Besten angehe?
Danke
Gruß gmmg
Hallo Zusammen,
ich versuche mich gerade an der Automatisierung von LimeSurvey (Umfragetool).
Folgendes funktioniert bereits, ist aber noch nicht 100% frei von eventuellen fehlern. Habe zum testen erstmal eine einfache GUI erstellt, um die Befehle einzeln ansetzen zu können.
get_session_key
add_participants
list_participants
mail_registered_participants
Hier das Script dazu
#include <Array.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
local $oReceived, $SessionKey, $SurveyID
global $csvFileList
$Folderpath = "path to csv"
$URL = "https://limeserveyhost/index.php/admin/remotecontrol"
$user = "user"
$pwd = "pass"
;---- Survey ID's array --------------------------
local $Survey_idArray[4]
$Survey_idArray[0] = "umfrage1|997463" ;"umfrage"
$Survey_idArray[1] = "umfrage2|478789" ;"umfrage"
$Survey_idArray[2] = "umfrage3|469244" ;"umfrage"
$Survey_idArray[3] = "umfrage4|762911" ;"umfrage"
$Survey_idArray[3] = "API|795263" ;"Test API"
; ------------------------------------------------
$hGUI = GUICreate("LimeSurvey Remote",380, 80)
$btn_get_session_key = GUICtrlCreateButton("get_session_key", 30, 25, 100, 25)
$btn_add_participants = GUICtrlCreateButton("add_participants", 140, 25, 100, 25)
$btn_mail_participants = GUICtrlCreateButton("mail_participants", 250, 25, 100, 25)
; Display the GUI.
GUISetState(@SW_SHOW, $hGUI)
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $btn_get_session_key
_get_session_key()
MsgBox(0,"Session Key",$SessionKey)
Case $btn_add_participants
_list_csv_files()
;_ArrayDisplay($csvFileList)
_add_participants()
Case $btn_mail_participants
;mail_participants()
EndSwitch
WEnd
; Delete the previous GUI and all controls.
GUIDelete($hGUI)
Exit
Func _add_participants() ; add participants to lime survey ID
For $f = 1 to UBound($csvFileList) -1
$portal = StringSplit($csvFileList[$f],"_")
;_ArrayDisplay($portal)
;MsgBox(0,"",$portal[2]); Portal
For $s_id = 0 To 3 ; $Survey_idArray - oben definiert
;MsgBox(0,"",$SurveyID[$sid])
$SurveyID_Splitt = StringSplit($Survey_idArray[$s_id],"|")
;MsgBox(0,"",$SurveyID_Splitt[1])
IF $portal[2] = $SurveyID_Splitt[1] Then $SurveyID = $SurveyID_Splitt[2]
Next
;----csv read to array---
Local $CSVArray
_FileReadToArray($Folderpath & "\" & $csvFileList[$f], $CSVArray)
;_ArrayDisplay($CSVArray)
For $i = 2 to UBound($CSVArray) -1
$csv_splitt = StringSplit($CSVArray[$i],";")
;_ArrayDisplay($csv_splitt)
_list_participants($csv_splitt[1])
;ConsoleWrite($oReceived) ;Rückgabewert
$participants_Return = StringSplit($oReceived,",")
$participants_Return = StringSplit($participants_Return[2],",:")
;_ArrayDisplay($participants_Return)
$search_survey_participants = _ArraySearch($participants_Return, "No survey participants found.",0,0,0,1)
If $search_survey_participants = -1 Then
;MsgBox(0, $search_survey_participants, "bereits enthalten")
Else
$json_add_participants = ""
$json_add_participants = '{"method": "add_participants",' & _
'"params": {"sSessionKey": ' & $SessionKey & ',' & _
'"iSurveyID": ' & $SurveyID & ' ,' & _
'"aParticipantData": [{"attribute_1": "' & $csv_splitt[1] & '" ,' & _
'"attribute_2": "' & $csv_splitt[2] & '" ,' & _
'"firstname": "' & $csv_splitt[3] & '" ,' & _
'"lastname": "' & $csv_splitt[4] & '" ,' & _
'"email": "' & $csv_splitt[5] & '" ,' & _
'"token": "customToken"}],"bCreateToken": "false"},"id": 1}'
ConsoleWrite ($json_add_participants & @CRLF)
_POST_DATA($URL, $json_add_participants)
EndIf
Next
;MsgBox(0,"",$SurveyID)
_mail_participants($SurveyID)
Next
EndFunc
Func _mail_participants($SurveyID) ; send mail to participants
IF $SessionKey = "" Then
MsgBox(0,"",'please use "get session key" button')
Else
MsgBox(0,"","send mail to participants",1)
;Send Mail to Umfrageteilnehmer
$json_mail_participants = '{ "method": "mail_registered_participants", "params": [ ' & $SessionKey & ', "' & $SurveyID & '" ], "id": 1 }'
_POST_DATA($URL, $json_mail_participants)
ConsoleWrite ($json_mail_participants & @CRLF)
EndIf
EndFunc
Func _list_participants($attrib_1) ;lese Participants aus LimeSurvey mit Filter
IF $SessionKey = "" Then
MsgBox(0,"",'please use "get session key" button')
Else
$json_list_participants = '{"method": "list_participants",' & _
'"params": {"sSessionKey": ' & $SessionKey & ',' & _
'"iSurveyID": ' & $SurveyID & ' ,' & _
'"aAttributes": ["attribute_1"],' & _
'"aConditions": {"attribute_1" : "'&$attrib_1&'"}},' & _ ;Filter auf Attribute_1
'"id": 1 }'
;ConsoleWrite ($json_list_participants & @CRLF)
_POST_DATA($URL, $json_list_participants )
;ConsoleWrite($oReceived)
EndIf
EndFunc
Func _list_csv_files() ;list csv files to array
$csvFileList = _FileListToArray($Folderpath ,"*.csv",1)
If @error = 1 Then
MsgBox(0, "", "Path was invalid.")
Exit
EndIf
If @error = 4 Then
MsgBox(0, "", "No file(s) were found. Close Program")
Exit
EndIf
;_ArrayDisplay($csvFileList)
EndFunc
FUNC _get_session_key() ; get Lime Survey session key
$json_get_session_key = '{ "method": "get_session_key", "params": [ "' & $user & '", "' & $pwd & '" ], "id": 1 }'
_POST_DATA($URL, $json_get_session_key)
$session_key = StringSplit($oReceived,",")
;_ArrayDisplay($json_answer)
$session_key = StringSplit($session_key[2],",:")
;_ArrayDisplay($session_key)
$Search = _ArraySearch($session_key, "Invalid user name or password",0,0,0,1)
If @error = 6 Then
;MsgBox(0,"SessionKey",$json_session_key[2])
$SessionKey = $session_key[2]
Else
MsgBox(0, "", $session_key[$Search] & 'found in row: ' & $Search)
EndIf
EndFunc
FUNC _POST_DATA($URL, $JSON) ; Post with URL & JSON DATA
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", $URL, False)
$oHTTP.SetRequestHeader("Content-Type", "application/json")
$oHTTP.SetRequestHeader("Cache-Control", "no-cache")
$oHTTP.Send($JSON)
$oReceived = $oHTTP.ResponseText
$oStatusCode = $oHTTP.Status
If $oStatusCode <> 200 Then
MsgBox(4096, "Error", $oStatusCode,2)
EndIf
;ConsoleWrite($oReceived)
EndFunc
Alles anzeigen
Falls jemand noch ideen hat das zu optimieren, gerne dazu etwas schreiben.
Gruß gmmg ![]()
Hallo MojoeB, wenn ihr Exchange einsetzt, müssen natürlich noch für das entsprechende Postfach Imap oder Pop3 freigeschalten werden.
Wir haben bei uns früher mal das Tool "getmail.exe" per CMD genutzt, um Emails von POP3 Konten anzuholen und das Attachment zu extrahieren.
Habe die exe mal gepackt und angehangen. Download auch über http://www.interlog.com/~tcharron/getmail.html
Ob hier allerdings ssl verschlüsselt abgeholt werden kann, habe ich nicht geprüft. Intern sollte das kein Problem sein.
Gruß gmmg
Hallo Roberto,
wie BugFix schon schrieb ist das alles viel Arbeit, aber machbar.
Was du brauchst ist eine Datenbank, die Installiert und mit den Daten befüllt werden muss.
Dies könnte eine SQL Lite, MySQL/ MariaDB, Microsoft SQL oder Microsoft Access sein. Dafür gibt es zumindest bei AutoIT einige Beispiele.
Ich selbst habe im Unternehmen Access und MySQL in verschiedenen Projekten im Einsatz.
Gruß gmmg
Hallo Floooooo24,
hast du mal versucht die $ParentGUI anzugeben?
_Metro_CreateGUI($Title, $Width, $Height[, $Left = -1[, $Top = -1[, $AllowResize = False[, $ParentGUI = ""]]]])
; #FUNCTION# ====================================================================================================================
; Name ..........: _Metro_CreateGUI
; Description ...: Creates a modern borderless GUI with the colors of the selected theme.
; Syntax ........: _Metro_CreateGUI($Title, $Width, $Height[, $Left = -1[, $Top = -1[, $AllowResize = False[, $ParentGUI = ""]]]])
; Parameters ....: $Title - Title of the window
; $Width - Width
; $Height - Height
; $Left - [optional] Window pos X. Default is -1.
; $Top - [optional] Window pos Y. Default is -1.
; $AllowResize - [optional] True/False. Default is False. ;Enables resizing + drag move for the gui.
; $ParentGUI - [optional] Handle to the parent gui. Default is "".
; Return values .: Handle to the created gui
; Example .......: _Metro_CreateGUI("Example", 500, 300, -1, -1, True)
; ===============================================================================================================================
Benutze selbst immer mal die _Metro_CreateGUI, habe aber bisher keine 2 GUI's in einem Script benötigt.
Gruß gmmg
@tommii, wenn du Zugriff auf die Datenbank hast, könnte man ja auf diese zugreifen und die Daten darus direkt nutzen. Das macht das Excel Makro ja scheinbar auch ![]()
Gruß gmmg
Hallo Zusammen,
kann man von der 3.3.14.5 Problemlos auf die neue Version wechseln oder sind größere Probleme bekannt?
Gruß gmmg
Mit der folgenden Anpassung des Scripts läuft der Import erstmal wie gewollt. Ich schließe das Thema.
If $dword[0] = 2 Then
RegWrite(StringReplace($RegArray[$i],'"',''), StringReplace($RegArrayaSec[$a][0],'"',''), 'REG_DWORD', Dec(StringReplace(StringReplace($RegArrayaSec[$a][1],"dword:",""),'"',''),0))
EndIf
Gruß und Danke
gmmg
Velted, danke für deine Antwort. Für den einzelnen Wert ist das bereits geklärt. Das funktioniert ja auch mit der DEC Funktion.
Ich möchte doch nun die ganzen Regdatei per Autoit wieder importieren bzw. schreiben und nicht nur den einzelnen Wert.
Da müsste ich nun ja für alle Einträge entsprechende definitionen festlegen, dass will ich aber möglichst vermeiden ![]()
Gruß gmmg
Hallo Moombas,
ja, das wäre eine Idee, aber hast du dir mal die angehängte Reg Datei angeschaut, da gibt es viele "Dword" Einträge, die müssen ja alle geschrieben werden. ![]()
Bei dem Eintrag mit der PortNumber war mir der Fehler halt direkt aufgefallen, bei den anderen Einträgen, weiß ich das ja noch nicht.
Mit der DEC Funktion schaut das im Vergleich beider Dateien (export aus der Registry) mit Notepad++ sehr gut aus.
Einzig eine "REG_SZ" Zeile passt nicht mit dem Original überein, ist aber eventuell auch nicht relevant.
Original
per Autoit
Gruß gmmg
BananaJoe , das war mir auch schon aufgefallen, aber wie schreibe ich das denn im Script um?
Es wird ja nur die exportierte Registry in ein Array gelesen und danach wieder zeilenweise geschrieben.
Ich habe jetzt mal nur die PortNumber Zeile zum testen genommen. mit der Dec Funktion wird der Wert korrekt in die Registry geschrieben.
Ob das jetzt für alle Werte so geändert werden muss ist mir noch nicht bekannt.
Funktioniert nicht
;RegWrite("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Blank", "PortNumber", "REG_DWORD", "00000016")
;RegWrite("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Blank", "PortNumber", "REG_DWORD", 00000016)
Funktioniert
RegWrite("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Blank", "PortNumber", "REG_DWORD", Dec("00000016",0))
RegWrite("HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Blank", "PortNumber", "REG_DWORD", Dec(00000016,0))
Gruß gmmg