NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Web API Messages helper // @namespace http://vk.com/ // @version 3.1 // @description Показывает информацию о сообщении при нажатии на него // @author Flyink13 // @match https://*.vk.com/* // @copyright 2018, flyink13 (https://openuserjs.org/users/flyink13) // @downloadURL https://openuserjs.org/install/flyink13/Web_API_Messages_helper.user.js // @updateURL https://openuserjs.org/meta/flyink13/Web_API_Messages_helper.meta.js // @license MIT // ==/UserScript== /* global clean, MessageBox, vkApi, loadScript, ace, geByClass1, cur */ /* changelog: 3.1: vkApi, chat members 3.0: Dialogs, link etc... 2.0: Add api version and rename 1.8: REPLACE KEY FROM CTRL TO ALT 1.7: fix ctrl key 1.6: add focus + callback 1.5: add ace.js 1.4: add groups */ function initImHelper() { if (/^\/(away|notifier)\.php/.test(window.location.pathname) || typeof vk !== 'object') return; var aceCorePath = '/js/ace/ace.js'; var API = (method, data) => vkApi.api(method, data); var group_regexp = /vk\.com\/gim(\d+)/; var api_objects = [ { selector: '.im-mess-stack--lnk, .mem_link', callback: function onFind(el) { const id = el.href.replace(/^.+\//, '') el.dataset.api_object_id = id; el.api_data = { id }; insertGlobalApiData(el.api_data); }, execute: function execute(Args) { var object = API.utils.resolveScreenName({ screen_name: Args.id }); if (object.type == 'user') { object.user = API.users.get({ user_ids: Args.id, v: Args.v })[0]; } if (object.type == 'group') { object.group = API.groups.getById({ group_ids: Args.id, v: Args.v })[0]; } if (object.type == 'app') { object.app = API.apps.get({ app_ids: Args.id, v: Args.v })[0]; } return object; } }, { selector: '#im_dialogs ._im_dialog', callback: function onFind(el) { const id = el.dataset.peer; el.dataset.api_object_id = id; el.api_data = { id }; insertGlobalApiData(el.api_data); }, execute: function execute(Args) { return API.messages.getConversationsById({ peer_ids: Args.id, group_id: Args.group_id, v: Args.v }).items[0]; } }, { selector: '._im_chat_members', callback: function onFind(el) { const id = cur.peer; el.dataset.api_object_id = id; el.api_data = { id }; insertGlobalApiData(el.api_data); }, execute: function execute(Args) { return API.messages.getConversationMembers({ peer_id: Args.id, group_id: Args.group_id, count: 200, v: Args.v }).items.map(item => item.member_id); } }, { selector: '._im_peer_history ._im_mess', callback: function onFind(el) { const id = el.dataset.msgid; el.dataset.api_object_id = id; el.api_data = { id }; insertGlobalApiData(el.api_data); }, execute: function execute(Args) { var message = API.messages.getById({ message_ids: Args.id, group_id: Args.group_id, v: Args.v }).items[0]; message._conversation_keyboard = API.messages.getConversationsById({ peer_ids: message.from_id, v: Args.v }).items[0].current_keyboard; return message; } } ]; function insertGlobalApiData(data) { var cur_href = window.location.href; data.v = '5.150'; if (group_regexp.test(cur_href)) { data.group_id = cur_href.match(group_regexp)[1]; } return data; } function getExecuteCode(fn) { return fn.toString() .replace(/.+?\{([^]+)\}/, "$1") .replace(/\.map\(item => item.([\w\d_]+)\)/i, "@.$1") } function wrapAceEditor(aceWrapElem, callback) { loadScript(aceCorePath, { onLoad: function onAceLoad() { var editor = ace.edit(aceWrapElem); editor.$blockScrolling = Infinity; editor.setShowPrintMargin(false); editor.getSession().setMode('ace/mode/json'); callback(editor); } }); } function loadObject(data) { return API('execute', data).catch((error) => { return { description: 'Произошла ошибка', error, data }; }).then(function (res) { var box = new MessageBox({ title: 'Object Info: ' + data.id + ' <input class="api_version dark" value="' + data.v + '" style="float: right; margin: 13px;"/>', hideButtons: 1, width: 700 }); var api_version = geByClass1('api_version', box.titleWrap); api_version.onkeydown = function (e) { if (e.keyCode == 13) { data.v = e.target.value; loadObject(data).then(function () { box.hide(); }); } } res = res.response || res; box.bodyNode.innerHTML = clean(JSON.stringify(res, null, 3)); box.bodyNode.className += ' api_object_helper_pre'; wrapAceEditor(box.bodyNode, function (editor) { box.show(); api_version.focus(); api_version.selectionStart = 0; api_version.selectionEnd = api_version.value.length; }); }).catch(console.error); } function addClickListener() { var keydown; var el_storage = []; function validateEvent(event) { return event.altKey; } function onClick(event, el) { if (!validateEvent(event)) return; if (!el.dataset.api_object_id) return; loadObject(el.api_data); event.preventDefault(); event.stopPropagation(); event.cancelBubble = true; event.returnValue = false; return false; } document.body.addEventListener('keydown', function (event) { if (!validateEvent(event)) return; keydown = true; document.body.classList.add('api_object_helper'); api_objects.forEach((api_object) => { document.querySelectorAll(api_object.selector).forEach((el) => { api_object.callback(el); if (!el.dataset.api_object_id) return; el.api_data.code = getExecuteCode(api_object.execute); el.onclick = (event) => onClick(event, el); el_storage.push(el); }); }); }); document.body.addEventListener('keyup', function (event) { if (!keydown) return; document.body.classList.remove('api_object_helper'); el_storage.forEach((el) => { delete el.api_data; delete el.onclick; }); el_storage = []; }); } addClickListener(); } var style = ` .api_object_helper_pre { overflow: scroll; width: 100%; height: 500px; white-space: pre; padding: 20px; box-sizing: border-box; background: #fff; } .api_object_helper [data-api_object_id]:before { content: attr(data-api_object_id); position: absolute; padding: 3px; background: #F44336; z-index: 2; color: #fff; font-size: 9px; border-radius: 2px; line-height: 1em; } .api_object_helper [data-api_object_id] { box-shadow: inset 0 0 0 1px #f00; }`; window.addEventListener("load", function (e) { document.head.appendChild(document.createElement("style")).innerHTML = style; }); (function injectScript() { var script = document.createElement('script'); var code = '(' + initImHelper + ')();'; script.appendChild(document.createTextNode(code)); (document.body || document.head || document.documentElement).appendChild(script); })();