Здравствуйте!
Есть задача - написать скрипт, позволяющий залогиниться в вк по логину и паролю, имитируя браузер.
Есть код, который должен работать, но почему-то авторизации не происходит. Я так понимаю, у вк есть какая-то защита (про проверку IP в курсе, дело не в этом, т.к. хостинг, с которого пытался всё это делать - российский). Но я не понимаю, какая именно. Вроде всё точно воспроизвёл. Неужели какие-то хитрые тайминги (настоящий браузер работает медленнее)?
Вот мой текущий код (писался год назад, мог несколько устареть).
<?php
$str = file_get_contents("https://vk.com/login");
$doc = new DOMDocument();
$doc->loadHTML($str);
//print_r($doc->getElementById("login_form")->childNodes);
echo "<pre>\r\n";
foreach($doc->getElementById("login_form")->childNodes as $node) {
if ($node->nodeType == 1 && $node->tagName == "input") {
if ($node->getAttribute("name") == "ip_h") $ip_h = $node->getAttribute("value");
if ($node->getAttribute("name") == "lg_h") $lg_h = $node->getAttribute("value");
//echo $node->getAttribute("name").": ".$node->getAttribute("value")."<br />\r\n";
}
}
$url = "https://vk.com/login?act=login";
$post_data = array (
"act" => "login",
"role" => "al_frame",
"expire" => "",
"captcha_sid" => "",
"captcha_key" => "",
"_origin" => "https://vk.com",
"ip_h" => $ip_h,
"lg_h" => $lg_h,
"email": "sample_user@gmail.com",
"pass" => "PASSWORD"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, "vg75hjg96.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "vg75hjg96.txt");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
echo "</pre>\r\n";
?>
В результате никакой авторизации не происходит.
Кстати, замечал странный баг: в браузере с верным паролем авторизация тоже иногда происходит не с первого раза. При этом выглядит всё не совсем так, как при вводе неверного пароля с точки зрения UI, сообщение об ошибке чуть иное.
Есть какие-то идеи, что делать?