Сегодня мы с вами рассмотрим скрипт для автопостинга записей с сайта в сообщество Вконтакте. Вы научитесь работать с API вконтакте, создавать свои приложения, писать парсеры для отправки запросов в Вконтакте. Всю работу мы будем прописывать на языке PHP.
Для начала нам нужно создать приложение для настройки взаимодействия сайта через API.
Ссылка на страницу с конструктором для создания приложения — https://vk.com/apps?act=manage
Для связи Сайт -> API Вконтакте нам нужно создать Standalone-приложение
После создания приложения вам нужно зайти в настройки созданного приложения. И выписать из настроек данные: «id приложения«, «Защищённый ключ«, «Сервисный ключ доступа«.
После этого включаем наше приложение, включаем Open API и в появившихся полях указываем домен на котором будет расположен парсер.
Вот так должны выглядеть ваши настройки.
1. После создания приложения нам нужно получить специальный ключ для работы интеграции.Нам нужно получить секретный ключ и настроить права. Формируем URL подставляя данные своего приложения и вставляем его в браузер.
https://oauth.vk.com/authorize?client_id=ID_ПРИЛОЖЕНИЯ&display=page
&redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos
&response_type=code
2. Запрашиваем access_token
. Формируем новый URL, подставив client_id
, client_secret
и полученный выше код. В ответе получаем access_token
.
https://oauth.vk.com/access_token?client_id=ID_ПРИЛОЖЕНИЯ
&client_secret=ЗАЩИЩЕННЫЙ_КЛЮЧ&redirect_uri=https://api.vk.com/blank.html
&code=СЕКРЕТНЫЙ_КОД
Теперь переходим к написанию скрипта для нашего парсера. В качестве основных ключей для наших запросов к Вконтакте, мы будем использовать ранее полученные данные.
Автопостинг простых текстовых записей в сообщество
Скрипт я буду писать через PHP класс и назову его BotsTime_AutopostingVk.
class BotsTime_AutopostingVk {
/* токен для запросов */
public $token = "97a1b7bff17bd61309c109ac7e1231dasdfsdfe2dac84ac0254961fe8a5121e553b95eca754e8e889f7dbb4fe";
/* id приложения */
public $owner_id = -209887634;
public $versionVk = "5.131";
/* ДЛЯ ОТПРАВКИ ЗАПРОСОВ */
public function sendQueryVk($method, $dataQuery) {
$dataQuery["access_token"] = $this->token;
$dataQuery["from_group"] = "1";
$dataQuery["owner_id"] = $this->owner_id
$dataQuery["v"] = $this->versionVk;
$ch = curl_init("https://api.vk.com/method/{$method}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
if($html === false){
echo "Ошибка отправки запроса: " . curl_error($curl);
return false;
}
else{
return json_decode($html, true);
}
}
}
Теперь давайте сделаем запрос. Массив $arrQuery передаётся в качестве второго аргумента для метода sendQueryVk. Данный метод делает API запрос, который передаёт данные на сервера Вконтакте, после чего добавляет в указанное сообщество новую запись с текстом «Тестовая запись».
$vkBot = new BotsTime_AutopostingVk();
$arrQuery = [
"message" => "Тестовая запись",
];
$dataResult = $vkBot->sendQueryVk("wall.post", $arrQuery);
Автопостинг записей с изображениями в группу Вконтакте
Для автопостинга нам придётся полностью перебрать ранее изученное решение. Мы создадим дополнительные методы и перепишем уже созданные. Новое решение вы сможете использовать как для простых постов, так и постов с изображениями.
Класс мы оставляем — BotsTime_AutopostingVk. В новой версии мы только переписываем методы.
Отправка POST запросов в API Вконтакте
/*
method - название метода (информация в документации Вконтакте)
dataQuery - массив с параметрами запроса
*/
public function sendQueryVk_POST($method, $dataQuery = array()) {
/* добавляем токен в массив запроса */
$dataQuery["access_token"] = $this->token;
/* добавляем версию API вконтакте */
$dataQuery["v"] = $this->versionVk;
$ch = curl_init("https://api.vk.com/method/{$method}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
if($html === false){
echo "Ошибка отправки запроса: " . curl_error($curl);
return false;
}
else{
return json_decode($html, true);
}
}
Отправка GET запросов в API Вконтакте
public function sendQueryVk_GET($method, $dataQuery = array()) {
$dataQuery["access_token"] = $this->token;
$dataQuery["v"] = $this->versionVk;
$ch = curl_init("https://api.vk.com/method/{$method}?" . http_build_query($dataQuery));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
Методы для отправки информации в сообщество
/* ДЛЯ ПОСТИНГА ЗАПИСИ */
public function send_wall_post($dataQuery) {
$dataQuery["from_group"] = "1";
$dataQuery["owner_id"] = $this->owner_id;
return $this->sendQueryVk_POST("wall.post", $dataQuery);
}
/* ДЛЯ ПОЛУЧЕНИЯ URL ДЛЯ ЗАГРУЗКИ */
public function send_photos_getWallUploadServer($dataQuery) {
$dataQuery["from_group"] = "1";
$dataQuery["owner_id"] = $this->owner_id;
return $this->sendQueryVk_POST("photos.getWallUploadServer", $dataQuery);
}
/* ДЛЯ СОХРАНЕНИЯ ИЗОБРАЖЕНИЯ НА СЕРВЕРЕ VK */
public function send_photos_saveWallPhoto($dataQuery) {
return $this->sendQueryVk_GET("photos.saveWallPhoto", $dataQuery);
}
Автопостинг с добавлением изображения в запись сообщества Вконтакте
Добавление изображений в посты для сообществ проходит в 3 этапа:
- Получение ссылки
- Отправка объекта изображения по полученной, разрешённой ссылке
- Запрос на получения данных добавленного изображения
/*
urlFile - ссылка на файл изображения на хостинге
*/
public function sendPhotoInVk($urlFile) {
/* отправка запроса для получения ссылки на загрузку файла */
$arrQuery = [
"group_id" => $this->group_id,
];
$dataUploadParams = $this->send_photos_getWallUploadServer($arrQuery);
$uploadUrl = $dataUploadParams["response"]["upload_url"];
/* -------------------- */
/* отправка изображения на сервер */
$curl_photo = curl_file_create($urlFile);
$arrQuery = [
"photo" => $curl_photo
];
$ch = curl_init($uploadUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$dataUploadParams = curl_exec($ch);
curl_close($ch);
$dataImage = json_decode($dataUploadParams, true);
/* -------------------- */
/* получение информации о картинге с сервера */
$dataImage["group_id"] = $this->group_id;
$dataSaveParams = $this->send_photos_saveWallPhoto($dataImage);
$dataImage = json_decode($dataSaveParams, true);
$codeQueryImage = "photo{$dataImage['response'][0]['owner_id']}_{$dataImage['response'][0]['id']}";
return $codeQueryImage;
}
Полная версия класса для автопостинга записей Вконтакте
class BotsTime_AutopostingVk {
public $token = "97a1b7bff17bd61309c109a4ac02961fe8a5121e553b95eca754e8e889f7dbb4fe";
public $owner_id = -209546094;
public $group_id = 209546094;
public $idApp = 8054058;
public $versionVk = "5.131";
/* ДЛЯ ОТПРАВКИ POST ЗАПРОСОВ */
/*
method - название метода (информация в документации Вконтакте)
dataQuery - массив с параметрами запроса
*/
public function sendQueryVk_POST($method, $dataQuery = array()) {
/* добавляем токен в массив запроса */
$dataQuery["access_token"] = $this->token;
/* добавляем версию API вконтакте */
$dataQuery["v"] = $this->versionVk;
$ch = curl_init("https://api.vk.com/method/{$method}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
if($html === false){
echo "Ошибка отправки запроса: " . curl_error($curl);
return false;
}
else{
return json_decode($html, true);
}
}
/* -------------------- */
/* ДЛЯ ОТПРАВКИ GET ЗАПРОСОВ */
public function sendQueryVk_GET($method, $dataQuery = array()) {
$dataQuery["access_token"] = $this->token;
$dataQuery["v"] = $this->versionVk;
$ch = curl_init("https://api.vk.com/method/{$method}?" . http_build_query($dataQuery));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
/* -------------------- */
/* ДЛЯ ПОСТИНГА ЗАПИСИ */
public function send_wall_post($dataQuery) {
$dataQuery["from_group"] = "1";
$dataQuery["owner_id"] = $this->owner_id;
return $this->sendQueryVk_POST("wall.post", $dataQuery);
}
/* -------------------- */
/* ДЛЯ ПОЛУЧЕНИЯ URL ДЛЯ ЗАГРУЗКИ */
public function send_photos_getWallUploadServer($dataQuery) {
$dataQuery["from_group"] = "1";
$dataQuery["owner_id"] = $this->owner_id;
return $this->sendQueryVk_POST("photos.getWallUploadServer", $dataQuery);
}
/* -------------------- */
/* ДЛЯ СОХРАНЕНИЯ ИЗОБРАЖЕНИЯ НА СЕРВЕРЕ VK */
public function send_photos_saveWallPhoto($dataQuery) {
return $this->sendQueryVk_GET("photos.saveWallPhoto", $dataQuery);
}
/* -------------------- */
/* ПОЛУЧЕНИЕ КОДА ДЛЯ ПОСТИНГА ИЗОБРАЖЕНИЙ */
/*
urlFile - ссылка на файл изображения на хостинге
*/
public function sendPhotoInVk($urlFile) {
/* отправка запроса для получения ссылки на загрузку файла */
$arrQuery = [
"group_id" => $this->group_id,
];
$dataUploadParams = $this->send_photos_getWallUploadServer($arrQuery);
$uploadUrl = $dataUploadParams["response"]["upload_url"];
/* -------------------- */
/* отправка изображения на сервер */
$curl_photo = curl_file_create($urlFile);
$arrQuery = [
"photo" => $curl_photo
];
$ch = curl_init($uploadUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$dataUploadParams = curl_exec($ch);
curl_close($ch);
$dataImage = json_decode($dataUploadParams, true);
/* -------------------- */
/* получение информации о картинге с сервера */
$dataImage["group_id"] = $this->group_id;
$dataSaveParams = $this->send_photos_saveWallPhoto($dataImage);
$dataImage = json_decode($dataSaveParams, true);
$codeQueryImage = "photo{$dataImage['response'][0]['owner_id']}_{$dataImage['response'][0]['id']}";
return $codeQueryImage;
}
}
$vkBot = new BotsTime_AutopostingVk();
/* изображение для записи */
$urlFile = $_SERVER["DOCUMENT_ROOT"] . "/upload/resize_cache/iblock/a4b/1000_750_1a3e675aea8ae1409484d226085c41199/estvnvtyrj2z0h0kq5wghwk5yfugy1kq.jpg";
$textPost = "Описание для записи \n";
/* получение данных для загрузки изображения для поста */
$codeQueryImage = $vkBot->sendPhotoInVk($urlFile);
/* добавление записи */
$publish_date = time() + 3600;
$arrQuery = [
"message" => $textPost,
"publish_date" => $publish_date,
"attachments" => $codeQueryImage
];
$vkBot->send_wall_post($arrQuery);