Pull to refresh

Автоматическое оповещение читателей о новостях с помощью ВКонтакте. Часть 3

Reading time 3 min
Views 2.2K
Те, кто до этого времени использовали класс vk.wallpost.php, возможно, столкнулись с проблемой работы данного скрипта на хостинге. Данный класс был написан пользователем xbreaker и подробно разобран по частям в статьях: Часть 1 и Часть 2.

Скрипт замечательно работает на локальном компьютере. Но когда его закидываешь на хостинг он перестает отсылать сообщения.



Поиски проблемы


По сути, я очень долго не мог понять в чем проблема. Я пытался отследить все вызовы curl, и обнаружил, что пользователь проходит авторизацию (получает куки с полем sid), но отсылать сообщения он не хочет, мало того, после этой попытки он вообще терял авторизацию. Причина могла крыться либо в настройках хостинга, либо в том, что сервис «вконтакте» блокировал вход на сайт.

Первое я отбросил, т.к. был уверен, что скрипт не содержит никаких мудреных конструкций, которые не могут работать на нормально настроенном хостинге. Мне показалось, что «вконтакте» блокирует айпи адреса некоторых хостеров, но это было бы полным извращением для администраторов «вконтакте».

Причина оказалось совсем банальной. После нескольких в пустую потраченных часов я решил вывести, что же выдает в ответ сервис «вконтакте»:



Теперь стало очевидно, что действительно это блокировка. Теперь осталось ее обойти.


Решение проблемы


Первое, что нам понадобиться – это последние четыре цифры номера телефона, как написано в сообщении. Чтобы посмотреть заголовки ответа при отправке кода, я воспользовался анонимайзером и инспектором браузера:



Видно, что нам необходимы для отправки данного кода дополнительно два параметра: «hash» и «to», которые можно получить на странице с запросом этого кода (т.к. эти данные отправляются через AJAX, то они написаны в JS коде).

Выражения для парсинга я составил следующие:

preg_match_all('/hash: \'(.+?)\'/i', $r, $f4);
preg_match_all('/[, ]to: \'(.+?)\'/i', $r, $f5);


И добавил их в функцию getParams():

private function getParams()
{
$c=$this->getCurl();
curl_setopt($c, CURLOPT_REFERER, 'http://vkontakte.ru/settings.php');
curl_setopt($c, CURLOPT_URL, $this->wallURL); //запрос стены для поиска на ней информации
$r = curl_exec($c);
preg_match_all('/"post_hash":"(\w+)"/i', $r, $f1);
preg_match_all('/"user_id":(\d+),/i', $r, $f2);
preg_match_all('/handlePageParams\(\{"id":(\d+),/i', $r, $f3);
preg_match_all('/hash: \'(.+?)\'/i', $r, $f4);
preg_match_all('/[, ]to: \'(.+?)\'/i', $r, $f5);
$f = array(
'post_hash' => @$f1[1][0], //необходим для успешного поста
'user_id' => @$f2[1][0],
'my_id' => @$f3[1][0], //id залогиненного пользователя
'hash' => @$f4[1][0],
'to' => @$f5[1][0]);
if ($this->wallId=="")
$this->wallId=$f["my_id"];
return $f;
}


Т.е. теперь мы получаем со страницы кроме айдишников еще и эти два параметра.

Теперь можно сделать функцию, для ввода этого кода:

private function check($params) {
$c = curl_init();
$params = 'code='. $this->code. '&act=security_check&to='. $params['to']. '&hash=' .$params['hash']. '&al_page=';
curl_setopt($c, CURLOPT_URL,'http://vkontakte.ru/login.php');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_COOKIEJAR, $this->_cookies);
curl_setopt($c, CURLOPT_COOKIEFILE, $this->_cookies);
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_USERAGENT, $this->userAgent);
curl_setopt($c, CURLOPT_POSTFIELDS, $params);

$this->execCurl($c, 'check');

return true;
}


В ней используется свойство класса $this->code, которое я объявил выше.

Это свойство устанавливается в конструкторе, поэтому теперь создание класса происходит следующим образом:

$vk = new vk_wallpost($login, $pass, $code, $wallURL, $wallId="");


Использование


Теперь скрипт работает и на хостинге. Но все же в нем осталась одна проблема: если параметры авторизации сервиса «вконтакте» изменятся, скрипт перестанет работать.

Рабочий скрипт с примером лежит здесь.

Еще раз огромное спасибо автору класса. Надеюсь, он не обидится за исправления.
Tags:
Hubs:
+13
Comments 19
Comments Comments 19

Articles