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

Собственно, одними сообщениями мы не ограничимся. Все будет работать через standalone приложение vk по тому принципу, что мы потенциально сможем делать все действия, которые будут доступны этому самому пользователю (точнее все то, на что мы выдадим сами себе права, но об этом чуть позже).

Сообщения рассматриваем именно по той причине, что с ними можно работать только в standalone-приложениях.

План действий:
1. Создаем приложение
2. Получаем access_token
3. отправляем сообщения

1. Создаем приложение


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

Идем сюда vk.com/dev, жмём создать приложение.

image

Имя пишем какое угодно — фигурировать оно нигде не будет.
Тип — Standalone-приложение.

Далее потребуется ввести код с смс-ки которая придет на привязанный к аккаунту номер. После ввода кода ничего не меняем в полях, идем в настройки и копируем ID приложения.

image

Больше тут можно ничего не трогать.


2. Используя ID и secret_key из приложения получаем access_token


access_token — строка из некоторого количества символов, которая будет отправляться с POST запросом для выполнения каких то функций. Собственно, к ней привязано, от имени какого пользователя будем действовать и что нам можно будет делать.

Для этого создаем на сайте страничку вот с таким кодом:
<?

$client_id = '1111111';
$scope = 'offline,messages'
?>

<a href="https://oauth.vk.com/authorize?client_id=<?=$client_id;?>&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=<?=$scope;?>&response_type=token&v=5.37">Push the button</a>

$client_id — собственно, ID нашего приложения из пункта 1.

$scope — список прав, которые мы можем делать от имени нашего пользователя. Конктерно, для нашей задачи подходит именно такой: возможность доступа в любое время (offline), и доступ к сообщениям (messages). Если надо больше, полный список тут. Можно выставлять либо битовой маской, либо перечислить названия.

Далее, важный момент: Заходим на нашу страничку с кнопкой, будучи залогованы в ВК под тем пользователем, от имени которого будем работать, и жамкаем по кнопочке. Появится подобный запрос:

image

Помимо пункта доступ к общей информации, все остальные пункты будут соответствовать списку разрешений, которые были переданы в scope. Жмем далее и видим следующее:

image

Красным выделен acces_token, ради которого весь второй пункт и писался.


3. HTTP запросами, передавая через POST параметры отправляем сообщения или используем любые другие методы API



Для нетерпеливых, проверить что все работает можно так:

Заменяем нули в конце на наш acces_token и переходим по этой ссылке в браузере.
https://api.vk.com/method/messages.send?user_id=6269901&message=habrahabr&v=5.37&access_token=000000

Что произойдет:
Сообщение с текстом из параметра message будет отправлено пользователю c указанным user_id. (Если оставить как есть — придет мне. Я не обижусь).

Параметры получателя:

  • user_id — id пользователя-адресата
  • domain — вместо user_id можно указать имя странички адресата (то, что в url-е после vk.com)
  • chat_id — сообщение уйдет в чат. Чтоб взять id чата, заходим в нужный чат, url будет иметь вид vk.com/im?peers=000000&sel=c888. Наш chat_id будет 888 (! не с888)

Другие параметры отправки сообщений.

Полный список методов (при параметре scope=offline,messages) работать можно будет, соответственно только с разделом сообщений.

Ну и напоследок функция для отправки сообщения через POST. Простая, как автомат Калашникова — просто для наглядности:
function send($id , $message)
{
    $url = 'https://api.vk.com/method/messages.send';
    $params = array(
        'user_id' => $id,    // Кому отправляем
        'message' => $message,   // Что отправляем
        'access_token' => '0000000000000000000000000000',  // access_token можно вбить хардкодом, если работа будет идти из под одного юзера
        'v' => '5.37',
    );

    // В $result вернется id отправленного сообщения
    $result = file_get_contents($url, false, stream_context_create(array(
        'http' => array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query($params)
        )
    )));
}



Напоследок, все ссылки:

Страница разработчиков
Создание приложения
Список возможных разрешений
Все методы
Параметры отправки сообщения

Таки всё.

Комментарии (20)


  1. volk0ff
    27.08.2015 15:48
    -2

    В ВК у пользователей есть одна любопытная фича — отправка email-ов непосредственно из своих сообщений
    (для этого просто надо указать, email в качестве получателя, вместо какого пользователя)

    Как только техподдержка отпишется, можно ли то же самое делать через API, дам знать


  1. leoismyname
    27.08.2015 15:58
    +1

    Если бы автор статьи использовал многочисленные реализации клиентов VK API на PHP, то статья бы уложилась в пару абзацев.


    1. stas404
      28.08.2015 05:06
      +1

      Несколько более компактный вариант статьи:

      1. Создать в VK standalone-приложение vk.com/editapp?act=create
      2. Перейти по ссылке вида https://oauth.vk.com/authorize?client_id=12345678&scope=abcdef&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.37&response_type=token
        где предварительно:
        — заменить «12345678» на id созданного приложения,
        — заменить «abcdef» на строку с необходимыми правами доступа (https://vk.com/dev/permissions).
        Например, «wall,photos,messages,offline».
      3. Получить «TOKEN» из адресной строки в параметре «access_token»: oauth.vk.com/blank.html#access_token=TOKENb&expires_in=0&user_id=123456789
      4. Вызвать необходимый метод API, путем отправки соответствующего запроса на любом ЯП с указанием метода и полученного токена. Например:
        api.vk.com/method/users.get?user_id=66748&v=5.37&access_token=TOKEN


      1. leoismyname
        28.08.2015 08:16

        О чем-то таком я и говорил, ага)


  1. BupycNet
    27.08.2015 16:03

    А таким же методом можно читать сообщения пользователя в диалогах? Ну с его разрешения конечно. к примеру хочу сделать бекап истории сообщений.
    Я разговаривал с поддержкой, для веб-сервисов они такую фичу не дают. Я верно понял, вы зарегали приложение как Standalone чтобы получить токен с сообщениями. а потом просто берете его и используете через PHP?
    Ну интересный вариант.

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


    1. volk0ff
      27.08.2015 16:07

      https://vk.com/dev/messages.get
      https://vk.com/dev/messages.getDialogs
      https://vk.com/dev/messages.getHistory

      В зависимости от поставленной задачи, что то из этого


    1. volk0ff
      27.08.2015 16:13

      Вообще как ВК ко всему этому относится?

      Ну они API для разработчиков сторонних то и сделали.

      Ну к примеру если я буду просить пользователей копировать этот токен в сервис

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


    1. kimrgrey
      27.08.2015 23:28

      Очень давно и очень подробно обсуждали с парнями из команды разработки API ВК в комментариях к посту про разные уровни access_token-ов и тот факт, что веб-приложениям запрещено получать токен с такими правами доступа, и почему и что за это бывает. Вот: habrahabr.ru/post/179953. Если выпредложите пользователю скопировать такой access_token из адерсной строки браузера, будьте готовы, что вас забанят к чертвой матери и без объявления войны.


  1. Neuronix
    27.08.2015 17:20
    +1

    Что это? И, главное, зачем это?


  1. seokirill
    27.08.2015 17:22

    ".html?ope=<?=$scope;?>"

    тут нет опечатки?


    1. volk0ff
      27.08.2015 17:48

      Вы за кусок из второго пункта?

      там вроде

      &scope=<?=$scope;?>
      


      Вроде нет: В параметр вставляем в теге php переменную с таким же именем


      1. seokirill
        27.08.2015 18:56

        И верно. А на телефоне выглядит так
        image


  1. vlreshet
    27.08.2015 17:49
    +7

    Я извиняюсь, но что это делает на хабре? VK имеет простое и отлично документированное API, отправка вложилась в 15 строк кода. Убрали бы его в черновики, пока карму не слили.


    1. volk0ff
      27.08.2015 17:56
      -5

      Отвечаю: когда гуглил, как подобное сделать, напоролся на кучу статей, подобно этой http://habrahabr.ru/sandbox/57993/ (которую гугл выдал первой при запросе «php vk api»)
      которые были, либо написаны с ошибкой, либо потеряли актуальность.
      В частности, из за статьи выше убил на задачу день, ибо делал все через iframe приложение, как там указано, через которое, работать не будет заведомо.

      PS: напишите эти 15 строк (а вообще по сути нужна одна — http запрос)


      1. zxcabs
        27.08.2015 18:33
        +4

        Да что вы такое говорите? Вот ссылка на офф доку и там сразу первым абзацем идет как сделать запрос в API.


        1. BupycNet
          27.08.2015 19:51

          Тут фишка статьи вообще не в запросе API. Я к примеру давно работал с VK API, но я не знал, что можно прикинуться Standalone и получить доступ к messages. Я конечно предполагал, что можно вытащить из приложухи и т.д. но не думал что можно так просто дать ссылку пользователю и он может в ответ кинуть токен.


          1. kimrgrey
            27.08.2015 23:28

            И получить за это вечный бан без предупреждения =)


            1. BupycNet
              28.08.2015 00:00

              Поговорю еще с администрацией по этому поводу. Бан вроде не сразу и только по жалобе. Но понятное дело что любой недовольный может пожаловаться.
              К слову не совсем понятно. а если у меня на самом деле приложение десктопное. получаю я к примеру этот токен окей. А что будет если кто то выцепит чужой ключ приложения и будет так получать токены. Из статьи это видно.

              К примеру получаем что
              1. Берем любое приложение в VK API
              2. Вытаскиваем из него айди приложения
              3. Получаем токены через это айди для других людей
              4. Начинаем рассылать спам
              5. Жалуемся.

              Как итог, так можно прикрыть любое десктопное/мобильное приложение с вк где используются сообщения? Более того, всегда же можно запросить их дополнительно, даже если ты их не используешь — их может использовать злоумышленник.

              Но тут назревает вопрос, если оно так легко получается с любым приложением. То почему нельзя легально это делать, и почему не считается, что любой владелец мобильного приложения или десктопного клиента может в любой момент взять все токены и начать спамить? Тоже самое же. Возмет базу прокси, пройдется по сохраненным токенам и будет спамить никаких проблем в этом нет.
              Так почему нельзя в белую получать к этому доступ, если ничто не мешает получить к этому доступ после раскрутки мобильного приложения? Пусть ВК вообще будет для таких сайтов показывать красные плашки на весь экран и кнопку «я согласен со всеми условиями на свой страх и риск»
              PS. Такую плашку надо во все standlone приложения тоже вешать — им тоже идет полный доступ по сути.


  1. MetaDone
    28.08.2015 09:07

    Имя пишем какое угодно — фигурировать оно нигде не будет

    Если использовать wall.post — то будет и лучше его все же оформить
    Просто личные сообщения по сути бесполезны.
    Да и сама статья при подробной документации еще и на родном языке не очень полезна


  1. NormIridium
    28.08.2015 16:27

    Уникальная статья, в плане положения вещей: столько минусов автору (не буду судить заслуженно или нет) и столько добавлений в закладки… Мистика хабрасообщества.