Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Autenticazione su Twitter con curl in PHP e BASH

Autenticazione su Twitter con curl in PHP e BASH

E-mail Stampa PDF

In questo articolo vorrei mostrare come è possibile eseguire il login in twitter usando il comando CURL.

Giusto per rende l'idea di quanto possa essere semplice potremo usare uno script bash del tipo:

#!/bin/bash

curl -c "in-cookies" http://twitter.com > output.txt
echo "********************************************" >> output.txt
curl -L -b "in-cookies" -c "out-cookies" -d "session[username_or_email]=myemail@gmail.com&session[password]=mypass" \
-A 'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' \
https://twitter.com/sessions?phx=1  >> output.txt

grep -o "twid.u.*" out-cookies

Approfitto di questo esempio per spiegare un po' alcuni parametri del comando curl.

Prima di tutto ci siamo procurati i cookies necessari collegandoci al sito di twitter, per fare questo è bastato usare il parametro -c "in-cookies", chea dispetto del nome dato al file, serve ad indicare il nome del file dove saranno scritti i cookies generati dalla pagina caricata.

L'output generato dal comando è stato inviato ad un file (output.txt) giusto per avere traccia di quello che abbiamo scaricato, ma la cosa è del tutto superflua.

Con i cookies di prima facciamo la seconda chiamata, questa volta alla pagina di login, per fare questo però devo innanzituto inviare tramite POST l'email e la password, come seconda cosa dovremo registrare i nuovi cookies in un altro file così da verificare l'esito del login.

-b "in-cookies"  -> read cookies from "in-cookies" file
-c "out-cookies" -> write new cookies in "out-cookies" file

con il parametro -d invece verrà inviata la stringa successiva, la quale contiene i dati da allegare:

-d "session[username_or_email]=myemail@gmail.com&session[password]=mypass"

infine giusto per simulare il comportamento di un vero browser modifico l'Agent, cioè il modo di presentarsi del comando al momento della richiesta http o https.

-A 'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'

Se tutto è andato bene nel file dei cookies è presente il twid, cioè l'identificativo dell'utente su Twitter.

Per ulteriori approfondimenti sul comando curl vi rimando a questo link: The Art Of Scripting HTTP Requests Using Curl.

Ora, dato che qualcuno potrebbe aver pensato ad usare questo script per provare a scoprire le credenziali degli utenti, provando ripetutamente delle password, vi dico subito che Twitter rileva i molteplici tentativi di connessione da uno stesso IP, quindi a quel punto l'utente dovrebbe inserire ulteriori password per verificare di essere un umano e non un bot.

Una volta avvenuto il corretto login, potremo inviare una richiesta qualsiasi al Twitter server, ad esempio con la seguente richiesta andremo a verificare il nome utente e la sua email, dato che nel login potrebbero essere utilizzati entrambi:

curl -L -b "out-cookies" -c "out2-cookies" \
     -A 'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' \
     https://twitter.com/settings/account >> output.txt
grep -Eo "name=\"user\[screen_name\]\".*?value=\".*?\"" output.txt | grep -Eo "\"[^\"]*?\"$"
grep -Eo "name=\"user\[email\]\".*?value=\".*?\"" output.txt | grep -Eo "\"[^\"]*?\"$"
Faccio notare che per questa terza richiesta devo utilizzare come input i cookies prodotti dall seconda richiesta:

-b "out-cookies" -c "out2-cookies"

Ora dato che a molti potrebbe interessare l'implementazione in PHP allego un piccolo script che fa più o meno la stessa cosa:

<?php 

/* custom email and password */
$EMAIL      = "pippo@gmail.com";
$PASSWORD   = "pippopass";

$mycookies = "/tmp/cookies";
$url="http://twitter.com/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $mycookies);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
if (!$result) {
echo curl_error($ch);
curl_close($ch);
exit;
}
$url="https://twitter.com/sessions?phx=1";
$p="session[username_or_email]=$EMAIL&session[password]=$PASSWORD";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $p);
curl_setopt($ch, CURLOPT_COOKIEFILE, $mycookies);
curl_setopt($ch, CURLOPT_COOKIEJAR, $mycookies);
$result = curl_exec($ch);
if (!$result) {
echo curl_error($ch);
}
curl_close($ch);

$a = preg_grep ("/twid/i", file($mycookies)); //check successfull login
if ($a==null) {
echo "NO";
} else {
echo "OK";
}
unlink($mycookies); //delete cookies file

?>

come abbiamo fatto precedentemente, nella prima richiesta scriviamo i cookies in un file, e nella seconda richiesta li usiamo come dati in ingresso e salviamo i cookies in uscita nello stesso file:

curl_setopt($ch, CURLOPT_COOKIEFILE, $mycookies); //read cookies file
curl_setopt($ch, CURLOPT_COOKIEJAR, $mycookies); //write cookies file

Per il resto segue la verifica della presenza del cookie relativo all' identificativo dell'utente su Twitter e poi l'eliminazione del file dei cookies.

 

 

echo "ok";
Ultimo aggiornamento ( Domenica 26 Febbraio 2012 09:45 )  
Loading

Login