Как стать автором
Обновить

API Вконтакте: автопостинг записей в сообщество Вконтакте

Время на прочтение8 мин
Количество просмотров14K

Сегодня мы с вами рассмотрим скрипт для автопостинга записей с сайта в сообщество Вконтакте. Вы научитесь работать с 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_idclient_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 этапа:

  1. Получение ссылки

  2. Отправка объекта изображения по полученной, разрешённой ссылке

  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);

На этом всё!

Так же прокачивайте свои навыки на нашем канале - https://www.youtube.com/c/ProgTime

Теги:
Хабы:
+1
Комментарии5

Публикации

Изменить настройки темы

Истории

Работа

PHP программист
149 вакансий

Ближайшие события

PG Bootcamp 2024
Дата16 апреля
Время09:30 – 21:00
Место
МинскОнлайн
EvaConf 2024
Дата16 апреля
Время11:00 – 16:00
Место
МоскваОнлайн
Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн