Etikettarkiv: curl

Skicka E-post via API med Mailgun

Sedan 2011 så har jag använt Amazon Simple E-mail Service (Amazon SES) för utskick av E-post men nu har jag blivit avstängd för att jag skickat E-post med för många studs. Dvs inaktiva eller på annat sätt E-postkonton som ej fungerar.

Därför tittade jag mig omkring lite och valet föll för Mailgun som verkade kompetent. Installerade deras PHP bibliotek som pratar mot API:et men tyvärr så fungerade det dåligt med konstiga felmeddelanden om felaktig API Endpoint. Till slut så hittade jag en annan kod som använder sig av curl .

Så koden blev till slut så här:

Tidigare så har jag definerat MAILGUN_API som innehåller min API-nyckel samt DOMAIN som innehåller domännamnet som används. Även så måste funktionerna br2nl() och error() skapas och du kan nog lista ut vad dom gör.

Än så länge fungerar det bra, men måste nog implementera rate-limiting med Redis så det inte skickas ut för mycket mail av misstag.

Så analyserar och använder du iPhone Appars API

Visste du att majoriteten av alla iPhone och iPad-appar använder någon form av API?

Jag tänkte gå igenom hur du själv kan använda dessa API:er i dina egna implementationer med hjälp av exempelvis PHP eller Python. Observera att informationen som du hämtar via API:er eventuellt inte användas till vad som helst då den kan omfattas av upphovsrätt eller andra lagar.

Först och främst så måste vi ladda hem någon form av Proxy-programmvara som medger analys av den API-trafik som går fram och tillbaka från iPhonen och Appen. Jag rekommenderar Charles Proxy som är gratis att använda men det finns även en betalversion för ynka 50$ som jag har köpt (du slipper ”nag-screens” och sådant). Charles Proxy fungerar för Linux, Mac och Windows.

Här är en skärmdump på hur det ser ut när du startat upp Charles Proxy:

Så, det första vi ska göra är att stänga av så att vi ej ser all webbsurf till och från vår egna dator och det kan man göra under Proyx-fliken och sedan se till att ”Windows Proxy” ej är förkryssad.

Nästa steg är att vi ska skicka ett E-brev med Charles SSL-certifikat till vår iPhone för att ges möjlighet att analysera krypterad HTTPS-trafik till och från telefonen. Ladda hem följande ZIP-fil: charlesproxy.com/ssl.zip och packa upp den där du sedan hittar en .CRT fil som du bifogar i ett mail som du sedan kan öppna på din iPhone (Dropbox eller annan typ av filöverföring går säkert också bra).

När du lagt in Charles certifikat i din telefon bör det se ut så här under Inställningar -> Allmän -> Profil (längst ner):

Då var det nästa steg, och det är att ta reda på IP-adressen till din dator. Jag brukar använda cmd.exe och sedan skriva ipconfig så bör det se ut något i stil med:

Denna IP-adress skall vi ange under inställningarna som det nätverk vår iPhone är ansluten till. I mitt fall så är det via WiFi och längst ner under inställningarna för det trådlösa nätverket anger jag IP-adressen till min dator som kör Charles Proxy så det ser ut så här:

Sedan är det bara att starta den App som vi vill analysera på iPhonen, i mitt fall så startar jag Swedavias App vid namn Arlanda flygplats. Och se hur Charles Proxy visar API-anropen efter varandra. Eftersom vi är intresserad av Avångar så klickar jag helt enkelt på Avångar i Arlanda Appen och får upp följande intressanta API-anrop i Charles:

Fleratalet parametrar är intressanta att anteckna eftersom de behövs vid anrop från PHP eller Python. Det varierar från app till app men i detta fall är det URL:en för anrop som innehåller flygplats (airport=arn_utr) samt datum (searchDate=2011-08-10).

Tittar vi på XML-svaret så ser det ut enligt följande:

När vi sedan implementerat en funktion som härmar denna förfrågan så bör vi få ut samma XML-svar i slutändan och kan då exempelvis hämta hem avgångar med PHP och CURL på följande sätt:

<?php
  $today = date("Y-m-d");
  $path = '/ArrivalsDeparturesMobile/ArrDepMobileService/ArrDep.asmx/GetDeparturesFlightTable?airport=arn_utr&language=sv&searchString=&searchDate='.$today;
  $host = "wsc1.swedavia.se";

  $headers = array(
    "GET $path HTTP/1.1",
    "Host: $host",
    "User-Agent: Arlanda/1.4 CFNetwork/485.13.9 Darwin/11.0.0",
    "Authorization: Basic V1NBcnJEZXBNb2JpbGU6c1AtR0U1NWJlY3I4c1BhKWhlMHBlNXJ1NkVmYUNyRSE=",
    "Accept: */*",
    "Accept-Language: sv-se",
    "Accept-Encoding: gzip, deflate",
    "Pragma: no-cache",
    "Connection: keep-alive"
  );

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "http://".$host.$path);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $sXML = curl_exec($ch);

  $oXML = new SimpleXMLElement($sXML);

  print_r($oXML);

?>

Ovan kod kan du sedan köra från kommandotolken enligt följande:

$ php swedavia.php

Tadaa! Nu slipper vi använda vår iPhone varje gång vi ska se avgångar från Arlanda. I detta exempel så behövdes ej SSL-certifikatet användas då anropen skickas i klartext.

del.icio.us räknare

Vill du veta hur många personer som har en viss sida som bokmärke och använder sig av del.icio.us? För att åstadkomma detta behövs enbart några få rader kod:

function deliciouscount($url) {

$html = getpage("http://badges.del.icio.us/feeds/json/url/data?url=".urlencode($url));
$json = json_decode($html);
return $json[0]->{'total_posts'};

}

Observera att getpage() är en funktion som jag skrivit själv som hämtar en sida med hjälp av curl samt att du kommer att få error 999 om du gör för många förfrågningar.

Med en lätt modifiering av ovanstående kod går det även att få ut vad en sida har för taggar.