Newsgroup: it.comp.www.php
Titolo: Login su sito con socket [problema cookie o http?]

Salve a tutti,
tempo addietro stavo cercando di fare il login in automatico sul sito
del 
190.it
. Finalmente posso rimetterci mano, ma dopo esser andato un
piccolo pezzo in avanti incappo nuovamente in problemi:
Dopo essermi loggato ed aver aquisito i cookie CK_1, CK_2, CK_3,
mando la seguente richiesta HTTP
<inizio_richiesta_HTTP>
GET
http://www.areaprivati.190.it/190/trilogy/jsp/programView.do?pageTypeId=9604&programId=9361&channelId=-8663&ty_nocache=true&tk=9604,t&ty_op=-3,-1,-1,9604,1,-1,-1
HTTP/1.1
Host: 
www.areaprivati.190.it
User-Agent: myAgent
Cookie: CK_1=V_1; CK_2=V_2; CK_3=V_3
</inizio_richiesta_HTTP>
E vado correttamente sulla pagina che mi chiede il numero e testo del
messaggio da iniviare.
Successivamente mando la seguente richiesta
<inizio_richiesta_HTTP>
POST 
http://www.190.it/190/fsms/prepare.do
 HTTP/1.1
Host: 
www.190.it
User-Agent: myAgent
Cookie: CK_1=V_1; CK_2=V_2; CK_3=V_3
Content-Type: application/x-www-form-urlencoded
Content-Length: 203
BV_SessionID=%40%40%40%40xxxxxxxxxx.xxxxxxxxxx%40%40%40%40&BV_EngineID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.0&pageTypeId=9604&programId=9361&channelId=-8663&receiverNumber=340xxxxxxx&message=ciao+come+stai%3F
</inizio_richiesta_HTTP> 
In questo caso, nonostante resti "loggato" la rispota che ricevo
è che "Il campo messaggio deve contenere almeno un carattere." e quindi
non posso proseguire.
Sbaglio qualcosa nella richiesta HTTP?
Le due funzioni fanno semplicemente questo
function to190($url, $header) {
	$socket = fsockopen($url, 80, $errno, $errstr); 
	if (!$socket) die("Errore connessione SOCKET_STEP_2");
	fputs($socket, $header); 
	while (!feof($socket)) $result[] = fgets($socket, 4096); 
	fclose($socket);
	$opt = "";
    for ($i = 0; $i < count($result); $i++) $opt = $opt . $result[$i]; 
	return $opt;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Facendo cosě (appena provato) funziona alla perfezione:
POST /190/fsms/prepare.do HTTP/1.1
Accept -Encoding: gzip , identity
Connection: Close
Accept: */*
Accept -Language: it
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR
1.1.4322)
Host: 
www.190.it
Cookie: SITESERVER=ID=***; BV_IDS=***:@@@@***@@@@; TY_L=1; CAuthCookie=***
Content-Type: application/x-www-form-urlencoded
Content-Length: 127
BV_SessionID=@@@@***@@@@&BV_EngineID=***0&receiverNumber=347*******&message=
testo
Poi basta un GET su /190/fsms/send.do? ed il messaggio parte
correttamente...
Prova con un testo semplice e senza spazi...
Ciao!

Ti ringrazio moltissimo.
Ora effettivamente funziona, e, limando qua, limando là, ho trasformato
la funzione per mandare il messaggio nel modo seguente:
function invio_sms($cookie, $datastream) {
 $reqbody = ""; 
 foreach($datastream as $key=>$val) { 
    if ( !empty ($reqbody) ) $reqbody .= '&'; 
    $reqbody .= $key . "=" . urlencode($val); 
 }
 $socket = fsockopen('
www.areaprivati.190.it
', 80, $errno, $errstr); 
 $header = "POST /190/fsms/prepare.do HTTP/1.1\r\n"
   ."User-Agent: myAgent\r\n"
   ."Host: 
www.190.it
\r\n"
   ."$cookie\r\n"
   ."Content-Type: application/x-www-form-urlencoded\r\n"
   ."Content-Length: " . strlen($reqbody) . "\r\n"
   ."\r\n"
   ."$reqbody\r\n";
 if (!$socket) die("Errore connessione SOCKET_invio_sms_step_1");
 fputs($socket, $header); 
 while (!feof($socket)) $result[] = fgets($socket, 4096); 
 fclose($socket);
 $opt = "";
 for($i = 0; $i< count($result); $i++) $opt = $opt . $result[$i]; 
 return $opt;
}	
E richiamandola invio_sms($myC, $data), dove:
$myC = "Cookie: SITESERVER=ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; "
$myC .=
"BV_IDS=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.x:@@@@0000000000.0000000000@@@@;
e $data:
$sub = explode(':', $BV_IDS);
$data["BV_SessionID"] = $sub['1'];
$data["BV_EngineID"] = $sub['0'];
$data["pageTypeId"] = "9604";
$data["programId"] = "9361";
$data["channelId"] = "-8663";
$data["receiverNumber"] = "340xxxxxxx";
$data["message"] = "Ma ciao, come stai???";
Tutto funziona perfettamente.
Ho notato che la cosa che dava fastidio nella mia richiesta erano i
"\r\n" che mettevo in + rispetto a te.
Il problema (se vuoi nuovamente darmi una mano, o anche altre voci sono
ben accette :) ) ora è nella fase di login.
Usando la seguente funzione:
function login(&$pt1, &$pt2) {
 $socket = fsockopen('
www.190.it
', 80, $errno, $errstr); 
 $header = "POST 
http://www.190.it/190/trilogy/jsp/login.do
HTTP/1.1\r\n"
  ."Host: 
www.190.it
\r\n"
  ."User-Agent: woodAgent\r\n"
  ."Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
  ."Accept-Encoding: gzip,deflate\r\n"
  ."Content-Type: application/x-www-form-urlencoded\r\n"
  ."Content-Length: 37\r\n"
  ."\r\n"
  ."username=weigand&password=weggymaster\r\n";
 if (!$socket) die("Errore connessione SOCKET_STEP_1");
 fputs($socket, $header); 
 while (!feof($socket))
 $result[] = fgets($socket, 4096); 
 fclose($socket);
 $opt = "";
 for($i = 0; $i< count($result); $i++) $opt = $opt . $result[$i]; 
 echo $opt;
 $opt = substr($opt, 0, strpos($opt, 'Content-Encoding'));
 $start = strpos($opt, 'SITESERVER=');
 $stop = strpos($opt, ';');
 $SITESERVER = substr($opt, $start, $stop - $start + 0);
 $opt = substr($opt, strpos($opt, 'BV_IDS='));
 $BV_IDS = substr($opt, 0, strpos($opt, ';') + 0);
 $myCookie = "Cookie: $SITESERVER; $BV_IDS; TY_L=1";
 $pt1 = $SITESERVER;
 $pt2 = $BV_IDS;
 return $myCookie;
} 
Ma qualcosa non va per il verso giusto. Non vorrei sbagliare nuovamente
la richesta HTTP
Utilizzando poi infatti il $myC, $SITESERVER e $BV_IDS ricavati non
riesco a far funzionare il resto
(prima mi loggavo con mozilla, prendevo i valori del cookie e lavoravo)
Grazie, Weigand


Ti ringrazio moltissimo.
Ora effettivamente funziona, e, limando qua, limando là, ho trasformato
la funzione per mandare il messaggio nel modo seguente:
function invio_sms($cookie, $datastream) {
 $reqbody = ""; 
 foreach($datastream as $key=>$val) { 
    if ( !empty ($reqbody) ) $reqbody .= '&'; 
    $reqbody .= $key . "=" . urlencode($val); 
 }
 $socket = fsockopen('
www.areaprivati.190.it
', 80, $errno, $errstr); 
 $header = "POST /190/fsms/prepare.do HTTP/1.1\r\n"
   ."User-Agent: myAgent\r\n"
   ."Host: 
www.190.it
\r\n"
   ."$cookie\r\n"
   ."Content-Type: application/x-www-form-urlencoded\r\n"
   ."Content-Length: " . strlen($reqbody) . "\r\n"
   ."\r\n"
   ."$reqbody\r\n";
 if (!$socket) die("Errore connessione SOCKET_invio_sms_step_1");
 fputs($socket, $header); 
 while (!feof($socket)) $result[] = fgets($socket, 4096); 
 fclose($socket);
 $opt = "";
 for($i = 0; $i< count($result); $i++) $opt = $opt . $result[$i]; 
 return $opt;
}	
E richiamandola invio_sms($myC, $data), dove:



Usando la seguente funzione:


  ."username=xxxxxxx&password=xxxxxxxxxxx\r\n";
 if (!$socket) die("Errore connessione SOCKET_STEP_1");
 fputs($socket, $header); 
 while (!feof($socket))
 $result[] = fgets($socket, 4096); 
 fclose($socket);
 $opt = "";
 for($i = 0; $i< count($result); $i++) $opt = $opt . $result[$i]; 
 echo $opt;
 $opt = substr($opt, 0, strpos($opt, 'Content-Encoding'));
 $start = strpos($opt, 'SITESERVER=');
 $stop = strpos($opt, ';');
 $SITESERVER = substr($opt, $start, $stop - $start + 0);
 $opt = substr($opt, strpos($opt, 'BV_IDS='));
 $BV_IDS = substr($opt, 0, strpos($opt, ';') + 0);
 $myCookie = "Cookie: $SITESERVER; $BV_IDS; TY_L=1";
 $pt1 = $SITESERVER;
 $pt2 = $BV_IDS;
 return $myCookie;
} 
Ma qualcosa non va per il verso giusto. Non vorrei sbagliare nuovamente
la richesta HTTP
Utilizzando poi infatti il $myC, $SITESERVER e $BV_IDS ricavati non
riesco a far funzionare il resto
(prima mi loggavo con mozilla, prendevo i valori del cookie e lavoravo)
Grazie, Weigand


Una domanda stupida..ma prima die seguire il login ottieni il $BV_IDS?

> Una domanda stupida..ma prima die seguire il login ottieni il $BV_IDS?
Stupida? Forse cruciale :)
Ad ogni modo no, senza avere nel 'BV_IDS' ne 'SESSION' tento di fare il
login. Ho pensato di prendere questa trada perchè, se cancello tutti
i cookie presenti sul PC, e creo un form del tipo
<form method="post" action="
http://www.190.it/190/trilogy/jsp/login.do
">
	<input type="text" name="username" value="user" />
	<input type="text" name="password" value="pass" />
	<input type="submit" value="login" />
</form>
Mi connetto correttamente... Sbaglio in qualche punto?
Grazie
Vincenzo


si può vedere lo script all'opera!??!

Credo di star mandando la richiesta HTTP in maniera errata.
Riconosce i cookie che gli mando. Ma mi risponde come se non avessi
fatto
il login.
Weigand
PS la seconda parte, dopo il tuo aiuto, va benissimo :)
Ma mi chiedo... come mettere quei "\r\n" per la richiesta?


 i cookie presenti sul PC, e creo un form del tipo
Ho appena provato a loggarmi senza ottenere 'BV_IDS ed effettivamente
funziona...quindi problema sta nella funzione e nei comandi che invia...

 funziona...quindi problema sta nella funzione e nei comandi che invia...
Quello che ho fatto anche io, ho provato a intercettare la richiesta. 
Ma ugualmente niente. Sono certo che ho preso un SESSION e un BV_IDS 
validi ma non mi sono riuscito a connettere (se metto dati a casaccio
mi cerca di fare un redirect ad una pagina di errore). sigh, sob.
Idee, spunti? Cmq grazie


 Quello che ho fatto anche io, ho provato a intercettare la richiesta.
Io non intercetto la richiesta, ma la faccio io manualmente...faccio finta
di essere il browser...ed č cosě che dovresti fare te..

 di essere il browser...ed č cosě che dovresti fare te..
Io mando la seguente richiesta HTTP
<inizio_HTTP>
POST 
http://www.190.it/190/trilogy/jsp/login.do
 HTTP/1.1
User-Agent: myAgent
Host: 
www.190.it
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
username=xxxxxxx&password=xxxxxxxxxxxx
</inizio_HTTP>
Il sito mi risponde
HTTP/1.1 302 Found
Date: Sat, 08 Jan 2005 19:41:47 GMT
Server: Apache/2.0.39 (Unix) DAV/2
Set-Cookie: SITESERVER=ID=****; path=/; expires=Tue, 06-Jan-15 19:41:47
GMT; domain=.
190.it
Cache-Control: no-cache, no-cache, private
Cache-Control: private
Location:
http://exch.vodafone.it/CommonAuth/Master/CommonAuthGetCookieBV.asp?orgUrl=http://www.190.it/190/trilogy/jsp/md.do?method=auth
Pragma: no-cache
Expires: -1
Set-Cookie: BV_IDS=****.0:@@@@***.****;Domain=.
190.it
;Path=/
Vary: User-Agent
Content-Length: 0
Content-Type: text/html; charset=ISO-8859-1
Mi da 302, non 200...
Quindi ho qualche probelma. Ma dove sbaglio?
Faccio cosě
 $data['username'] = 'xxxxxxx';
 $data['password'] = 'xxxxxxxxxxxx';
 $result = post_it($data);
 echo $result;
La fuzione post_it($data) č cosě definita
function post_it($datastream) {
 $reqbody = ""; 
 foreach($datastream as $key=>$val) { 
   if ( !empty ($reqbody) ) $reqbody .= '&'; 
   $reqbody .= $key . "=" . urlencode($val); 
 }
 $socket = fsockopen('
www.190.it
', 80, $errno, $errstr); 
 $header = "POST 
http://www.190.it/190/trilogy/jsp/login.do
HTTP/1.1\r\n"
    ."User-Agent: myAgent\r\n"
    ."Host: 
www.190.it
\r\n"
    ."Content-Type: application/x-www-form-urlencoded\r\n"
    ."Content-Length: " . strlen($reqbody) . "\r\n"
    ."\r\n"
    ."$reqbody\r\n";
 if (!$socket) die("Errore connessione post_it");
 fputs($socket, $header); 
 while (!feof($socket)) $result[] = fgets($socket, 4096); 
 fclose($socket);
 $opt = "";
 for($i = 0; $i< count($result); $i++) $opt = $opt . $result[$i]; 
 return $opt;
}	
Grazie per l'aiuto prezioso
Weigand


 Quindi ho qualche probelma.
Ecco il tuo errore! E' GIUSTO che risposta con 302! Se continui la procedura
in 4-5 passaggi sei autenticato...
Mauro

 Se continui la procedura in 4-5 passaggi sei autenticato...
Da qui, intuisco che l'autenticazione non avvenga in un singolo
passaggio.
Ok, ora mi aspetta una cena al ristorante giapponese...
Con l'oriente la programmazione va sembre a braccetto no? E allora
stanotte
e/o domani mattina cerco di risolvere...
Ti ringrazio molto dell'aiuto.
Piccole dritte e suggerimenti ed ho fatto capendo quel che facevo senza
usare
uno script già fatto (grazie anche a Setec, e Lamase). Ora mi resta
qualche
piccolo passaggio...
Resta nei dintorni che domani fischio se ho problemi ;)
Grazie della disponibilità, davvero :)
Vincenzo


 Vincenzo
Mauro

 Tranquillo!
Firulì firulà :)
Ancora grazie, 


> Resta nei dintorni che domani fischio se ho problemi ;) > Tranquillo!
Firulì firulà :)
Ancora grazie, 


 saltare tutte le fasi iniziali? [mi sarò spiegato?]
Esegui il POST sul login.do e poi tutti GET ai vari redirect che si
presentano...ricordati che verso la fine ti viene assegnato un quatro cookie
Mauro

 presentano...ricordati che verso la fine ti viene assegnato un quatro
cookie
QUARTO cookie, non quatro ;-)

GRAZIE!!!
Mi sembra un buon inizio di post...
In 8 passaggi, come mi hai datto, mi sono loggato al sito di 
www.190.it
Annunciaziò annunciaziò. La cosa principale è esserci arrivato passo
passo
con qualche suggerimento piccolo e grande. Ora leggerò quell'RFC
sull'HTTP
che avevi postato un paio di suggerimenti fa :)
Sono molto soddisfatto, di me, e del newsgroup che nell'arco di circa 20
giorni (a fasi alterne) mi ha aiutato a realizzare questo script...
Ora devo semplicemente ottimizzare lo script, perchè ci mette
decisamente
troppo tempo per il login. Ora cerco di ottimizzare quel che posso da me
e poi ovviamente chiederò lumi.
Ancora una volta GRAZIE GRAZIE GRAZIE.
Un piccolo particolare: il famigerato QUARTO cookie non lo salvo!
Ma mi logga lo stesso, e nella seconda fase (l'invio) ugualmente non lo
uso.
Ma allora che funzione ha???


 Ma allora che funzione ha???
Non chiederlo a me...dovresti chiederlo a chi ha realizzato il sito della
vodafone ;-)
Il tuo script, alla fine, servirebbe per inviare SMS senza andare sul sito
per caso? ;-) perchè in fondo è quello che farò anche io, ma via
software..non ho un hosting personale a pagamento ;-)

 Ma allora che funzione ha???
Non chiederlo a me...dovresti chiederlo a chi ha realizzato il sito della
