API VK и PHP — Автопостинг сообщений в группах.

api vk PHPВсегда есть необходимость что-то автоматизировать, будь то простой бэкап сайта или отправка сообщения пользователю. Социальные сети не являются исключением. Речь в данной статье пойдёт о том, как автоматически размещать сообщения в определённые группы Вконтакте (ВК), при этом используя стандартные функции API ВК и PHP.

API VK и PHP — Автопостинг сообщений в группах.

В данной статье речь пойдёт о том как реализовать запуск скрипта на PHP, который будет использовать API VK, для написания сообщений в группы ВК. Так же расскажу как всё это дело можно запустить, протестировать и автоматизировать. Что нам понадобиться:

  • хостинг с возможностью использовать PHP;
  • планировщик заданий, в моём случае cron;
  • создать Standalone-приложение в ВК (нужен код подтверждения по СМС);
  • и токен, для использования API VK.

Так же вы можете использовать локальный хост, например развёрнутый при помощи OpenServer.

Создаём Standalone-приложение в ВК и получаем ID.

Для начала нам необходимо создать наше Standalone-приложение в ВК. Для этого переходим на страницу создания приложения. Вбиваем название приложения, выбираем платформу «Standalone-приложение» и нажимаем кнопку «Подключить приложение».API VK - Standalone-приложениеДальше ВК нас попросит подтвердить создание приложения и предложить выслать СМС. После подтверждения вас перекинут на страницу с информацией о приложении, нас интересует вкладка «Настройки», там мы можем получить «ID приложения». API VK - Standalone- приложение-ID

Всё, что необходимо от приложения, мы получили, не каких дополнительных настроек производить не нужно.

Получаем токен для использования API VK.

Теперь нам необходимо получить токен, он же «access_token». Токен — это набор различных цифр и латинских букв, которую мы будем передаете на сервер вместе с запросом.

Для того, что бы его получить, нам необходимо в браузере вбить следующую строку:

Где «client_id=5490057« необходимо указать ваш номер «ID приложения», который мы получали ранее. Так же необходимо указать значение «scope=groups,offline«, в данной переменной указывается какие права мы даём приложению, groups — доступ к группам, offline — срок действия токена, в нашем случае бессрочный.

После того как мы перейдём по ссылке выскочит такое окно:API VK - получаем токенНажимаем разрешить и попадаем на страницу где мы можем получить наш токен.API VK - получаем токенЕсли быть точнее нам необходима часть строки ссылки в браузере, которая нам вернулась. К примеру мы получаем ссылку вида:

Вот все символы, что идут между «…access_token=» и до «&expires_in…» и есть наш ключ доступа, он же токен. Наш токен будет таким:

Дальше мы его уже можем использовать в нашем скрипте.

Немного об API Вконтакте

Обращение к API Вконтакте происходит с помощью http-запросов, некой ссылкой, в которой мы передаём нужные нам значения. Ссылка выглядит примерно так:

Рассмотрим отдельно все его составляющие.

  • https:// — протокол соединения.
  • api.vk.com/method — адрес API-сервиса.
  • users.get — название метода API ВКонтакте. Методы представляют собой условные команды, которые соответствуют той или иной операции с базой данных — получение информации, запись или удаление. Например, users.get — метод для получения информации о пользователе, video.add — метод для добавления видеозаписи в свой список, likes.delete — метод для удаления отметки «Мне нравится».
    Все методы разделены на секции. Например, для работы с сообществами Вам нужны методы секции groups, для работы с фотографиями — photos, и так далее. Полный список методов по секциям доступен на этой странице.
  • ?user_id=210700286&v=5.52 — параметры запроса. После названия метода нужно передать его входные данные (если они есть) — как обычные GET-параметры в http-запросе. В нашем примере мы сообщаем серверу, что хотим получить данные о пользователе с id=210700286 и формат этих данных должен соответствовать версии API 5.52. Входные параметры всегда перечислены на странице с описанием метода.

К примеру, для того что-бы написать сообщение в группу нам понадобиться метод «board.createComment«, мы должны будем его передать в запросе, выглядеть ссылка будет так:

Что видим:

  • board.createComment — наш метод для создания комментария;
  • group_id=34985835 — id группы в которой находится топик;
  • topic_id=26771964 — топик в котором необходимо разместить сообщение;
  • message=Привет — сообщение которое мы будем постить;
  • from_group=0 — сообщение будет опубликовано от имени пользователя (по умолчанию «0», необязательный параметр);
  • v=5.69 — версия json;
  • access_token=523636639cyj67895327d385a0f96ert34234r2t4ffe7b58e1c2390d208d16418c8e73b2e0454128cfe1 — наш ключ доступа, он же токен

В результате если мы выполним запрос (попросту говоря вставим ссылку в браузер и нажмём «Enter»), то в ответ получим id сообщение которое было создано.API VK - JSON ответ

Ну и если мы перейдём в саму группу то там увидим наше сообщение. По факту мы будем генерировать такую ссылку по средствам PHP.

О том как узнать «group_id» и «topic_id»Узнаём group_id и topic_id

Тут всё просто, переходим в нашу группу, ищем интересующий нас топик, к примеру у меня будет «Добавь в друзья». В строке браузера будет ссылка вида:

Собственно «34985835» — это наш «group_id»,  а «26771964» — «topic_id»

Первая часть нашего скрипта на PHP для работы с API VK.

На самом деле я использовал два метода API VK, первый это добавления самого сообщения в группу «board.createComment«, второй это удаление предыдущего сообщения «board.deleteComment«. Нужно это для того чтобы админы группы не банили за спам,  да и скорее всего эти сообщения будут где-то далеко от последней страницы и смысла его оставлять нет.

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

Если вкратце, то проверяем нажата ли кнопка, после прогоняем массив с группами и их топиками, при этом соблюдаем условие,  что бы было не больше 3 сообщений в 10 секунд, в противном случае ВК попросит ввести капчу. Так же учитываем рандомность оставляемых сообщений, отправляем наш запрос, обрабатываем ответ и выводим в виде таблицы. Ну и в самом конце записываем в фай полученный ответ с ID нашего сообщения. Это нам понадобиться для удаления старых записей в дальнейшем.

Вроде всё описал в комментариях к скрипту, но всё же внесу ясность:

  • $group_id = — тут указываем наши ид и топики группы, можно вставлять прям из браузера, как я описал выше. В таком формате: «34985835_26771964». Я указал четыре, что бы видно было как отрабатывает задержка;
  • $mess = — указываем наши сообщения, они будут выбираться рандомно, можно оставить одно;
  • $query = file_get_contents(«https://api.vk.com/method/board.createComment?group_id=$v&message=».urlencode($mess[$rand_keys]).«&from_group=0&v=5.69&access_token=».$token); — тут генерируется наш запрос. В переменную «$v» попадает наши группы из переменной «$group_id». «.urlencode($mess[$rand_keys]).» — попадают наши рандомные сообщения из переменной «$mess».
  • $mfile = — Тут указываем путь к файлу, не забывайте менять на свой.

Копируем наш скрипт в файл с расширением «.php» желательно через Notepad++, и не забывайте менять кодировку на «UTF-8», иначе получите на выходе «кракозябры». Заливаем файл на хостинг, я закинул файл по такому пути «pechenek.net/wp-admin/vkmessenger_full.php». Так же для сохранения ответа и дальнейшего удаления сообщения нам необходимо будет записать информацию в файл, создаём и закидываем ещё один пустой файл, формата «.txt», мой путь будет «pechenek.net/wp-admin/mess.txt».

Дальше в браузере переходим по ссылке «pechenek.net/wp-admin/vkmessenger_full.php» и видим нашу кнопку, нажимаем, и получаем таблицу с ответами (скрипт будет выполняться секунд 10-15, из-за задержки в 10 секунд), выглядеть будет так:API Вконтакте выполняем скрипт

В ответ скрипт нам сформирует таблицу, в которой мы увидим, что за сообщение мы написали, в какой группе (ссылка будет активна сразу в группу) и ответ от АПИ Вконтакте (возвращает id сообщения которое мы написали). Так же скрипт должен записать в файл значения полученные в ответ, их я уже подготовил нужного формата под второй скрипт, что бы было удобно вставлять в запрос.API VK запись ответа

Если перейдём в группу, то увидим четыре новых сообщения (я указал одну и туже группу четыре раза):API VK сообщения в группеСобственно наш скрипт работает, теперь надо, что бы он удалял старые сообщения и добавлял новые.

Вторая часть нашего скрипта на PHP для работы с API VK.

Скорее эту часть скрипта надо вставлять перед первым скриптом, если мы будем это автоматизировать, надо что бы он вначале удалял старые записи и только потом создавал новые сообщения. Просто решил вначале показать как работает добавление сообщения и потом уже его удаление. В скрипте я их уже обьеденил.

Собственно второй вариант скрипта:

Добавил ещё одну кнопку под названием «Удаляем комментарии», для удобства тестирования.

Во втором варианте мы используем метот API Вконтакте «board.deleteComment«, он позволяет удалять комментарии по id, а его как раз нам возвращает первый скрипт. Получается, при нажатии кнопки, скрипт лезет в файл «mess.txt», достаёт от туда наши значения в цикл, подставляет эти значения в запрос, удаляет старые сообщения из группы, выходит из цикла и очищает файл.

Вот так будет выглядеть наш запрос для удаления:

$vv — это наши id сообщений из файла «mess.txt», которые записал предыдущий скрипт, он их будет по очереди подставлять и удальть из группы.

Теперь наглядно. От предыдущего скрипта у нас остались запись в файле «mess.txt», давайте нажмём кнопку «Удаляем комментарии». В ответ получим следующее:API Вконтакте удаляем старые сообщенияОн нам сообщает, что удалено такое-то сообщение и в ответ на запрос вернул «{«response»:1}». Это и говорит о том, что сообщение удалено. И если заглянуть в файл «mess.txt» он будет пуст.

Затем выполнится вторая часть скрипта, которая вновь разошлёт новые комментарий и запишет в файл новые id сообщений. И так можно запускать скрипт по кругу.

Как автоматизировать запуск скрипта.

Если вы хотите локально запускать скрипт, то данная статья вам поможет в этом:  OpenServer и CRON — Запускаем PHP скрипт

Так как я скрипт разворачивал на хостинге, то для его автоматизации буду использовать планировщик задания, он же cron. У меня панель «ISP manager», по этому пример буду показывать на нём, но в целом все панели похожи.

Заходим в панель и ищем что-то похожее на планировщик заданий, в нём нам необходимо создать наши задания которые он будет запускать. Использовать будем следующую команду:

Замените путь «https://pechenek.net/wp-admin/vkmessenger_full.php» на свой. Так же я добавил ещё одно значение «zna4=12345«, оно нужно для того, что бы обезопасить себя от несанкционированного запуска скрипта, в связи с этим и использовал метод «wget» (в нём можно передать значение скрипту).

Если исключить ввод дополнительного значения можно использовать такую команду:

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

Убрал всё что нам не нужно, и добавил ещё одно условие, в котором нам необходимо для выполнения скрипта получить значение «12345», если его не передать то при попытке выполнить скрипт получим такое сообщение: «Не верный код доступа».

Давайте немного подробнее рассмотрим создания задания на выполнение. К примеру мы хотим, что бы задание запускалось каждый час и десять минут. Создаём новое задание и вписываем следующие настройки:Настройка планировщикаВезде где «*»  будет выполняться всегда, «*/1»  означает, что задание будет выполняться каждый час, ну и 10 минут. В итоге будем выполнять скрипт каждый 1 час и 10 минут.

Возможные проблемы.

1. Первое с чем я столкнулся, это лимит сервера по времени выполнения скрипта (500 Internal Server Error). Если в скрипт запихнуть много групп, в которые надо постить сообщение, то он будет выполняться довольно долго, плюс у нас ещё таймаут в 10 секунд. Поборол созданием нескольких скриптов с разными группами, по 20 групп в один скрипт.

2. Так же была проблема с капчей. Пока не выяснил с чем связано, но раз в сутки выскакивает сообщение с просьбой ввести капчу, причём в разное время. И потом начинает на все сообщения просить ввести капчу. Побороть можно зайдя в группу и написав сообщение, после нам предложат ввести капчу, как введём всё опять работает.

Для этого случая добавил в отдельный скрипт оповещение на email. Скрипт такой:

Скрипт проверяет наш файл «mess.txt» на наличие текста «error». Если он его находит, а он найдёт если будет ошибка и запрос на капчу, то высылает на мыло сообщение. Собственно создаём ещё одно задание в планировщике, которое будет запускать данный скрипт и своевременно получаем оповещение, либо добавляем в конец к нашему скрипту.

3. Ошибки самого API Вконтакте. Все коды ошибок можете посмотреть в официальной документации. Там всё расписано.

4. Пути к файлам. Если скрипт запускается в отдельной папке, часто ругаеться на то, что не может найти файл «mess.txt». В этом случае нужно указать полный путь до файла.

5. Так же может возникнуть проблема для запуска скрипта через планировщик, зависит от того куда положите, может не хватать прав. Решил запуском другого скрипта, который будет доступен без авторизации и туда впихнул следующее:

Если использовать такой вариант запуска, то из скрипта надо будет убрать строку «$zna4 = $_GET[«zna4″];», т.к. он её и так получит.

Ну и на последок готовые файлы можете скачать тут: Скачать

На этом пожалуй всё, надеюсь статья была вам полезной. Не забывайте пользоваться кнопками «Поделиться в соц. сетях», так же подписываться на наш Канал и группы в ВК, Twitter, Facebook.

Всем удачи и море печенек!

Поделиться в соц. сетях:

Понравилась статья? Поблагодари автора, накорми печеньками! :)

CrazyKing

Печенько-кодер :Р

6 комментариев

  1. Добрый день, всё круто, спасибо! А как бы сделать постинг картинок? только не рандом, а поочередно на стену сообщества…

  2. Спасибо, отличная статья. Автору благодарность за профессиоанализм !

Опиши свой кейс здесь, если у тебя остались вопросы и мы обязательно ответим...