avatarphpdreamer.ru

icq icon my icq nomber

e m a i l:
my email @mail.ua

Блоги моих читателей


҉ Новости и анонсы блога



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

Вконтакте перенаправляют личные сообщения на телефон если их не читать (при соответствующей опции в настройках), значит нам достаточно отправить себе сообщение на vk.com в ЛС.
Раньше я уже писал такой скрипт, но он парсил html код, а в дуровской социальной сети этот код меняется чуть ли не каждый день, в связи с новым функционалом, дизайном или просто для красоты. В этот раз я сделал скрипт на основе использования API, а это значит что скрипт должен прожить значительно дольше. Для нас очень важна в этом именно надежность.

Для начала затратим несколько минут на официальную документацию http://vk.com/developers.php и статью на хабре Алгоритм обращения программы к API VKontakte http://habrahabr.ru/blogs/vkontakte/131943/

Нам нужно создать приложение (Вам это делать не нужно, я уже это сделал, сможете спокойно пользоваться моим), затем дать для своего аккаунта разрешение на отправку сообщений через это приложение, в ответ на что нужно получить access_token, который даст возможность использовать API (в случае с отправкой сообщений, этот токен живет всего сутки). Само приложение представляет собой только запись в БД с кодом доступа, уникальным номером id (2810987) и названием.
Задумано что это делается через пользователем вручную через форму, поэтому нам лучше бы это автоматизировать. Также нужно автоматизировать разгадывание и ввод защитной капчи, на случай если Вконтакте это попросит, а именно так обязательно и произойдет. Для разгадывания изображений у нас есть сервис, где за нас это сделают мартышки - http://antigate.com/ , цена по 1$ за 1000 картинок (для наших целей этого хватит на долго), процент ошибок менее 10%. В скрипте предусмотрим, чтоб если обезьянка ошибется с картинкой, попросим разгадать новую и так до 5 раз, пока сообщение не отправится. Вот собственно скрипт:
<?php
/**
 * Скрипт для отправки сообщений на vk.com себе, через API
 * Автор: @link http://phpdreamer.ru
 * Дата: 18.02.2012
 * Инструкция:
 *  установить в каталог на сервере, поменять параметры $secretString, $email,
 *  $password, $antigate и COOKIES на свои, сделать доступными для записи файлы
 *  COOKIES и captcha.jpg, проследить что есть файл antigate.php
 *  На аккаунте Вконтакте включить смс-оповещение о новых личных сообщениях.
 *  Для отправки себе сообщения - откройте адрес скрипта с параметрами:
 *     http://your_site/script_directory/index.php?message=Сообщение&secret=YourSecret
 *  где "your_site" - это домен вашего сайта
 *      "script_directory" - каталог со скриптом
 *      "Сообщение" - это текст сообщения (его желательно предварительно обработать php функцией urlencode)
 *      "YourSecret" - это строка, которую Вы указали в $secretString
 *  Пример:
 *  http://localhost/vkSms/index.php?message=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82,%20%D0%9D%D0%B8%D0%BA%D0%B8%D1%82%D0%B0!&secret=24rg6-6ve33f_f432
 */


//проверочный параметр для защиты от вызова скрипта посторонними
$secretString = '24rg6-6ve33f_f432';
//данные для авторизации на vk.com
$email = 'm6754365@mail.ru';
$password = 'qwerasdf123456asdf';
//ключ API вашего аккаунта на сервисе antigate (для разрадывания картинок)
$antigate = '21436b269aa16d2b5c93c657b6fff208';
//временный файл для записи COOKIES, доступный для записи, но не доступный для скачивания
define('COOKIES', $_SERVER['DOCUMENT_ROOT'] . '/vkSms/cook.txt');

// Подключаем антигейт
require 'antigate.php';
// Проверяем секретный параметр
if(!isset($_GET['secret']) || urldecode($_GET['secret']) != $secretString)
    die('secretString Error');
// Получаем текст сообщения
$message = isset($_GET['message']) ? urldecode($_GET['message']) : 'Сообщение из PHP';

// Функция для работы с cUrl
function curl(
        $url,
        $post='',
        $headers=1)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, $headers);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 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.4');
    curl_setopt($ch, CURLOPT_ENCODING, 'utf-8');
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 200);
    if ($post)
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }
    if (defined('COOKIES'))
    {
        curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIES);
        curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIES);
    }
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
// Чистим кукисы
file_put_contents(COOKIES, '');
// Идем за token-ом для API
$page = curl('http://api.vk.com/oauth/authorize?client_id=2810987&redirect_uri=http://api.vk.com/blank.html&scope=messages&display=page&response_type=token');

if (preg_match_all('#<input type="hidden" name="([^"]+)" value="([^"]+)"#', $page, $hidden))
{ // Найдена форма для авторизации, извекаем hidden поля
    $post = array(
        'expire' => 0,
        'email' => $email,
        'pass' => $password,
    );
    foreach ($hidden[1] as $i => $hk)
        $post[$hk] = $hidden[2][$i];
    // Отправляем запрос для авторизации
    $page = curl('https://login.vk.com/?act=login&soft=1', $post);
    // Нажимаем на кнопку "Разрешить", если еще не нажали
    if (preg_match('|function approve[^l]+location.href = "([^"]+)|m', $page, $approve))
        $page = curl($approve[1]);
    // Нам дали token
    if (preg_match('|Location: http://api.vkontakte.ru/blank.html#access_token=([^&]+)&expires_in=[0-9]+&user_id=([0-9]+)|', $page, $data))
    { // Формируем url для отправки сообщения через API
        $url = 'https://api.vkontakte.ru/method/messages.send?uid='
                . $data[2] . '&message=' . urlencode($message)
                . '&access_token=' . $data[1];
        // Пробуем запрос на отправку сообщения
        $page = curl($url);
        // Попыток ввода капчи, на случай таковой
        $try = 5;
        while ( // Если с нас просят капчу
        preg_match('|"captcha_sid":"([0-9]+)"|', $page, $c)
        && preg_match('|"error_msg":"Captcha needed"|', $page)
        && --$try > 0 // И попытки ввода еще остались
        )
        { // Скачиваем капчу
            file_put_contents(
                    'captcha.jpg',
                    curl('http://api.vk.com/captcha.php?sid=' . $c[1], 0)
            );
         // Разгадываем капчу и повторяем запрос
            $page = curl($url . '&captcha_sid=' . $c[1] . '&captcha_key='
                    . recognize('captcha.jpg', $antigate, 0));
        }//end while
    }
    else
        echo 'Error on step 2';// Не найден token для Api
}
else
    echo 'Error on Step 1'; // Не найдено формы для авторизации
// Чистим кукисы
file_put_contents(COOKIES, '');

// Если отправка успешна
if (preg_match('|{"response":[0-9]+}|', $page))
    echo 'TRUE';        
       
Скачать его можно по ссылке: Скачать скрипт.

Share
Суммарный рейтинг: 35
Оценить:

комментарии:

  1. Максим (23.02.12)

    Интересная статья. Я давно хотел поизучать принцип отправления смс сообщений.

    bamaxlab.ru

  2. as (28.03.12)

    Перестало работать (((

Оставить комментарий


(место для баннера 100р/мес.)