Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Авторизация на Google
 
 автор: Popov   (17.10.2009 в 10:19)   письмо автору
 
 

Здравствуйте,
проблема возникла буквально несколько дней назад. До этой поры скрипт по авторизации в системе работал нормально и необходимые данные получались.

В цикле перебираются аккаунты, под их логином/паролем авторизовуюсь в системе LBC (Local Business Center), и затем захожу как авторизованный пользователь на главную страницу.

Вот скрипт:


$username = $account->account_name;
$password = $account->account_password;
                    
$postdata="Email=$username&Passwd=$password&service=lbc&gl=US&hl=en-US&continue=http://www.google.com/local/add/businessCenter?hl=en-US&gl=US";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,"https://www.google.com/accounts/ServiceLoginAuth?service=lbc");
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);    
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(BASEPATH).'/files/cookiefile.txt');
$AskApache_result = curl_exec($ch);
        
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/local/add/businessCenter?hl=en-US&gl=US");
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(BASEPATH).'/files/cookiefile.txt');
$result = curl_exec($ch);
curl_close($ch);


До какого-то момента этот скрипт работал правильно. В переменной $AskApache_result - возвращается страница, на которой необходимо пройти авторизацию с нужными coockie, которые сохранялись в файл. Затем я заходил на нужную мне страницу с сохраненными ранее coockie и получал содержимое главной страницы сервиса - требуемый результат.

Но после того, как я удалил старый файл coockies.txt (на сколько я помню, там было больше информации, чем сохраняется сейчас при авторизации) - авторизацию пройти не могу. В переменную $result возвращается:

HTTP/1.1 302 Moved Temporarily
Content-Type: text/html; charset=UTF-8
Location: https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&service=lbc&hl=en-US&gl=US
Date: Sat, 17 Oct 2009 06:47:57 GMT
Expires: Sat, 17 Oct 2009 06:47:57 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Server: GFE/2.0
Transfer-Encoding: chunked

<HTML>
<HEAD>
<TITLE>Moved Temporarily</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Temporarily</H1>
The document has moved <A HREF="https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&amp;service=lbc&amp;hl=en-US&amp;gl=US">here</A>.
</BODY>
</HTML>


Если скрипт работал нормально, то на ум приходит только один вариант: что-то было изменено в самой системе авторизации и в итоге я сохраняю/передаю не все данные.

Перепробовал массу вариантов, пока никаких положительных результатов.
Был вариант использования Auth и SID, но пока не знаю, как его использовать.

Буду благодарен любым новым идеям.

Заранее благодарен,
Денис

  Ответить  
 
 автор: Ramilka   (19.10.2009 в 13:17)   письмо автору
 
   для: Popov   (17.10.2009 в 10:19)
 

HTTP/1.1 302 Moved Temporarily

Это означает, что страница перемещена вот сюда:
Location: https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&service=lbc&hl=en-US&gl=US 

Рекурсивно идите и все.

или измените
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0)

на
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1)

  Ответить  
 
 автор: Popov   (19.10.2009 в 16:05)   письмо автору
 
   для: Ramilka   (19.10.2009 в 13:17)
 

Не совсем. В поисках решения помог снифер.
При попадании на страницу авторизации гугл сохраняет первые куки. Если их удалить, то при вводе логина/пароля Гугл сообщает, что куки не включены.
Так вот эти куки и сохранялись у меня в файле. Их же нужно было считать с шапки страницы и прикрепить к строке post-запроса. В дополнение ко всему, в пост-запрос я включил все поля, в т.ч. hidden, данные которых учитывались при авторизации.


$postdata="continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&service=lbc&hl=en-US&gl=US&Email=".$username."&Passwd=".$password."&PersistentCookie=yes&rmShown=1&signIn=Sign+in&asts=";

$ch = curl_init('https://www.google.com/accounts/LoginAuth');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
curl_setopt ($ch, CURLOPT_REFERER, 'https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&service=lbc&hl=en-US&gl=US');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, dirname(BASEPATH).'/files/cookiefile.txt');
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));        
curl_exec ($ch);
$result = curl_multi_getcontent ($ch);
                    
preg_match('/GALX=(.*)/', $result, $matches);
$is_found = preg_match("/GALX=(.*?);Path/si", $matches[0], $info);
                    
curl_setopt ($ch, CURLOPT_URL,"https://www.google.com/accounts/ServiceLoginAuth?service=lbc");
curl_setopt($ch, CURLOPT_REFERER, "https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Den-US%26gl%3DUS&service=lbc&hl=en-US&gl=US");
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata."&GALX=".$info[1]);    
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(BASEPATH).'/files/cookiefile.txt');
$AskApache_result = curl_exec($ch);
            
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/local/add/businessCenter?hl=en-US&gl=US");
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(BASEPATH).'/files/cookiefile.txt');
$result = curl_exec($ch);


В итоге, в файле coockies.txt я получил большой список нужных мне кукисов и дальше все пошло отлично.
Выложил код, т.к. буду рад, если кому-то это пригодится. В поисках нужной мне информации очень много примеров авторизации на gmail, Google Analystics. Но нужной мне так и не нашел. К тому же, как стало известно, Google периодически меняет систему авторизации.

  Ответить  
 
 автор: Donbernardo   (02.05.2010 в 19:21)
 
   для: Popov   (19.10.2009 в 16:05)
 

Спасибо за скрипт, очень помог. Сам бы не дошел до этого GALX

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования