Multipost VK

Multipost для Vk

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Multipost VK
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Multipost для Vk
// @author       ʄɛռɨx
// @match        https://vk.com/(Ваша страничка)
// @grant        none
// @license      GPL
// ==/UserScript==

(function() {
    'use strict';

   let wide_column = document.querySelector('#wide_column');
   let page_blocks = document.querySelectorAll('#wide_column > div');

   let future_post_module = createFuturePost();
   wide_column.insertBefore(future_post_module,page_blocks[1]);

})();

/**
 *  Эмуляция нажатия на элемент
 *  @param {DOMElement} element - узел на странице
 *  @return {boolean} - признак прохода события
 */
    function simulateClick(element) {
       var event = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true
       });
       var canceled = !element.dispatchEvent(event);
       return canceled;
    }

/**
 *  Отправка отложенного сообщения на стене ВК
 *  @param {string} text - Текст для отправки на свою стену
 *  @param {number} date - timestamp в миллисекундах от 1970
 */
    function sendPost(text = 'test post from #userscript with #tampermonkey',date = new Date(2018,10,26,10,1).getTime() ){

		//let text = 'test with #tampermonkey #userscript',
		//	date = new Date(2018,10,26,10,1).getTime()/1000;

        let send_post = document.querySelector('#send_post');
        let post_field = document.querySelector('#post_field');
        let post_action_btn_layout = document.querySelectorAll('.post_action_btn_layout')[1];

        date /= 1000;

        post_field.focus();
        post_field.innerHTML = text;

        simulateClick(post_action_btn_layout);
        let postpone_date = document.querySelector('[id^=postpone_date]');
        postpone_date.value = date;

        send_post.click();
    }

/**
 * Создание вспомогательного блока для будущих новостей
 */
    function createFuturePost(){
  let page_block = document.createElement('div');
  page_block.className = 'page_block';

  page_block.innerHTML = `<div class="module clear future_post_module" id="profile_future_post_module">
  <a class="header_right_link fl_r" onclick="return false">вспомогательная ссылка</a>

<a href="#" onclick="return false" class="module_header">
  <div class="header_top clear_fix">
    <span class="header_label fl_l">Мои будущие новости</span>
    <span class="header_count fl_l">0</span>
  </div>
</a>

  <div id="page_future_post_module" class="page_future_post_module" style="padding: 13px 20px 20px;">
    <textarea id='future_post'  style="width:500px;min-height:200px"></textarea>
     <div class="add_future_post_button_wrap" >
      <button class="flat_button add_future_post_button" id="send_future_post" >Разместить</button>
    </div>
  </div>


</div>`;

  const future_post = page_block.getElementsByTagName('textarea')[0];
  future_post.addEventListener('keyup', e => {
    let header_count = page_block.getElementsByTagName('span')[1];
    let posts = e.target.value.split(/\n/gi);
    header_count.innerHTML = posts.length;
  } );

  const send_future_post = page_block.getElementsByTagName('button')[0];
  send_future_post.addEventListener('click', e => {
    const future_post = document.querySelector('#future_post');
    let posts = future_post.value.split(/\n/gi);
    let current = new Date();
    current.setHours(8);
    current.setMinutes(Math.round(Math.random()*30));

    let k = 1000 * 3600 * 24;
    posts.forEach( (post, i) => {
       let tmp = new Date(current.getTime() + (i+1)*k);
       sendPost(post, tmp.getTime());
    });

  });

  return page_block;
}