Донецкий техникум промышленной автоматики

WordPress: автопостінг для ВКонтакте

  1. Навіщо свій плагін?
  2. Що потрібно для АВТОП?
  3. зміст АВТОП
  4. універсальний код
  5. Плагін під WordPress
  6. Інші соціальні мережі

Існує чимало різних плагінів для WordPress, які можуть забезпечити автоматизоване додавання записів сайту в соціальну мережу Вконтакте. Якщо ви не знайшли собі підходящого, то можете зробити свій! Ця стаття допоможе.

Навіщо свій плагін?

Багато існуючі плагіни досить складні. Причина - спроба їх авторів зробити універсальну річ. У підсумку, деяких користувачів такі «комбайни» влаштовують, а кому-то все одно не вистачає функцій. Однак, в будь-якому випадку, плагіни набувають надто багато коду, який цілком може глючити.

Свій плагін можна зробити дуже простим, щоб весь код в ньому був, як на долоні. Він буде робити тільки те, що необхідно саме вам, і в тому вигляді, якому потрібно. Без будь-яких компромісів !!!

Соціальна мережа Вконтакте має зручний API і чудову по ньому. Нерозумно цим не користуватися. У статті розглянуто досить простий приклад плагіна під WordPress, а також зовсім простацькі універсальна заготовка. Змініть код трохи під себе і користуйтеся на здоров'я.

Що потрібно для АВТОП?

Потрібно знати ID-номер «стіни» ВКонтакте, на яку ви хочете автоматично додавати записи. Без різниці, який це буде тип стіни - ваша персональна, якого співтовариства.

Для персональної номер дивимося в. Тут є «Адреса Вашої сторінки» і «Номер сторінки». Це якраз те, що нам потрібно:

Для спільноти номер дивимося в самому співтоваристві. Зайдіть в нього. Якщо у вас є відповідні права, то тут можна побачити посилання «Управління співтовариством», а ще «Статистика спільноти». У складі останньої посилання можна побачити цифри, що не заховані, навіть якщо спільноті призначений красивий адресу. Цифри - це необхідний нам ID-номер спільноти. приклад:

http://vk.com/stats?gid=36440041

Пости на стіну в ВКонтакте будуть публікуватися з використанням API і спеціального додатку ВКонтакте. Одного програми досить, щоб відправляти пости з декількох сайтів. Створити додаток можна. В процесі цього задайте назву, приклад, «АВТОП з сайтів» і виберіть тип «Standalone-додаток». В результаті, додаток буде створено і ви отримаєте його ID-номер. Приклад налаштувань програми:

Щоб API-запити від вашого сайту (плагіна) до цього додатка оброблялися вам обов'язково в цих запитах треба буде вказувати так званий access_token. Це спеціальний секретний ключ - рядок з 85 символів. Його досить отримати для свого застосування один раз. на офіційному сайті.

Отримати access_token можна, відкривши в веб-браузері посилання:

https://oauth.vk.com/authorize?client_id=[id_приложения]&scope=offline,group,photos,wall&display=page&response_type=token&redirect_uri=https://oauth.vk.com/blank.html

Тут, замість [id_пріложенія] вказується ID-номер додатка.

зміст АВТОП

Що нам взагалі потрібно? Ми хочемо, щоб при розміщенні статті на сайті автоматично створювався пост з анонсом на стіні ВКонтакте. Причому нормального вигляду, на зразок тих, що створюються вручну.

Для кожного такого анонса оптимально передавати:

  1. Невеликий текст, наприклад, заголовок і / або вступну частину статті.
  2. Картинку статті, бажано НЕ мініатюру.
  3. Посилання на статтю на сайті.

Приклад АВТОП в співтоваристві ВКонтакте без картинок:

Тут передавався текст - заголовок і анонс, розділені просто подвійним перекладом рядка. Інших способів якось виділити заголовок я не знаю, ніяке форматування тексту в соціальній мережі використовувати не можна. Напевно, зовсім ідеально було б, якщо не просто підсумовувати заголовок і анонс, а готувати для цих справ спеціальні цільні шматки тексту.

При наведенні курсора миші на посилання в пості можна бачити картинку і опис статті, взяті з сайту автоматично безпосередньо в момент перегляду. Див. статтю по темі.

На наступному прикладі АВТОП все те ж саме, тільки додатково передавалася картинка:

Картинка велика. Я віддаю перевагу для цих цілей використовувати картинки з шириною, порядку, 800-1200 пікс. Думаю, цього достатньо, занадто захоплюватися теж не варто.

Навіщо саме велика картинка? На мій погляд, так пости виглядають більш природно. Зазвичай, створюючи вручну пост на стіні, користувачі прикріплюють фотку або іншу досить велику картинку. Мініатюри при ручному розміщенні ніхто не використовує.

універсальний код

Почну з зворотного, - спочатку зовсім простий приклад, так простіше показати основу, плагін для WordPress нижче.

Отже, задаємо вихідні дані:

// ID-номер стіни юзера або спільноти, куди треба постити. $ Vk_user = $ vk_group = 12345678; // Секретний ключ, який був отриманий для додатка VK. $ Vk_token = '12345qwerty ...'; // Інформація для поста: анонс, зображення, посилання. $ Post_text = 'Тут заголовок і може якийсь ще текст'; $ Post_image = 'https://d1mon.com/att/img.jpg'; $ Post_url = 'https://d1mon.com/n/1069'; // Перетворимо посилання на зображення, потрібен вид типу /var/www/d1mon.com/att/img.jpg $ post_image = $ _SERVER [ 'DOCUMENT_ROOT']. Substr ($ post_image, strlen ($ _ SERVER [ 'SERVER_NAME']) +7);

Далі два варіанти кодів, призначені для відправки постів на стіну користувача і співтовариства ВКонтакте. Відрізняються вони незначно, але відрізняються! Використовуйте якийсь один.

Код для відправки поста на стіну користувача:

// Дізнаємося сервер VK, куди будемо заливати зображення. $ Ph_ser = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.getWallUploadServer?v=5.37&access_token='.$vk_token)); // Заливаємо зображення на сервер. $ Ph_upl = json_decode (curlPost ($ ph_ser-> response-> upload_url, $ post_image)); // Зберігаємо зображення, як фото до посту на стіні. $ Ph_sav = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.saveWallPhoto?user_id='.$vk_user.'&photo='.$ph_upl-> photo.' & Server = '. $ Ph_upl- > server. '& hash ='. $ ph_upl-> hash. '& v = 5.37 & access_token ='. $ vk_token)); // Дізнаємося ID залитого зображення. $ Ph_id = $ ph_sav-> response [0] -> id; // Формуємо запит для відправки поста. $ St_zap = 'https://api.vk.com/method/wall.post?owner_id='.$vk_user.'&friends_only=0&message='.urlencode($post_text).'&attachments='; // Якщо зображення було завантажене, то додаємо його. if (mb_strlen ($ ph_id)) {$ st_zap. = 'photo'. $ ph_sav-> response [0] -> owner_id .'_ '. $ ph_id.', '; } // Додаємо URL і завершуємо формувати запит. $ St_zap. = $ Post_url. '& V = 5.37 & access_token ='. $ Vk_token; // Відправляємо сформований запит. $ St_res = json_decode (file_get_contents (str_replace ( '', '% 20', $ st_zap))); // Дізнаємося ID опублікованого ВКонтакте поста. $ St_id = $ st_res-> response-> post_id;

Варіант коду для відправки поста на стіну спільноти:

// Дізнаємося сервер VK, куди будемо заливати зображення. $ Ph_ser = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.getWallUploadServer?group_id='.$vk_group.'&v=5.37&access_token='.$vk_token)); // Заливаємо зображення на сервер. $ Ph_upl = json_decode (curlPost ($ ph_ser-> response-> upload_url, $ post_image)); // Зберігаємо зображення, як фото до посту на стіні. $ Ph_sav = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.saveWallPhoto?group_id='.$vk_group.'&photo='.$ph_upl-> photo.' & Server = '. $ Ph_upl- > server. '& hash ='. $ ph_upl-> hash. '& v = 5.37 & access_token ='. $ vk_token)); // Дізнаємося ID залитого зображення. $ Ph_id = $ ph_sav-> response [0] -> id; // Формуємо запит для відправки поста. $ St_zap = 'https://api.vk.com/method/wall.post?owner_id=-'.$vk_group.'&friends_only=0&from_group=1&message='.urlencode($post_text).'&attachments='; // Якщо зображення було завантажене, то додаємо його. if (mb_strlen ($ ph_id)) {$ st_zap. = 'photo'. $ ph_sav-> response [0] -> owner_id .'_ '. $ ph_id.', '; } // Додаємо URL і завершуємо формувати запит. $ St_zap. = $ Post_url. '& V = 5.37 & access_token ='. $ Vk_token; // Відправляємо сформований запит. $ St_res = json_decode (file_get_contents (str_replace ( '', '% 20', $ st_zap))); // Дізнаємося ID опублікованого ВКонтакте поста. $ St_id = $ st_res-> response-> post_id;

І насамкінець - загальний шматок - допоміжна функція:

// Функція cURL. function d1_vk_curlPost ($ url, $ img) {if (! isset ($ url) ||! isset ($ img)) {return false; } $ Ch = curl_init (); curl_setopt ($ ch, CURLOPT_USERAGENT, $ _SERVER [ 'HTTP_USER_AGENT']); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ ch, CURLOPT_TIMEOUT, 10); curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_POST, true); curl_setopt ($ ch, CURLOPT_POSTFIELDS, [ 'file1' => new CurlFile ($ img)]); $ Response = curl_exec ($ ch); curl_close ($ ch); return $ response; }

У прикладі дуже важливо, що завантажені картинки прикріплюються до посту на стіні, а не до фотоальбому. Чисто технічно різниця не дуже важлива, - фото з фотоальбому теж можна використовувати в АВТОП. Однак є одне АЛЕ. Справа в тому, що додавання фото в фотоальбом - це вже само по собі подія, яке буде показано в стрічці новин передплатникам. У нашому ж випадку, такого додаткового події не виникає, передплатники бачать в стрічці виключно новий пост із вставленим фото.

Плагін під WordPress

Тут все теж саме, тільки є додаткові фішки, щоб це був уже закінчений робочий інструмент під WordPress. Для використання, тут просто треба вписати свої параметри. З настройками через адмін-панель движка я не став заморочуватися, щоб не ускладнювати. Та й для того плагіна, який пишеться саме під себе і використовується на одному сайті так зручніше.

Зверніть увагу, що цей варіант коду реалізує відправку постів на стіну користувача, а не спільноти.

<? Php / ** * Plugin Name: d1mon_vk_autopost * Description: Автопостінг на стіну користувача в VK. * / // Запуск автопостінга при публікації нового WP-поста. add_action ( 'publish_post', 'd1mon_vk_publish_new'); // Запуск автопостінга по команді. add_action ( 'wp_ajax_d1mon_vk', 'd1mon_vk_ajax'); // Додавання діалогу плагіна в редагування WP-поста. add_action ( 'admin_init', 'd1mon_vk_box', 1); // Функція автопостінга. function d1mon_vk ($ wp_post_id) {// ID-номер стіни юзера, куди треба постити. $ Vk_user = 12345678; // Секретний ключ, який був отриманий для додатка VK. $ Vk_token = '12345qwerty ...'; // Отримуємо інформацію по WP-посту. $ Wp_post_url = get_permalink ($ wp_post_id); $ Wp_post_arr = get_post ($ wp_post_id); $ Wp_post_title = $ wp_post_arr-> post_title; $ Wp_post_content_arr = get_extended ($ wp_post_arr-> post_content); $ Wp_post_desc = strip_tags ($ wp_post_content_arr [ 'main']); // Формуємо текст VK-поста. $ Vk_text = $ wp_post_title. ' '. $ Wp_post_desc; // Якщо у WP-поста є мініатюра. if (($ wp_post_image = get_post_thumbnail_id ($ wp_post_id))> 0) {// Намагаємося отримати масив для цієї ж картинки в великому розмірі. if (is_array ($ wp_post_image = wp_get_attachment_image_src ($ wp_post_image, 'large'))) {// Отримали, фоміруем URL для цієї картинки до потрібного вигляду. $ Wp_post_image = $ _SERVER [ 'DOCUMENT_ROOT']. Substr ($ wp_post_image [0], strlen ($ _ SERVER [ 'SERVER_NAME']) + 7); } Else {unset ($ wp_post_image); }} // Інакше пробуємо взяти картинку з аттачей WP-поста. elseif ($ wp_post_image = get_attached_media ( 'image', $ wp_post_id)) {// Скорочуємо масив, беремо лише першу картинку. $ Wp_post_image = array_shift ($ wp_post_image); if (mb_strlen ($ wp_post_image = $ wp_post_image-> guid)) {// Взяли, фоміруем URL для цієї картинки до потрібного вигляду. $ Wp_post_image = $ _SERVER [ 'DOCUMENT_ROOT']. Substr ($ wp_post_image, strlen ($ _ SERVER [ 'SERVER_NAME']) + 7); } Else {unset ($ wp_post_image); }} Else {unset ($ wp_post_image); } // Якщо зображення знайшлося. if (mb_strlen ($ wp_post_image)) {// Дізнаємося VK-сервер, куди будемо заливати зображення. $ Ph_ser = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.getWallUploadServer?v=5.37&access_token='.$vk_token)); // Заливаємо зображення на VK-сервер. $ Ph_upl = json_decode (curlPost ($ ph_ser-> response-> upload_url, $ wp_post_image)); // Зберігаємо зображення, як фото до VK-посту на стіні. $ Ph_sav = json_decode (file_get_contents ( 'https://api.vk.com/method/photos.saveWallPhoto?user_id='.$vk_user.'&photo='.$ph_upl-> photo.' & Server = '. $ Ph_upl- > server. '& hash ='. $ ph_upl-> hash. '& v = 5.37 & access_token ='. $ vk_token)); // Дізнаємося id залитого зображення. $ Ph_id = $ ph_sav-> response [0] -> id; } // Починаємо формувати запит для відправки VK-поста. $ St_zap = "https://api.vk.com/method/wall.post?owner_id=".$vk_user."&friends_only=0&message=".urlencode($vk_text)."&attachments="; // Якщо зображення було завантаженості, то додаємо його в запит. if (mb_strlen ($ ph_id)) {$ st_zap. = 'photo'. $ ph_sav-> response [0] -> owner_id .'_ '. $ ph_id.', '; } // Додаємо URL на WP-пост. $ St_zap. = $ Wp_post_url; // Додатковий постинг в інші соціальні мережі. // $ st_zap. = '& Services = twitter, facebook'; // Завершуємо формувати запит. $ St_zap. = '& V = 5.37 & access_token ='. $ Vk_token; // Відправляємо сформований запит в VK. $ St_res = json_decode (file_get_contents (str_replace ( '', '% 20', $ st_zap))); // Дізнаємося ID опублікованого VK-поста. $ St_id = $ st_res-> response-> post_id; // Якщо все ок. if (mb_strlen ($ st_id)> 1) {// Добавяем в WP посилання на VK-пост. add_post_meta ($ wp_post_id, 'd1mon_vk_link', $ vk_user .'_ '. $ st_id); // Добавяем в WP посилання на зображення VK-поста. add_post_meta ($ wp_post_id, 'd1mon_vk_photo', $ ph_id); }} // Функція запуску автопостінга при публікації в WP нового поста. function d1mon_vk_publish_new ($ wp_post_id) {// Якщо WP-пост опублікований. if (($ _ POST [ 'post_status'] == 'publish') && ($ _POST [ 'original_post_status']! = 'publish')) {// Намагаємося отримати з WP посилання на VK-пост. $ Test = get_post_meta ($ wp_post_id, 'd1mon_vk_link'); // Якщо посилання не знайдена. if (count ($ test) == 0) {// Отримуємо Unix-мітку часу WP-поста з поправкою на тимчасову зону GTM. $ Wp_post_time = get_post_time ( 'U', true, $ wp_post_id); $ Wp_post_time_plus = $ wp_post_time + 60 * 60 * 24 * 2; // дві доби. // Якщо WP-пост новий. WP-пости, публікуються заднім числом, ігноруємо. if ($ wp_post_time_plus> current_time ( 'timestamp')) {// Запуск автопостінга. d1mon_vk ($ wp_post_id); }}}} // Функція запуску автопостінга по команді. function d1mon_vk_ajax () {// Беремо ID редагованого WP-поста. $ Wp_post_id = $ _REQUEST [ 'post_id']; // Якщо WP-пост опублікований. if (get_post_status ($ wp_post_id) == 'publish') {// Запуск автопостінга. d1mon_vk ($ wp_post_id); } Header ( "Location: http: //". $ _ SERVER [ 'HTTP_HOST']. "/Wp-admin/post.php?post=". $ Wp_post_id. "& Action = edit"); exit; } // Функції діалогу плагіна в редагування WP-поста. function d1mon_vk_box () {add_meta_box ( 'd1mon_vk_box', 'd1mon_vk_autopost', 'd1mon_vk_box_inner', 'post', 'side'); } Function d1mon_vk_box_inner ($ post) {$ d1mon_vk_box_link = get_post_meta ($ post-> ID, 'd1mon_vk_link'); $ D1mon_vk_box_image = get_post_meta ($ post-> ID, 'd1mon_vk_photo'); if (count ($ d1mon_vk_box_link)> 0) {echo '<p> Існуючі VK-записи <strong> ('. count ($ d1mon_vk_box_link). '): </ strong> </ p>'; $ I = 0; while ($ i <count ($ d1mon_vk_box_link)) {echo '<p> <a target="_blank" href="//vk.com/wall'.$d1mon_vk_box_link[$i].'"> Пост </ a > '; if (mb_strlen ($ d1mon_vk_box_image [$ i]> 1)) {echo '(<a target = "_ blank" href = "// vk.com/photo'.get_option('d1mon_vk_opt_gid').'_'.$d1mon_vk_box_image [$ i]. ' "> зображення </a>)'; } Echo '</ p>'; $ I ++; }} Else {echo '<p> Постів в VK не було! </ P>'; } $ Link = admin_url ( 'admin-ajax.php? Action = d1mon_vk & post_id ='. $ Post-> ID); if (get_post_status ($ post-> ID) == 'publish') {echo '<a href="'.$link.'" id="d1monvk" class="button button-primary button-large"> Запостити в VK! </a> '; }} // Функція cURL (допоміжна) function curlPost ($ url, $ img) {if (! Isset ($ url) ||! Isset ($ img)) {return false; } $ Ch = curl_init (); curl_setopt ($ ch, CURLOPT_USERAGENT, $ _SERVER [ 'HTTP_USER_AGENT']); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ ch, CURLOPT_TIMEOUT, 10); curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_POST, true); curl_setopt ($ ch, CURLOPT_POSTFIELDS, [ 'file1' => new CurlFile ($ img)]); $ Response = curl_exec ($ ch); curl_close ($ ch); return $ response; }?>

Інші соціальні мережі

В останньому прикладі, на етапі формування запиту, є один цікавий закоментірованний параметр: «Додатковий постинг в інші соціальні мережі». При необхідності ви можете його включити.

Функція актуальна для Facebook і Twitter. Я коли дізнався, що таке можна заодно робити, то дуже зрадів. Аякже. Адже цікава ж перспектива - робиш все один невеликий плагін і відправляєш АВТОП відразу в кілька соціальних мереж.

Однак, радість була передчасною. ВКонтакте не побажав цього робити нормально. Ні, АВТОП він, звичайно, відправляє. Але при цьому він ставить в них свої посилання! Тобто, користувачі інших соціальних мереж відправляться за подробицями саме вконтакт. І не важливо, що ви спочатку для поста передавали посилання на свій сайт. Загалом, тупо! Не розумію, кому тоді ця функція взагалі потрібна.

Якщо ви раптом вирішите використовувати у себе цю додаткову можливість, то майте на увазі, що для її роботи потрібно зайти в свої ВКонтакте і активувати там зв'язку з цими соціальними мережами. Зробити це нескладно:

Навіщо свій плагін?
Що потрібно для АВТОП?
Навіщо свій плагін?
Що потрібно для АВТОП?
Com/stats?
Com/authorize?
Навіщо саме велика картинка?
GetWallUploadServer?
SaveWallPhoto?
Post?