LINUX.ORG.RU

Проклятый гугл


0

1

В общем задолбался две ночи подряд выяснять в чём дело. Не могу залогиниться в гугл https://accounts.google.com/ServiceLoginAuth. Что только не делал. Отчаялся реализовать с помощью CURL ф-ций, взял и написал с fsockopen который посылает абсолютно идентичный POST. Всё бесполезно. Проклятый гугл всё равно не залогинивает.


Ответ на: комментарий от trashymichael

В чём дело то там? Объясните подробнее.

psp13
() автор топика
Ответ на: комментарий от kompas

Конечная цель через php+curl отвечать на коменты в youtube. Всё застряло на стадии залогивания потому что залогиниться на youtube теперь можно только через злосчастный гугл. Этот гугл лишил меня всякого покоя, теперь я не могу заснуть пока не поборю корпорацию зла :)

psp13
() автор топика
Ответ на: комментарий от kompas

Для меня уже вопрос принципа понять в чём же дело и как такое возможно вообще. Всё работает в любом браузере, даже в консольном links. Почему же у меня не работает код? Я уже и паузу между запросом страницы с формой и постом делал - типа юзер вводит email/password. Всё отсылается точно так же как и в браузере с отключённым JavaScript а ответ другой - вместо редиректа опять страница с формой. Вот код:

#!/usr/bin/env php
<?php

$username = urlencode('fnamelname67@gmail.com');
$password = urlencode('testpass1');

class HttpError extends Exception {}

$fp = false;

class Http {
	public $cookies = array();
	
	public function __construct() {
	}
	
	public function getCookieString() {
		$ret = array();
		foreach ($this->cookies as $key => $val) {
			$ret[] = "{$key}={$val}";
		}
		$ret = join("; ", $ret);
		return $ret;
	}
	
	public function fetch($args) {
		global $fp;
		if ($fp === false) {
			if ( ($fp = @ fsockopen("{$args['proto']}{$args['host']}", $args['port'], $errno, $errstr, 30)) == false ) {
				throw new HttpError("{$errstr} ({$errno})");
			}
		}
		fwrite($fp, $args['out']);
		
		$header = '';
		while (!feof($fp)) {
			$header .= fgetc($fp);
			if (substr($header, -4) == "\r\n\r\n") break;
		}
		
		if (preg_match_all("#(Set-Cookie:.*?)\r\n#is", $header, $m)) {
			$cooks = $m[1];
			foreach ($cooks as $cook) {
				if (preg_match('#Set-Cookie:\\s*([^=]+)=([^;]*)#is', $cook, $m)) {
					$this->cookies[$m[1]] = $m[2];
				}
			}
		}
		
		if (isset($args['justHeader']) && $args['justHeader']) {
			return $header;
		}
		
		$content = '';
		while (true) {
			// Get the chunk size
			$chunkSize = '';
			while (!feof($fp)) {
				$chunkSize .= fgetc($fp);
				if (substr($chunkSize, -2) == "\r\n") break;
			}
			
			for ($i = 0, $max_i = strlen($chunkSize); $i < $max_i; $i++) {
				$j = ord($chunkSize[$i]);
				if (!( ($j >= ord('0') && $j <= ord('9')) || ($j >= ord('A') && $j <= ord('F')) || ($j >= ord('a') && $j <= ord('f')) )) break;
			}
			if ($i < 1) throw new HttpError("Invalid response");
			$chunkSize = substr($chunkSize, 0, $i);
			$chunkSize = hexdec($chunkSize);
			
			if ($chunkSize == 0) break;
			
			// Get the chunk
			$chunk = '';
			while (strlen($chunk) != $chunkSize) {
				$chunk .= fread($fp, $chunkSize - strlen($chunk));
			}
			$content .= $chunk;
			
			// Skip trailing \r\n
			fgetc($fp); fgetc($fp);
		}
		$content = gzinflate(substr($content,10,-8));
		
		//fclose($fp);
		
		return $content;
	}
}

$ch = new Http();

$out = "GET /ServiceLogin?uilel=3&service=youtube&passive=true&continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252F&hl=en_US&ltmpl=sso HTTP/1.1\r\n";
$out .= "Host: accounts.google.com\r\n";
$out .= "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n";
$out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$out .= "Accept-Language: en-us,en;q=0.5\r\n";
$out .= "Accept-Encoding: gzip, deflate\r\n";
$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
$out .= "Connection: keep-alive\r\n";
$out .= "\r\n";

$ret = $ch->fetch(array(
	'proto'		=>	'ssl://',
	'host'		=>	'accounts.google.com',
	'port'		=>	443,
	'out'			=>	$out,
));

print_r($ch->cookies);

if (!preg_match('#<input[^>]*name="dsh"[^>]*value="([^"]+)"#is', $ret, $m)) {
	die("No dsh\n");
}
$dsh = ($m[1]);
echo "\$dsh = $dsh\n";

if (!preg_match('#<input[^>]*name="GALX"[^>]*value="([^"]+")#is', $ret, $m)) {
	die("No GALX\n");
}
$GALX = ($m[1]);
echo "\$GALX = $GALX\n";

$postFields = "continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252F&service=youtube&uilel=3&dsh={$dsh}&ltmpl=sso&hl=en_US&ltmpl=sso&GALX={$GALX}&pstMsg=0&dnConn=&checkConnection=&checkedDomains=&timeStmp=&secTok=&Email={$username}&Passwd={$password}&signIn=Sign+in&PersistentCookie=yes&rmShown=1";

$out = "POST /ServiceLoginAuth HTTP/1.1\r\n";
$out .= "Host: accounts.google.com\r\n";
$out .= "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n";
$out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$out .= "Accept-Language: en-us,en;q=0.5\r\n";
$out .= "Accept-Encoding: gzip, deflate\r\n";
$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
$out .= "Connection: keep-alive\r\n";
$out .= "Referer: https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252F&hl=en_US&ltmpl=sso\r\n";
$out .= "Cookie: ".$ch->getCookieString()."\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($postFields)."\r\n";
$out .= "\r\n";
$out .= $postFields;

echo "|{$out}|";

sleep(7);

$ret = $ch->fetch(array(
	'proto'		=>	'ssl://',
	'host'		=>	'accounts.google.com',
	'port'		=>	443,
	'out'			=>	$out,
	'justHeader'	=>	true,
));

echo $ret;

exit;
psp13
() автор топика
Ответ на: комментарий от anonymous

А я вот не люблю когда отвечают не по теме. Вопрос в том что за гадость напихал гугл в свою форму для логина что она не работает ни в какую. Что за мелочь я упустил? Неужели всем форумом не сможем понять причину. Совершенно непонятно причём тут PHP-coders вообще.

psp13
() автор топика
Ответ на: комментарий от anonymous

Сам даунёнок, иди нахрен из темы. Вторая ссылка имеет нулевое отношение к вопросу залогиванивания.

psp13
() автор топика
Ответ на: комментарий от psp13

потому что вторая ссылка дает удобный инструментарий для комментариев на youtube. то есть то что тебе и надо в конечном счете. а чтобы залогиться на гугл, надо прочитать http://code.google.com/intl/en-US/apis/youtube/2.0/developers_guide_protocol_...

Hо те, кого зачали под большой дозой веществ, это не досягаемо.

anonymous
()
Ответ на: комментарий от psp13

Изучай логи общения между гуглом и браузером (снифер в помощь), потом делай также, прикидывайся браузером.

staseg ★★★★★
()
Ответ на: комментарий от anonymous

Меня интересует вопрос по какой причине не работает на вид корректный код - в этом весь смысл темы. Неужели это так трудно понять такому идиоту как ты которого зачали без веществ. Иди быдлокодствуй дальше со своей ссылкой, которую я уже до твоих комментов, которые ты наверное считаешь гениальными, читал.

psp13
() автор топика
Ответ на: комментарий от staseg

Так снифер не поможет т.к. httpS. Смотрел LiveHTTP Headers и Firebug'ом. Всё в точности как в них. Неужели это специально сделано? Но как оно определяет?

psp13
() автор топика
Ответ на: комментарий от psp13

можно посмотреть первоначальный вариант через курл? гугл постоянно допиливает защиту от автоматической регистрации/логина и других действий, сам в свое время намучался

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft
<?php
class CurlError extends Exception {}

/*******************************************************
 * This class works arround stipid interface between Curl and PHP
 * which requires creating external file within file system
 * to store cookies.
 * This class manages cookies automatically.
 * This class doesn't differentiate cookies received from different hosts,
 * so take care.
 *******************************************************/
class Curl {
	public $cookies = array();
	public $referer = '';
	public $ch;
	
	public $followRedirects = true;
	
	public function __construct($debug = false) {
		$this->ch = curl_init();
		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($this->ch, CURLOPT_HEADER, 1);
		curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0);
		//curl_setopt($this->ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
		//curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Expect:'));
		if ($debug) curl_setopt($this->ch, CURLOPT_VERBOSE, 1);
	}
	
	public function getCookieString() {
		$cookies = "";
		
		if (count($this->cookies) > 0) {
			$cookies = array();
			foreach ($this->cookies as $cname => $cval) $cookies[] = "{$cname}={$cval}";
			$cookies = join($cookies, "; ");
		}
		
		return $cookies;
	}
	
	public function fetch($url, $post = false, $postfields = array()) {
		//print(($post ? "POST" : "GET")." {$url}\n");
		curl_setopt($this->ch, CURLOPT_URL, $url);
		
		if ($this->referer != '') curl_setopt($this->ch, CURLOPT_REFERER, $this->referer);
		$this->referer = $url;
		
		if ($post) {
			curl_setopt($this->ch, CURLOPT_POST, 1);
			curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postfields);
		} else {
			curl_setopt($this->ch, CURLOPT_HTTPGET, 1);
		}
		
		if (count($this->cookies) > 0) {
			curl_setopt($this->ch, CURLOPT_COOKIE, $this->getCookieString());
		}
		
		$resp = curl_exec($this->ch);
		$error = curl_error($this->ch);
		if ($error != '') throw new CurlError($error);
		
		$httpCode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
		
		$resp = preg_replace("#^HTTP/1\\.1\\s*100\\s*Continue[^\r\n]*\r\n\r\n#is", "", $resp);
// 		echo "Response: {$resp}\n------------------------\n";
		list($header,$content) = preg_split("#\r\n\r\n#", $resp, 2);
		
		// Extract cookies from header
		if (preg_match_all("#Set-Cookie\\s*:\\s*([^;]+)#is", $header, $m)) {
			foreach ($m[1] as $cookie) {
				list($cname, $cval) = preg_split("#=#", $cookie, 2);
				$this->cookies[$cname] = $cval;
			}
		}
		
		if ($this->followRedirects && substr($httpCode, 0, 1) == '3') {
			// Handle redirect
			if (preg_match("#Location\\s*:\\s*([^\r\n]+)#is", $header, $m)) {
				$location = $m[1];
				
				// Canonicalize name if necessary
				if (!preg_match('#^https?://#is', $location)) {
					$urlComponents = parse_url($url);
					$sep = preg_match('#^/#is', $location) ? '' : '/';
					$location = "{$urlComponents['scheme']}://{$urlComponents['host']}{$sep}{$location}";
				}
				
				return $this->fetch($location);
			}
		}
		
		return $content;
	}
	
	public function put($url, $fp, $headers) {
		//echo "PUT {$url}\n";
		curl_setopt($this->ch, CURLOPT_PUT, true);
		curl_setopt($this->ch, CURLOPT_URL, $url);
		curl_setopt($this->ch, CURLOPT_INFILE, $fp);
		curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers);
		$ret = curl_exec($this->ch);
		return $ret;
	}
	
	public function parseCookies($cookieStr) {
		$cookies = preg_split("#;\\s*#is", $cookieStr, -1, PREG_SPLIT_NO_EMPTY);
		foreach ($cookies as $cookie) {
			list($cname,$cval) = preg_split("#=#is", $cookie, 2);
			$this->cookies[$cname] = $cval;
		}
	}
	
	public function setAgent($agent) {
		curl_setopt($this->ch, CURLOPT_USERAGENT, $agent);
	}
	
	public function close() {
		curl_close($this->ch);
	}
}

$username = urlencode('fnamelname67@gmail.com');
$password = urlencode('testpass1');

$ch = new Curl(true);

$ret = $ch->fetch(
	'https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252F&hl=en_US&ltmpl=sso'
);

if (!preg_match('#<input[^>]*name="dsh"[^>]*value="([^"]+)"#is', $ret, $m)) {
	die("No dsh\n");
}
$dsh = $m[1];
echo "\$dsh = $dsh\n";

if (!preg_match('#<input[^>]*name="GALX"[^>]*value="([^"]+")#is', $ret, $m)) {
	die("No GALX\n");
}
$GALX = $m[1];
echo "\$GALX = $GALX\n";

sleep (7);

curl_setopt($ch->ch, CURLOPT_HTTPHEADER, array(
	"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
	"Accept-Language: en-us,en;q=0.5",
	"Accept-Encoding: gzip, deflate",
	"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
));

$ret = $ch->fetch(
	'https://accounts.google.com/ServiceLoginAuth',
	true,
	"continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252F&service=youtube&uilel=3&dsh={$dsh}&ltmpl=sso&hl=en_US&ltmpl=sso&GALX={$GALX}&pstMsg=0&dnConn=&checkConnection=&checkedDomains=&timeStmp=&secTok=&Email={$username}&Passwd={$password}&signIn=Sign+in&PersistentCookie=yes&rmShown=1"
);

file_put_contents('hi.html', $ret);

$ch->close();

psp13
() автор топика
Ответ на: комментарий от psp13

бегло посмотрел, не понял почему useragent пустой, и почему куки костылями достаешь, вместо

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

Куки достаю костылями т.к. мне не нравится создавать файл для их хранения - это плохо для безопасности и кроме того если запустить несколько экземпляров скрипта то надо для каждого отдельный файл что усложняет код. Этот класс как и написано в комментариях к нему я разработал уже давно и применил во многих проектах. Впрочем не обращайте внимания - я пробовал уже и без него - результат идентичен.

Что касается useragent то пробовал различные значения для него, дело явно не в нём.

psp13
() автор топика
Ответ на: комментарий от psp13

ага, понятно. попробую поковырять на досуге, ибо последний раз мучался с логином в гугл не меньше полугода назад

если решишь - отпиши пожалуйста тут

xtraeft ★★☆☆
()
Ответ на: комментарий от psp13

у тебя опечатка в регекспе была

if (!preg_match('#<input[^>]*name="GALX"[^>]*value="([^"]+)"#is', $ret, $m)) {

так работает, а с твоей регуляркой к $GALX добавлялась кавычка

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

Огромное спасибо. Действительно проблема была именно в этом.

psp13
() автор топика
Ответ на: комментарий от psp13

Открой для себя MiTM.

А по теме - если будешь юзать этот свой код, то гугл быстро забанит все твои акки скопом.
Для твоих целей есть специальный софт который дает API к самому_лучшему_в_мире_браузеру, как платный так и бесплатный.
По другому будет бан, я тебе это гарантирую.

winddos ★★★
()
Ответ на: комментарий от winddos

вы вообще о чём? что за MiTM? в гугле нашёл только «Man in the middle attack». и в топку ваши индусовские примочки к браузерам. код должен работать в среде где нет не браузеров не Xorgов. десктопщики блин.

psp13
() автор топика
Ответ на: комментарий от psp13

вы

Тут не хабрахабр, говори на ты.

вы вообще о чём? что за MiTM?

SSL создан для того, чтобы защищать трафик от перехвата третьей стороной.
На локалке же ты можешь поднять свой собственный https://accounts.google.com/, с само подписанным сертификатом, и проксировать им настоящие сервера гугла.
Т.е снифать трафик ты будешь своим «SSL прокси», и точно получишь полные хедеры, а гугл даже никогда не узнает что к нему обращались через прокси.

код должен работать в среде где нет не браузеров не Xorgов. десктопщики блин.

Только в твоих мечтах.
У сервисов есть публичный API, который позволяет производить те действия, которые гугл считает приемлемыми для ботов.

Когда же ты пишешь автоматику для функций которых в API нет, то ты напрямую нарушаешь их ToS.
А значит они имеют полное право забанить все аккуанты которые нарушают их правила.

В общем пиши дальше на curl, и готовься покупать аккуанты/прокси кучами.
Я даже с тобой спорить не буду, т.к спа^W автомитизацией работы с веб сервисами я занимаюсь уже очень и очень давно.

код должен работать в среде где нет не браузеров не Xorgов. десктопщики блин.

Ну я как бы говорил про IE, хотя может сейчас уже есть API для других браузеров.

winddos ★★★
()
Ответ на: комментарий от winddos

curl может послать точно такой же заголовок как и любой другой браузер и как следствие никто не сможет определить что это скрипт. Выше уже написано что ошибка была в неправильном regexp. Телепатией не обладает даже гугл.

Ну я как бы говорил про IE, хотя может сейчас уже есть API для других браузеров.

Для твоих целей есть специальный софт который дает API к самому_лучшему_в_мире_браузеру, как платный так и бесплатный.

IE самылй лучший в мире браузер? Изыди, Еретик!

psp13
() автор топика
Ответ на: комментарий от psp13

curl может послать точно такой же заголовок как и любой другой браузер и как следствие никто не сможет определить что это скрипт.

А ещё яваскрипт исполняет, да, и картинки качает как нормальный браузер?
И баги эмулировать умеет?

Телепатией не обладает даже гугл.

Зато обладает Google Analytics, лучший в мире базой GeoIP, и лучшей в мире защитой от ботов.
А ещё у него свой браузер, да.

В общем я даже спорить с тобой не буду, долгой жизни твоим аккуантам.

winddos ★★★
()
Ответ на: комментарий от winddos

Использование браузера с отключённой графикой и JS не противоречит ни каким правилам пользования. Но вам маздайщикам видимо это неизвестно.

psp13
() автор топика
Ответ на: комментарий от AGUtilities

Можешь ТС не рассказывать, он не поймет пока у него пару десятков акков не забанят.

winddos ★★★
()
Ответ на: комментарий от AGUtilities

Так и нет смысла логиниться часто. Хранить куки в DB и логиниться только если они не подходят.

Ну а о чём любитель IE говорит хз. Видимо маздайщики не знаю что протокол один для всех клиентов. Ну у них, маздайщиков, свой особый стиль. Куча глючных VB скриптов кликающих по кнопочкам в IE.

psp13
() автор топика
12 сентября 2012 г.

Такая же проблемма.

Такая же проблемма. Вроде вы динственны, у кого я нашел такую проблемму. если вам удалось ее решить, подскажите как.

tro9lh
()
22 декабря 2012 г.
Ответ на: комментарий от psp13

Конечная цель через php+curl отвечать на коменты в youtube.

Это не гугл проклятый, это задача у вас странная. Неужели там нет API нормального? Google же умеет oauth2, поищите API. Если нету - не занимайтесь ерундовыми заказами, всё равно гугл забанит.

Alve ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.