[PHP] LiveJournal Login

Discussion in 'PHP' started by razzzar, 19 Jul 2008.

  1. razzzar

    razzzar Elder - Старейшина

    Joined:
    16 Jun 2007
    Messages:
    92
    Likes Received:
    75
    Reputations:
    5
    Пишу скрипт, который логинится в ЖЖ.
    Отправляю пост данные для логина. Получаю ответ 302 с кукисами. Отправляю их серверу, но логина так и не происходит. Подскажите где может быть ошибка.

    Code:
    	$content  = "mode=login&chal=c0:1216468800:2495:300:E7hQqy7D7SSujymYaT2h:b38844ffa11fdf08d87fc4812788a686&response=&";
    	$content .= "user=".$_POST['login']."&password=".$_POST['passwd']."&_submit=Login&remember_me=1";
    
    	$req  = "POST /login.bml?ret=1 HTTP/1.0\r\n";
    	$req .= "Accept: */*\r\n";
    	$req .= "Content-Type: application/x-www-form-urlencoded\r\n";
    	$req .= "Proxy-Connection: Keep-Alive\r\n";
    	$req .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))\r\n";
    	$req .= "Host: www.livejournal.com\r\n";
    	$req .= "Content-Length: ".strlen($content)."\r\n";
    	$req .= "Pragma: no-cache\r\n\r\n";
    	$req .= $content;
    
    	$sock = fsockopen("www.livejournal.com", 80,  $errno, $errstr, 30);
    	fwrite($sock, $req);
    	while ( $read = fread($sock, 4096) )
    	{
    		$res .= $read;
    	}
    	fclose($sock);
    
    	preg_match_all("/Set-Cookie\: (\S*)=(\S*)(|;)/", $res, $cookie);
    	for ( $i=0; $i<count($cookie[0]); $i++ )
    	{
    		$cookie[0][$i] = str_replace("Set-Cookie: ", "", $cookie[0][$i]);
    		$cookie[0][$i] = str_replace(";", "", $cookie[0][$i]);
    
    		if ( !strpos($cookies, $cookie[0][$i]) )
    		{
    			$cookies .= "Cookie: ".$cookie[0][$i]."\r\n";
    		}
    	}
    
    	$req  = "GET / HTTP/1.0\r\n";
    	$req .= "Accept: */*\r\n";
    	$req .= "Content-Type: application/x-www-form-urlencoded\r\n";
    	$req .= "Referer: http://www.livejournal.com/login.bml?ret=1\r\n";
    	$req .= "Proxy-Connection: Keep-Alive\r\n";
    	$req .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))\r\n";
    	$req .= "Host: www.livejournal.com\r\n";
    	$req .= $cookies;
    	$req .= "Pragma: no-cache\r\n\r\n";
    
    	$sock = fsockopen("www.livejournal.com", 80,  $errno, $errstr, 30);
    	fwrite($sock, $req);
    	$res = "";
    	while ( $read = fread($sock, 4096) )
    	{
    		$res .= $read;
    	}
    	echo $res;
    	fclose($sock);
    
     
    #1 razzzar, 19 Jul 2008
    Last edited: 19 Jul 2008
  2. Whirt

    Whirt Elder - Старейшина

    Joined:
    24 Jun 2008
    Messages:
    23
    Likes Received:
    86
    Reputations:
    5
    Привет. До этого парсингом ЖЖ не занимался, поразбирался минуток 20 (параметров много в куках там было), ну и вот что у меня вышло.
    На первый взгляд, все было правильно, но потом я увидел что у тебя куки немного неправильно выдираются.

    Я чуть поправил их извлечение у тебя в сорце.

    После этого стало нормально логинится :)

    Держи код: (там сразу с только-что-зареганной мной учеткой little_xekkep)

    Code:
    <?php
       $content  = "mode=login&chal=c0:1216468800:2495:300:E7hQqy7D7SSujymYaT2h:b  38844ffa11fdf08d87fc4812788a686&response=&";
        $content .= "user=little_xekkep&password=bla123&_submit=Login&remember_me=1";
    
        $req  = "POST /login.bml?ret=1 HTTP/1.0\r\n";
        $req .= "Accept: */*\r\n";
        $req .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $req .= "Proxy-Connection: Keep-Alive\r\n";
        $req .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))\r\n";
        $req .= "Host: www.livejournal.com\r\n";
        $req .= "Content-Length: ".strlen($content)."\r\n";
        $req .= "Pragma: no-cache\r\n\r\n";
        $req .= $content;
    
        $sock = fsockopen("www.livejournal.com", 80,  $errno, $errstr, 30);
        fwrite($sock, $req);
        while ( $read = fread($sock, 4096) )
        {
            $res .= $read;
        }
        echo '<pre>'.$res.'</pre>';
        fclose($sock);
    
        preg_match_all("/Set-Cookie\: (\S*)=(\S*)(|;)/", $res, $cookie);
        for ( $i=0; $i<count($cookie[0]); $i++ )
        {
            $cookie[0][$i] = str_replace("Set-Cookie: ", "", $cookie[0][$i]);
    
            if ( !strpos($cookies, $cookie[0][$i]) )
            {
                $cookies .= $cookie[0][$i].' ';
            }
        }
         echo '<h1>Cookies:</h1><pre>'.$cookies.'</pre>';   
        $req  = "GET / HTTP/1.0\r\n";
        $req .= "Accept: */*\r\n";
        $req .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $req .= "Referer: http://www.livejournal.com/login.bml?ret=1\r\n";
        $req .= "Proxy-Connection: Keep-Alive\r\n";
        $req .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))\r\n";
        $req .= "Host: www.livejournal.com\r\n";
        $req .= "Cookie: ".$cookies;
        $req .= "Pragma: no-cache\r\n\r\n";
    
        $sock = fsockopen("www.livejournal.com", 80,  $errno, $errstr, 30);
        fwrite($sock, $req);
        $res = "";
        while ( $read = fread($sock, 4096) )
        {
            $res .= $read;
        }
        echo '<h1>Response</h1><pre>'.$res.'</pre>';
        //echo $res;
        fclose($sock);
    ?>
    
    Там сразу выводится дебаг инфа, потом уберешь :)
    Удачи тебе в твоем проекте :)
     
    2 people like this.