Сегодня мы с вами рассмотрим скрипт для автопостинга записей с сайта в сообщество Вконтакте. Вы научитесь работать с 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";
/* получение данных для загрузки изображения для поста */
urlFile);
/* добавление записи */
arrQuery);

На этом всё!

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

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


  1. Akuma
    26.03.2022 14:59

    Вы забыли про каптчу и ее решение


    1. tempick
      28.03.2022 19:26

      Если не надо постить в сотню (условно) групп одновременно, то каптча (точнее, её решение) и не потребуется. К примеру, есть рабочее решение (замороженный проект, но есть-пить не просит, работает и ладно) - сайт vtksale.ru и несколько групп в вк (штук 7 примерно), куда раз в час постятся объявления с сайта. Например, Работа Воткинск | Все объявления (vk.com) Учитывая ограничение на 50 постов в день в группе - потребность в миллион запросов потребуется с малой вероятностью.
      А даже если и потребуется, то подключить сервис-антикапчу несложно. В таком случае просто вк присылает в ответе ссылку на изображен е с капчей, используем апи условной рукапчи, разгадываем и отправляем к vk api решение, используя отдельный метод. Это всё есть в документации апи вк (кроме подключения сервиса-антикапчи) и проблем не доставляет обычно.
      Ну или для массового постинга можно просто использовать много аккаунтов. Ибо лимиты привязаны именно к токену (т.е. к конкретному пользователю, а не к ip клиента или чему либо ещё)
      Кстати, ещё лайфхак - для быстрых тестов можно вообще не создавать приложение, а использовать, например, Получить access token (vkhost.github.io) и получить токен за пару секунд


      1. Akuma
        28.03.2022 22:49

        Лимиты привязаны хрен пойми к чему у них. Как и сам принцип появления каптчи.

        Я это знаю не понаслышке. Но при этом в целом у них вполне себе работающее API (иногда правда возвращает серверную ошибку "просто так", ну да ладно).

        А если сравнивать с ФБ, то вообще райские условия у ВК.


  1. dimsog
    29.03.2022 10:30

    У vk есть же готовая библиотека для этого.