Cleverreach API - Anfänger braucht Hilfe – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self?srt=yes Cleverreach API - Anfänger braucht Hilfe Thu, 30 Nov 17 06:50:38 Z https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709373?srt=yes#m1709373 https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709373?srt=yes#m1709373 <p>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?</p> <p>Was ich habe:</p> <ul> <li>erfolgreicher Login per API</li> <li>Auflistung von Empfängern (allerdings nur begrenzt auf 50 - warum weiß ich nicht)</li> </ul> <p>Mein bisheriger Code:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token string single-quoted-string">'rest_client.php'</span><span class="token punctuation">;</span> <span class="token variable">$rest</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">CR<span class="token punctuation">\</span>tools<span class="token punctuation">\</span>rest</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"https://rest.cleverreach.com/v1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$rest</span><span class="token operator">-></span><span class="token property">throwExceptions</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token comment">//default</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<pre>"</span><span class="token punctuation">;</span> <span class="token comment">/** - 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 */</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"### Login - will retrieve Token ###\n"</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">/* try to login and receive token! on error script execution will be cancled */</span> <span class="token variable">$token</span> <span class="token operator">=</span> <span class="token variable">$rest</span><span class="token operator">-></span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/login'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"client_id"</span><span class="token operator">=></span><span class="token string single-quoted-string">'1626XX'</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"login"</span><span class="token operator">=></span><span class="token string single-quoted-string">'xx@y.de'</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"password"</span><span class="token operator">=></span><span class="token string single-quoted-string">'Passwort'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//no error, lets use the key</span> <span class="token variable">$rest</span><span class="token operator">-></span><span class="token function">setAuthMode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"jwt"</span><span class="token punctuation">,</span> <span class="token variable">$token</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">var_dump</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token keyword type-casting">string</span><span class="token punctuation">)</span> <span class="token variable">$e</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$rest</span><span class="token operator">-></span><span class="token property">error</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"### Return all recipients in a group ###\n"</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span> <span class="token variable">$rest</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/groups/538200/receivers"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$receivers</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$rows</span> <span class="token operator">=</span> <span class="token function">mysql_query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"select id, email, firstname, lastname, gender, vorname, nachname, kundennummer, registration_date activation_date from user"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$rows</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$result</span><span class="token operator">-></span><span class="token property">num_rows</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// output data of each row</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token variable">$row</span> <span class="token operator">=</span> <span class="token variable">$result</span><span class="token operator">-></span><span class="token function">fetch_assoc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Name: "</span><span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"email"</span><span class="token punctuation">]</span><span class="token operator">.</span> <span class="token string double-quoted-string">" "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"vorname"</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token variable">$message</span> <span class="token operator">.=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"firstname"</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' '</span><span class="token operator">.</span><span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"lastname"</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string single-quoted-string">' -Bitte anlegen-'</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token variable">$message</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token variable">$message</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$empfaenger</span> <span class="token operator">.=</span> <span class="token string single-quoted-string">'ich@ich.de'</span> <span class="token operator">.</span> <span class="token string single-quoted-string">', '</span><span class="token punctuation">;</span> <span class="token variable">$empfaenger</span> <span class="token operator">.=</span> <span class="token string single-quoted-string">'er@er.de'</span><span class="token punctuation">;</span> <span class="token variable">$betreff</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Cleverreach"</span><span class="token punctuation">;</span> <span class="token variable">$headers</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"From: Cleverreach <info@cleverreach.de>"</span><span class="token punctuation">;</span> <span class="token function">mail</span><span class="token punctuation">(</span><span class="token variable">$empfaenger</span><span class="token punctuation">,</span> <span class="token variable">$betreff</span><span class="token punctuation">,</span> <span class="token variable">$message</span><span class="token punctuation">,</span> <span class="token variable">$headers</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"0 results"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Für jede Hilfe wäre ich dankbar - ich fange leider gerade erst an mit PHP :( Seid nicht zu böse :) Danke im Voraus!</p> Cleverreach API - Anfänger braucht Hilfe Thu, 30 Nov 17 07:37:50 Z https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709375?srt=yes#m1709375 https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709375?srt=yes#m1709375 <blockquote> <p>Leider komme ich hier an einem Punkt nicht weiter, evtl. kann mir hier wer weiterhelfen?</p> </blockquote> <p>Womit?</p> <blockquote> <ul> <li>Auflistung von Empfängern (allerdings nur begrenzt auf 50 - warum weiß ich nicht)</li> </ul> </blockquote> <p>Das wird vermutlich entweder der Standardwert oder die Obergrenze in der API sein, was sagt denn die API-Dokumentation dazu?</p> <blockquote> <pre><code> $empfaenger .= 'ich@ich.de' . ', '; $empfaenger .= 'er@er.de'; </code></pre> </blockquote> <p>Bitte <a href="https://tools.ietf.org/html/rfc2606" rel="nofollow noopener noreferrer">RFC 2606</a> beachten.</p> Cleverreach API - Anfänger braucht Hilfe Thu, 30 Nov 17 08:08:52 Z https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709377?srt=yes#m1709377 https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709377?srt=yes#m1709377 <p>Hallo Bruzzler,</p> <p>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.</p> <p>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.</p> <p>Danach schaltest Du aber um und machst eine direkte Datenbankabfrage. Die hat dann mit cleverreach wohl nichts zu tun, oder?</p> <p>Was die 50 angeht - <a href="https://rest.cleverreach.com/explorer/v1#!/groups/list_____get" rel="nofollow noopener noreferrer">schau mal hier</a>. 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.</p> <p>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.</p> <p>Mit diesen Ungenauigkeiten musst Du leben, bzw. darfst während eines Batch-Laufs die Gruppe nicht ändern.</p> <p>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.</p> <p>Dann noch ein kleiner, beiläufiger Hinweis: Wenn Du namespace-gebundene PHP-Elemente ansprichst (<code>new CR\tools\rest(...)</code>), dann setze immer ein \ ganz nach vorn. Die Angabe <code>CR\tools</code> 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.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Cleverreach API - Anfänger braucht Hilfe Thu, 30 Nov 17 08:40:53 Z https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709381?srt=yes#m1709381 https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709381?srt=yes#m1709381 <p>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: <a href="https://rest.cleverreach.com/howto/" rel="nofollow noopener noreferrer">https://rest.cleverreach.com/howto/</a></p> <p>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.</p> <p>Merci!</p> Cleverreach API - Anfänger braucht Hilfe Thu, 30 Nov 17 12:29:29 Z https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709401?srt=yes#m1709401 https://forum.selfhtml.org/self/2017/nov/30/cleverreach-api-anfaenger-braucht-hilfe/1709401?srt=yes#m1709401 <p>Hallo Bruzzler,</p> <p>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 <code>$rest->get("/groups/538200/receivers")</code>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.</p> <p>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 :)</p> <p>Hier: <a href="https://rest.cleverreach.com/explorer/v2/#!/groups-v2/createFilter_post" rel="nofollow noopener noreferrer">https://rest.cleverreach.com/explorer/v2/#!/groups-v2/createFilter_post</a></p> <p>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.</p> <p>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.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div>