Der Bruzzler: Cleverreach API - Anfänger braucht Hilfe

Guten Morgen zusammen, ich nutze Cleverreach als Email Lösung und würde gerne über deren Rest API alle Empfänger exportieren oder alternativ per Email verschicken, die sich innerhalb der letzten 24 STd angemeldet haben (activation date) (dann per cronjob) Leider komme ich hier an einem Punkt nicht weiter, evtl. kann mir hier wer weiterhelfen?

Was ich habe:

  • erfolgreicher Login per API
  • Auflistung von Empfängern (allerdings nur begrenzt auf 50 - warum weiß ich nicht)

Mein bisheriger Code:

<?php

require 'rest_client.php';
$rest = new CR\tools\rest("https://rest.cleverreach.com/v1");
$rest->throwExceptions = true;	//default
echo "<pre>";

/**
	- Basic Information - 
	
	GET - will retrieve data
	POST - for creating new data
	PUT - Update/replace existing data
	DELETE - delete existing data

	see: https://en.wikipedia.org/wiki/Representational_state_transfer for more information
*/

echo "### Login - will retrieve Token ###\n";
try {
	/*
	try to login and receive token!
	on error script execution will be cancled
	*/
	$token = $rest->post('/login', 
		array(
			"client_id"=>'1626XX',
			"login"=>'xx@y.de',
			"password"=>'Passwort'
		)
	);
	//no error, lets use the key
	$rest->setAuthMode("jwt", $token);
	var_dump($token);

} catch (\Exception $e){
	var_dump( (string) $e );
	var_dump($rest->error);
	exit;
}


echo "### Return all recipients in a group ###\n";
var_dump( 
	$rest->get("/groups/538200/receivers")
);

$receivers = array();
$rows = mysql_query("select id, email, firstname, lastname, gender, vorname, nachname, kundennummer, registration_date activation_date from user");

$result = query($rows);

if ($result->num_rows > 0) {
    // output data of each row
     while($row = $result->fetch_assoc()) {
        echo "Name: ". $row["email"]. " " . $row["vorname"] . "<br>";  

		$message .= $row["firstname"] . ' '.$row["lastname"].' -Bitte anlegen-' . "\n";
		$message .= "\n";
		$message .= "\n";
		}
	
	
		$empfaenger .= 'ich@ich.de' . ', '; 
		$empfaenger .= 'er@er.de';	
		$betreff = "Cleverreach";
		$headers = "From: Cleverreach <info@cleverreach.de>";
		 mail($empfaenger, $betreff, $message, $headers);
} else {
    echo "0 results";
}

Für jede Hilfe wäre ich dankbar - ich fange leider gerade erst an mit PHP :( Seid nicht zu böse :) Danke im Voraus!

  1. Leider komme ich hier an einem Punkt nicht weiter, evtl. kann mir hier wer weiterhelfen?

    Womit?

    • Auflistung von Empfängern (allerdings nur begrenzt auf 50 - warum weiß ich nicht)

    Das wird vermutlich entweder der Standardwert oder die Obergrenze in der API sein, was sagt denn die API-Dokumentation dazu?

      $empfaenger .= 'ich@ich.de' . ', '; 
      $empfaenger .= 'er@er.de';	
    

    Bitte RFC 2606 beachten.

  2. Hallo Bruzzler,

    die Moderatoren-Meldung ist von mir - ich hoffe ein Admin findet das schnell. Persönliche Anmeldedaten gehören nicht in ein Forum. Du solltest dein Kennwort möglichst schnell ändern.

    Wobei Du GENAU nicht weiterkommst, müsstest Du vielleicht mal genauer sagen. Was ich in deinem Code sehe, ist der Login, ordentlich mit try/catch gekapselt, und ein erster GET Versuch.

    Danach schaltest Du aber um und machst eine direkte Datenbankabfrage. Die hat dann mit cleverreach wohl nichts zu tun, oder?

    Was die 50 angeht - schau mal hier. Die 50 dürfte der Default für die Pagesize sein. Du kannst eine höhere Pagesize mitgeben, das hilft Dir aber irgendwann auch nicht mehr, und du musst Folgeaufrufe machen. D.h. den ersten Aufruf machst Du mit page=0. Solange wie Du soviele Receiver bekommst wie die Pagesize beträgt, machst Du einen weiteren Aufruf mit der nächsthöheren Page-Nummer.

    Diese paged-reads haben für Batch-Läufe den Nachteil, dass sie nicht transaktional sind. D.h. wenn Du die Seiten 0 und 1 gelesen hast, und sich dann ein User registriert der auf Seite 0 gehört, verschiebt sich alles und auf Seite 2 bekommst Du als erstes den User, den Du zuvor noch auf Seite 1 hattest. Schlimmer noch: Du hast Seite 0 und 1 gelesen und nun löscht sich jemand auf Seite 0. Danach liest Du Seite 2. Durch die Löschung ist der User, der vorher als erstes auf Seite 2 erschienen wäre, der letzte User auf Seite 1, und du bekommst ihn gar nicht geliefert.

    Mit diesen Ungenauigkeiten musst Du leben, bzw. darfst während eines Batch-Laufs die Gruppe nicht ändern.

    Zu der DB-Abfrage: Wenn Du gerade erst mit PHP anfängst, dann lass mysql gleich liegen. Diese Schnittstelle ist nicht mehr aktuell und funktioniert ab PHP 7 gar nicht mehr. Sie ist durch mysqli ersetzt worden; das bietet bessere Möglichkeiten und hat ein paar gefährliche Löcher nicht mehr. Noch besser wäre, wenn Du gleich mit PDO einsteigst.

    Dann noch ein kleiner, beiläufiger Hinweis: Wenn Du namespace-gebundene PHP-Elemente ansprichst (new CR\tools\rest(...)), dann setze immer ein \ ganz nach vorn. Die Angabe CR\tools geht vom aktuellen Namespace aus. Du hast keinen eigenen gesetzt, deswegen ist das der globale Namespace und es funktioniert. Aber wenn Du deinen Code in eigenen Namespaces zu sortieren beginnst, klappt das nicht mehr. Deswegen ist `\CR\tools' besser. Die Ausnahme sind Elemente des globalen Namespace (die ganzen klassischen Library-Funktionen von PHP, aber auch Klassen wie Exception), die sucht er im globalen Namespace wenn er sie im aktiven Namespace nicht funden, weil sonst wohl zuviel alter Code kaputt gegangen wäre. D.h. vor CR\tools gehört ein Backslash davor, vor Exception braucht keiner.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hi Rolf, klasse danke. Ich probiere da gleich mal weiter. Bzgl. Anmeldedaten: Die sind nicht die echten, ich habe das entsprechend natürlich abgeändert! Was die SQL Abfrage angeht: Die wird auch so in einem Test von Cleverreach selbst so angegeben: Siehe hier: https://rest.cleverreach.com/howto/

      Ich habe eigentlich nicht mehr als 1-2 Anmeldungen pro Tag, dh eigentlich hätte ich gern immer nur die vom Vortag, so dass diese per Email an eine definierte Person gehen. Somit sollte die Anzahl / pagefunktion egal sein.

      Merci!

      1. Hallo Bruzzler,

        das Beispiel auf der verlinkten HowTo Seite, wo die SQL Query drin ist, steht unter "Import receivers" - wobei import aus Sicht von cleverreach gemeint ist und den initialen Upload deiner Receiver meint. Du willst aber sozusagen einen Batch-Download machen, nachdem schon Receiver da sind. Deswegen - tja, brauchst Du SQL? Du musst das Ergebnis von $rest->get("/groups/538200/receivers")verarbeiten - das wird irgend ein JSON String sein, den Du zunächst mal mit json_decode() in ein Array umwandeln musst. Als Nichtkunde von cleverreach weiß ich nicht, was drin steht, aber Du wirst es wissen. Zum einen von deinem var_dump, zum anderen kannst Du ja jede Funktion auch auf der Dokuseite experimentell aufrufen.

        So. Und jetzt habe ich noch etwas auf deren REST-Page gestöbert. Es gibt drei Versionen des API. Du verwendest oben v1, aktuell scheint aber v2, und v3 ist noch Baustelle (Alpha-Stadium). V3 sollte man also noch nicht produktiv verwenden. Wenn es keine Gründe gegen V2 gibt, solltest Du diese Version nutzen. Denn in der V2 gibt es eine interessante REST-Funktion: groups/123/filters/new. Damit kannst Du einen Filter anlegen, womit Du bereits bei cleverreach die Trefferliste einschränken kannst. Wenn Du das mit einer Pagesize von 5000 kombinierst, wirst Du kein Problem mehr mit konkurrierenden Updates haben :)

        Hier: https://rest.cleverreach.com/explorer/v2/#!/groups-v2/createFilter_post

        Du kannst z.B. einen Filter machen, der registered>nnn abfragt (nnn ist der Unixtimestamp des Zeitpunktes, ab dem Du die Treffer haben willst). Und dann rufst Du nicht groups/123/receivers, sondern groups/123/filters/456/receivers ab.

        Wenn Du fertig bist, solltest Du den Filter wieder löschen, der nützt Dir am Folgetag nichts mehr und updaten kann man ihn scheinbar nicht. Dumm nur, dass die nötige API-Funktion erst in V3 des API enthalten ist; ich hoffe, du kannst Filter über irgendeiner Oberfläche von Hand löschen. Oder hau den Support von cleverreach an, vielleicht haben die ja noch einen Vorschlag wie man damit sinnvoll umgeht. Filter sind auf jeden Fall besser als eine manuelle Filterung aller Receiver in deinem PHP Script.

        Rolf

        --
        sumpsi - posui - clusi