25 янв. 2011 г.

Авторизация в Яндексе – php, curl и cookies

В прошлом посте мы делали POST запросы, а сегодня мы будем авторизироваться в Яндексе. Помимо отправки POST формы с логином и паролем, нам необходимо будет также авторизироваться, тоесть сохранить нужные куки и отдавать их в последующих запросах.
Поставим себе следующую задачу – получать содержимое панели вебмастера с помощью PHP.
Все знают, как при помощи PHP получить содержание той или иной страницы. Но в нашей задаче есть одна загвоздка – чтобы получить страницу с сайтами определенного аккаунта, нам нужно войти под этим аккаунтом. Для этого необходимо отправить POST форму отсюда. Внимательно изучаем все поля этой формы, нам необходимо отправить Яндексу все эти поля. В ответ Яндекс даст нам куку, которую мы должны сохранить и отдавать обратно Яндексу при каждом следующем посещении страницы с инфой, доступной только авторизированным пользователям.


Вот, собственно, функция авторизации:
HTML
Текст
  1. php
  2. $url = "http://passport.yandex.ru/passport?mode=auth"; //УРЛ, куда отправлять данные

  3. /*
  4. Переменные, которые мы будет отправлять Яндексу в виде POST запроса:
  5. */
  6. $login = 'test'; //Логин
  7. $passwd = 'test'; //Пароль
  8. $user_cookie_file = $_SERVER['DOCUMENT_ROOT'].'/cookies.txt'; //Полный путь до файла, где будем хранить куки
  9. $idkey = '3121235564020nVDfxvth2'; //Хрен знает что
  10. $retpath = 'http://webmaster.yandex.ru/'; //Откуда мы пришли на страницу авторизации
  11. $timestamp = ''; //Хрен знает что
  12. $twoweeks = 'yes'; //Две недели какие-то
  13. $In = 'Войти'; //Кнопка входа

  14. /*
  15. Функция:
  16. */
  17. function auth($url) {
  18. global $user_cookie_file, $idkey, $retpath, $timestamp, $login, $passwd, $twoweeks, $In; // Получаем все POST данные
  19. /*
  20. Небольшая прелюдия с инифиализацией cURL и прочей шулухой
  21. */
  22. $ch = curl_init($url);
  23. curl_setopt($ch, CURLOPT_URL,$url);
  24. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  25. curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");

  26. curl_setopt($ch, CURLOPT_COOKIEFILE, $user_cookie_file); //Куки раз
  27. curl_setopt($ch, CURLOPT_COOKIEJAR, $user_cookie_file); //Куки два

  28. curl_setopt($ch, CURLOPT_POST,1); //Будем отправлять POST запрос

  29. /*
  30. Формируем и отправляем тот самый POST запрос.
  31. Как видите, это простая строка, мало чем отличающаяся от GET.
  32. */
  33. curl_setopt($ch, CURLOPT_POSTFIELDS,"idkey=$idkey&retpath=$retpath&timestamp=$timestamp&login=$login&passwd=$passwd&twoweeks=$twoweeks&In=$In");
  34. $html = curl_exec($ch);
  35. curl_close($ch);
  36. return $html; //Возвращаем ответ Яндекса
  37. }

  38. auth($url); // Авторизируемся.
  39. ?>
С авторизацией все понятно – отправили логин, пароль и прочую информацию, сохранили отданные Яндексом куки. Теперь нам необходима функция, которая будет отдавать сохраненные куки Яндексу и получать ответ, тоесть ходить по защищенным страницам как добропорядочный живой юзер с настоящего добропорядочного браузера.
Вот эта функция:
HTML
Текст
  1. php
  2. function browser($url) {
  3. $user_cookie_file = $_SERVER['DOCUMENT_ROOT'].'/cookies.txt'; //Получаем сохраненный после авторизации файл с куками.
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_URL,$url);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  7. curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
  8. curl_setopt($ch, CURLOPT_COOKIEFILE, $user_cookie_file); //Подставляем куки раз
  9. curl_setopt($ch, CURLOPT_COOKIEJAR, $user_cookie_file); //Подставляем куки два
  10. $html = curl_exec($ch);
  11. curl_close($ch);
  12. return $html; //Возвращаем ответ
  13. }
  14. echo browser('http://webmaster.yandex.ru/'); //Безпрепятственно выводим заветную инфу
  15. ?>
Надо также сказать, что авторизироваться достаточно один раз, а потом в течение 2х недель просто юзать функцию browser();
Думаю, вы понимаете, что описанным способом можно авторизироваться не только на Яндексе, а вообще где угодно.
Удачи.