Создание динамической обложки для группы ВКонтакте на PHP

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

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

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

Загрузка обложки для группы в вк может показаться по началу немного сложной. На самом деле это не так.
Весь процесс выглядит вот так:
1. Используя метод photos.getOwnerCoverPhotoUploadServer отправляем id группы и координаты по которым нужно обрезать изображение. Пока без самого изображения. Чтобы не отправлять эти координаты, можно просто создать картинку размером 795х200. Что я и сделаю в этой статье. Этот метод вернёт ссылку по которой мы будем грузить нашу обложку.

2. Отправляем картинку в посте на полученную в первом пункте ссылку. Тут нет никаких замутов. В ответ мы получим параметры hash и photo.

3. Всё, наша картинка загружена. Просто пока что не стоит. Чтобы её поставить, нужно воспользоваться методом photos.saveOwnerCoverPhoto, сюда нужно передать просто полученные чуть ранее hash и photo.

4. Наслаждаемся картинкой на обложке группы.

5. ????

6. Profit!!!11

Нам потребуется создать файлы fon.php и vk.class.php, а так же скачать нужным нам шрифт в расширении .ttf, достать картинку 795х200 (пусть будет fon-orig.jpg) и всё это положить рядом со скриптами. Так же поставить на крон вызов fon.php в 00:00.
Мы для примера просто напишем на обложке какой сегодня день.
Код максимально простой для понимания. Без обработки ошибок или ещё чего-то. Имейте ввиду. Для серьёзного проекта его придётся изменять.

Содержимое fon.php:

<?php

	$month = date('n'); //Получаем порядковый номер текущего месяца
	$months = array('января', 'февраля', 'марта', 'апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'); //Создаём массив с месяцами на русском
	$current_date = 'Сегодня ' . date('d ' . $months[$month - 1] . ' Y') . ' года'; //Получаем в переменную текущую дату
	
	$image = imageCreateFromJpeg('fon-orig.jpg'); //получаем изображение, обложку из файла
	$white = imagecolorallocate($image, 255, 255, 255); //Добавляем в палитру белый цвет. Мой текст будет именно белым
	
	$font = __DIR__ . '/OpenSans-Regular.ttf'; //Шрифт
	$center = 398; //Середина изображения, т.к. полное изображение 795 пикселей. Ну тип 795 / 2 = 398 и 1 в остатке, но это не критично
	$ttf_box = imagettfbbox(20, 0, $font, $current_date); //ширина текста
	//В строчке выше
	//20 - это размер текста
	//0 - это угол наклона текста
	//Ну и последние параметры это шрифт и текст
	$position = $center - round(($ttf_box[2]-$ttf_box[0])/2); //Место, откуда нужно будет начать писать текст чтобы тот оказался посередине

	//Пишем тот самый текст
	imagefttext($image, 20, 0, $position, 27, $white, $font, $current_date);
	imagejpeg($image, 'fon.jpg', 100); //Сохраняем полученную картинку в fon.jpg в 100% качестве
	imagedestroy($image); //Освобождаем

	include_once ('vk.class.php'); //Подключаем наш vk.class.php
	
	//Сразу и создадим этот класс, который будет написан чуть позже
	//Сюда пишем ключ апи созданный для группы в вк
	$vk = new vk('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
	
	$url = $vk->PhotoUploadServer(ИД ГРУППЫ); //Вставляем ид группы в эту функцию
	$photo = $vk->UploadPhoto($url['upload_url'], 'fon.jpg'); //Вставляем изображение, которое нужно отправить
	$result = $vk->SavePhoto($photo['hash'], $photo['photo']); //Вставляем в обложку загруженную картинку
	echo "ok";

Содержимое vk.class.php:

<?php
//Задаём класс
class VK {
 
    public $token = ''; //Создаём публичную переменную для токена, который нужно отправлять каждый раз при использовании апи вк
 
    public function __construct($token) {
        $this->token = $token; //Забиваем в переменную токен при конструкте класса
    }
	
	public function PhotoUploadServer($group_id) {
        //Заполняем массив $data инфой, которую мы через api отправим до вк. О функции api "getOwnerCoverPhotoUploadServer" можно почитать в официальной документации вк
        $data = array( 
            'group_id'      => $group_id,
            'v'            => '5.71', //Версия API VK. Узнать нужную можно через официальную документацию вк
        );
        //Получаем ответ через функцию отправки до апи, которую создадим ниже
        $out = $this->request('https://api.vk.com/method/photos.getOwnerCoverPhotoUploadServer', $data);
        //И пусть функция вернёт ответ
        return $out['response'];
	}
	
	public function UploadPhoto($url, $file) {
        $data = array( 
            'photo'      => new CURLFile($file), //Отправляем нашу обложку на сервера вк
        );
        //Получаем ответ через функцию отправки до апи, которую создадим ниже
        $out = $this->request($url, $data);
        //И пусть функция вернёт ответ
        return $out;
	}
	
	public function SavePhoto($hash, $photo) {
        $data = array( 
			'hash'       => $hash,
            'photo'      => $photo,
			'v'            => '5.71', //Версия API VK. Узнать нужную можно через официальную документацию вк
        );
        //Получаем ответ через функцию отправки до апи, которую создадим ниже
        $out = $this->request('https://api.vk.com/method/photos.saveOwnerCoverPhoto', $data);
        //И пусть функция вернёт ответ
        return $out;
	}
     
    public function request($url, $data = array()) {
        $curl = curl_init(); //мутим курл-мурл в переменную. Для отправки предпочтительнее использовать курл, но можно и через file_get_contents если сервер не поддерживает
         
        $data['access_token'] = $this->token; //токен, который нужно отправить вместе с запросом тоже нужно добавить в дату
        curl_setopt($curl, CURLOPT_URL, $url); //Сюда забивается ссылка, куда отправить $data
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //Отправляем через POST
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //Сами данные отправляемые
         
        $out = json_decode(curl_exec($curl), true); //Получаем результат выполнения, который сразу расшифровываем из JSON'a в массив для удобства
         
        curl_close($curl); //Закрываем курл
         
        return $out; //Отправляем ответ в виде массива
    }
}

Выглядеть это будет примерно как в нашей группе в вк. Или на сплеш-арте в начале статьи.
Пс, вы можете заказать максимально сложные обложки для своей группы ВКонтакте у нас, через пункт «Работа» вверху сайта, или же через нашу группу ВКонтакте.