Cookie für PHP Modul speichern

Hat von Euch schon mal jemand ein Cookie für ein PHP Modul in IP-Symcon gespeichert? Was ist da das beste Vorgehen ein File, wenn ja wo speichere ich das ab, oder eine Property oder ein Buffer?

Und vor allem kann ich an CURLOPT_COOKIEFILE und CURLOPT_COOKIEJAR nur ein File übergeben oder kann das auch der Inhalt von einem IP-Symcon Buffer sein?

Gibt es denn so was wie ein tmp Verzeichnis für PHP Module in dem ich temporäre Dateien ablegen kann? Oder kann ich so ein Verzeichnis anlegen, wenn ja habe ich da die Rechte zu dies aus einem PHP Modul zu machen?

Mit CURL habe ich es noch nicht ausprobiert, aber wenn du den Inhalt der Datei hast, kannst du einen base64 String als Wrapper nutzen:
PHP: data:// - Manual
Funktioniert zum Lesen wunderbar (nutze ich im Websocket Server für die Zertifikate).
Schreiben geht halt nicht.

Ansonsten:
File würde ich lassen.
MediaObject Typ Document, Property String als Base64 (über Action-Button in der Form ‚Cookie lesen‘ ) oder halt Buffer (non persistent bei reboot).

Michael

Wie meinst Du das konkret?

So?


curl_setopt($ch, CURLOPT_COOKIEFILE, file_get_contents('data://text/plain;base64,aWNoIGJpbiBlaW4gY29va2ll'));

Buffer scheidet an sich aus da nicht persistent. Property bin ich mir nicht sicher ob es dann wieder Probleme mit Apply_Changes gibt. Bleibt also bevorzugt MediaObject, kann ich von einem MediaObject den beliebig erstellen und löschen? Der Inhalt ist dann ja wieder base_64, die Frage ist halt nur wie bekomme ich das als File an CURLOPT_COOKIEFILE übergeben, meinst Du das geht so wie oben mit file_get_contents?

Habe das mal in meinem NelloModul gebraucht, ist aber noch nicht zu 100% okay, vielleicht ein Ansatz für dich…

https://github.com/ubittner/SymconNelloOne/blob/master/NelloOne/module.php

Gesendet von iPhone mit Tapatalk

HÄ ?
Wenn CURLOPT_COOKIEFILE ein File sein soll… warum liest du jetzt das ‚File‘ data:// selber mit file_get_contents aus :confused: Dann gibst du den Inhalt zurück… keine Datei.

Zuerst mal hast du kein Problem mit den Property wenn der Cookie NICHT im Applychanges angefragt und gespeichert wird; sondern der User dies über Script macht welches du in einem Action-Button der Instanz-Form hinterlegst.

$Cookie = XYZ_RequestCookie($id);
IPS_SetProperty($id, 'Cookie', base64_encode($Cookie));
IPS_Applychanges($id);

Das File wird einfach so übergeben:

$ichbineinedatei = 'data://text/plain;base64,'.$this->ReadPropertyString('Cookie');
curl_setopt($ch, CURLOPT_COOKIEFILE, $ichbineinedatei); // Keine Ahnung ob die CURL Erweiterung mit data-Wrappern zurecht kommt !

Ist aber alles Quark. Weil dann geht auch

curl_setopt($ch, CURLOPT_COOKIE, base64_decode($this->ReadPropertyString('Cookie')));

Deine Lösung, wie du auch an den Cookie kommst OHNE eine Datei zum schreiben zu nutzen, ist hier:

// 1)Don't use CURLOPT_FOLLOWLOCATION
// 2)
curl_setopt($ch, CURLOPT_HEADER, true);

// 3) Grab from the header cookies like this:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);   
$cookies = implode(';', $results[1]);

// 4)Set them using
curl_setopt($ch, CURLOPT_COOKIE,  $cookies);

Quelle:
PHP: curl_setopt - Manual

Wenn sich der Cookie aber bei jedem Aufruf ändert, hast du ein Problem. Dann bleibt wohl nur der InstanzBuffer.
Michael

Danke auch sehr interessant, was geht denn da noch nicht zu 100% bzw. wo ist denn das Problem?

Danke Dir erstmal für den ganzen Input ich werde mal schauen wie weit ich mit den Infos komme.

Ich glaube, ich muss nochmal den refresh Timer verküzen, denn nach 24 Stunden war der Socket zu und man musste sich den Token neu holen… war mir aber jetzt nicht ganz so wichtig, da bei nello auch mit MQTT gearbeitet wird und ich mich noch nicht darum gekümmert habe. Somit ist das Modul noch nicht komplett vollständig.

Gesendet von iPhone mit Tapatalk

Warum eigentlich? Könnte ich nicht einfach


$tempdir = sys_get_temp_dir();

als Dir nutzten oder habe ich da nicht automatisch Rechte drauf dort aus IP-Symcon rein zu schreiben bzw. daraus zu lesen?

Warum ? Na darum halt…
Eine Fehlerquelle mehr, egal was du machst. Ob es eventuell Probleme mit Berechtigung oder Speicherplatz oder sonst was sind.
Ich würde im Modul immer alles irgendwo in IPS bzw. in dessen Zuständig belassen.

Sogar zusätzliche Scripte welche ich zu Anfang in den Modulen hatte (Webhook oder Config ) habe ich entfernt und durch andere Mechanismen ersetzt.

Michael