Entries filed under My Programs

Herausfinden zu welchem Versanddienstleister eine Tracking ID gehört

Posted on 29. Juli 2016 Comments

Wir hatten erst letztens das Problem, dass wir automatisiert Tracking IDs zugespielt bekommen, die von mehreren Versanddienstleistern stammen könnten. Dies ist z. B. beim ERP Plentymarkets der Fall, wenn man Pakete per FBA verschickt. Allerdings nur, wenn die Aufträge nicht von Amazon kommen, sondern ein sog. Multichannel Auftrag vorliegt, also Amazon nur als Logistiker benutzt wird. In der API Rückmeldung steht zwar m.E. der Versanddienstleister, allerdings implementiert Plentymarkets kein Mapping.

Um den richtigen Provider zu finden, ohne jedes mal alle Websites abzuklappern habe ich das PHP Paket shipping-service-providers-check geschrieben und über composer verfügbar gemacht. Es macht automatisiert genau das. Falls es nicht geht, weil z.B. die Flash oder JavaScript im Spiel sind oder es gar keine öffentliche Seite gibt (->Amazon Logistics), kann die Nummer auch anhand des Formats geprüft werden, also mit einem regulärem Ausdruck.

Theoretisch ist es möglich, dass die Tracking ID gleichzeitig bei mehreren Providern für unterschiedliche Sendungen gültig ist. Das ist zugegebenermaßen extrem unwahrscheinlich. Dennoch gibt mein Paket ein Array von Paketdienstleistern, jeweils mit einem Boolean (true/false), zurück.

Code Erklärung

Die Abhängigkeiten sind fabpot/goutte (ein Website scraper) und danielstjules/stringy (für Stringvergleiche). Da ich von PHPs use function Gebrauch mache, ist PHP Version 5.6 notwendig.

Die Klasse Check enthält neben dem Konstruktur, der die TrackingID erwartet, 3 weitere Methoden.

  • getProviders() – gibt alle Provider zurück
  • checkAll($extraProviders) – gibt das eben erwähnte Array zurück. Das hier ist die eigentlich wichtige öffentliche Methode
  • check() – private, wird in einer Schleife von checkAll() aufgerufen

In der Datei default_providers.php sind in einem Array alle implementierten Versanddienstleister aufgeführt. Hier können auch weitere hinzugefügt werden, bzw. in diesem Format an checkAll() übergeben werden. Jeder Dienstleister hat 3 Parameter:

  • base_url – URL, die goutte zusammen mit der tracking ID aufrufen wird
  • filter – HTML Tag auf der Seite, nach dem gesucht bzw. das durchsucht werden soll
  • search_string  – nach diesem String wird in dem HTML Tag gesucht

Der eigentlich wichtige Teil ist deswegen die Methode checkOnline()

$crawler = $this->client->request('GET', $parameters["base_url"] . $this->trackingId);

in dieser Zeile ruft goutte die vorher definierte base_url mit der Tracking ID auf. Die URL muss deshalb im Format http://example.com?tracking_id= vorliegen. Aus der Tracking ID 123456 lautet dann der Aufruf http://example.com?tracking_id=123456.

$crawler->filter($parameters["filter"])->each(function ($node) use ($parameters) {
            if (s($node->text())->contains($parameters["search_string"])) {
                return true;
            }
            return false;

In dem HTML Tag aus dem filter Parameter wird jetzt nach dem String search_string mittels stringys contains() gesucht. Sollte das der Fall sein, wird true zurückgegeben. Da die Funktion each ein Array zurückgibt und es möglich ist, dass das relevante HTML Tag mehrmals vorkommt, wird danach geguckt ob true in diesem array überhaupt vorkommt, auch wenn andere Einträge in diesem Array eben false sind.

return in_array(true, ...)

Dies wird in einer Schleife in checkAll() durchgegangen:

        foreach ($shippingProviders as $shippingProvider => $parameters) {
            $response[$shippingProvider] = $this->check($parameters);
        }

Außerdem ist es durch folgende Zeile möglich einen Versanddienstleister hinzuzufügen oder zu ersetzen (beides passiert durch array_merge())

  if (isset($shippingProviders)) {
            $shippingProviders = array_merge($defaultShippingProviders, $shippingProviders);
        } else {
            $shippingProviders = $defaultShippingProviders;
        }

Die Methode zum Überprüfen des regulärem Ausdrucks checkFormat() ist denkbar simpel:

  boolval(preg_match($parameters["regex"], $this->trackingId))

Da preg_match 1 zurückgibt, falls der Regex zutrifft, und 0 falls nicht (false wenn ein Fehler aufgetreten ist), muss um das Ergebnis noch boolval().

Die Anleitung zum Benutzen des Pakets ist auf GitHub bzw. Packagist. Zur Zeit des Verfassens dieses Artikels sind die folgenden Versanddienstleister implementiert:

  • DHL
  • GLS
  • UPS
  • Hermes
  • Amazon Logistics

Fedex, DPD und TNT gestalten sich schwierig, da diese Informationen per JavaScript nachladen und goutte das nicht beherrscht. Ggf. werde ich nochmal ein npm Paket mit zombie.js und/oder phantomjs schreiben.

Flattr this!

Morsecode As A Service: node.js app with restify and Heroku

Posted on 22. Januar 2015 Comments

I wanted to play around with node.js and REST APIs. Heroku is widely used for deploying node.js app, last but not least because they give you one free instance to test your code and the possibility to use your own domain name (via CNAME).

Until now the code is rather trivial. This for example is the encode function (plaintext->morsecode). It uses the npm module morse to encode the given string in the request parameters and returns it with the plaintext in an array. The requests are handled by restify.
function encode(req, res, next) {
var answer = {}
answer.plaintext = req.params.string.toUpperString();
answer.morsecode = morse.encode(req.params.string);
res.send(answer);
next();
}

This function gets called later here.
server.get('/encode/:string', app.encode);

This starts the server on the port from the Heroku instance.
var port = process.env.PORT || 8080;
server.listen(port, function() {
console.log('%s listening at %s', server.name, server.url);
});

The decode function is equivalent, except that I test if there are only „.“, „-“ and white spaces in the request.

I wrote the documentation with the automatic page generator from GitHub Pages in the repository and so with the following code the user is redirected there when entering the root „/“.

 

function redirectToDocumentation(req,res,next) {
res.send(302, null, {
Location: API_DOKU
});
next();
}

It’s reachable under morsecode-api.de or morsecodeapi.herokuapp.com.

Flattr this!

Ohrenbär Single Purpose App für Android

Posted on 15. März 2014 Comments

update: s.u.

Als Kind habe ich früher oft abends vor dem Radio gesessen und Ohrenbär – Radiogeschichten für kleine Leute gehört. Letztens hörte app-ohrenbaer-screenshotich die Titelmelodie (Peter und der Wolf von Sergei Prokofjew) und ich googelte, ob es das wohl noch gibt. Beim RBB gibt es eine Homepage dazu und es ist sogar möglich sich die verpassten Episoden herunterzuladen, welch‘ Fortschritt!

Letzten Monat hat Daniel Oeh für Toby Baier vom Einschlafen Podcast eine kinderleicht zu bedienende Single Purpose App geschrieben. Er war so nett, sie unter der MIT Lizenz als freie Software zur Verfügung zu stellen. Ich habe diesen Code genommen und in ein bisschen an Ohrenbär angepasst. Das Ergebnis findet man jetzt im Google Play Store. Das Icon habe ich wie so häufig von OpenClipArt. Es ist gemeinfrei.


 

Zum Rechtlichen: Die .mp3-Dateien kommen alle von RBB Servern, ebenso wie das Logo. Die Feed Adresse ist: http://www.ohrenbaer.de/podcast/podcast.feed.podcast.xml. Ich habe keinerlei Absichten mit dieser App Geld zu verdienen oder Copyrights zu verletzten. Ich arbeite auch nicht mit dem RBB zusammen. Ich habe die App geschrieben, weil ich Fan dieser Sendung war/bin. Die Inhalte stehen selbstverständlich immer noch unter demselben Copyright. Wenn es Probleme mit irgendwelchen Rechten gibt, dann schreibt mir bitte erstmal eine E-Mail bevor ihr mich verklagt 😉 Sollte das zufällig jemand von der RBB lesen und Interesse haben, können wir gerne darüber reden 🙂 Ich hatte schon mal eine E-Mail geschrieben aber keine Antwort erhalten.

Get it on Google Play
Ich habe mich dazu entschieden, die App offline zu nehmen. Heute bekam ich folgendes Schreiben* :

Sehr geehrter ,
wir mussten feststellen, dass Sie im Internet eine OHRENBÄR-Podcast App anbieten. Ich hoffe, Sie haben Verständnis dafür, dass die OHRENBÄR-Redaktion des rbb selbst entscheiden möchte, wie und auf welchem Wege sie die OHRENBÄR-Angebote verbreitet. Wir können daher Ihr Angebot nicht gut heißen. Es verletzt nach Auffassung unserer Juristen zudem Urheber- und Titelrechte des rbb.

Insofern fordern wir Sie auf, zur Vermeidung rechtlicher Schritte, Ihr Angebot unverzüglich aus dem Netz zu nehmen und hoffen, dass Sie dennoch Fan unserer Radiogeschichten bleiben.

*

ohrenbaer-brief-cut

Flattr this!