NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name ShowVKAttachMessage
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Добавляет кнопку, которая позволяет перейти к сообщению с вложением
// @author You
// @match http://tampermonkey.net/
// @match *://vk.com/*
// @grant none
// @run-at document-end
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @license MIT
// ==/UserScript==
(function () {
'use strict';
if (typeof API !== "function")
window.API = function (method, data) {
if (!data) data = {};
var time = new Date();
API.time = Math.max(time, API.time) + 334;
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://vk.com/dev/execute', true);
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) return;
var hash = xhr.responseText.match(/Dev\.methodRun\(\'([a-z0-9\:]+)/im);
if (!hash) return reject("Invalid hash");
var _data = new FormData();
_data.append("act", "a_run_method");
_data.append("al", 1);
_data.append("hash", hash[1]);
_data.append("method", "execute");
_data.append("param_code", method == "execute" ? data.code : "return API." + method + "(" + JSON.stringify(data) + ");");
_data.append("param_v", "5.73");
if (method == "execute")
for (var name in data)
_data.append("param_" + name, data[name]);
var req = new XMLHttpRequest();
req.open('POST', 'https://vk.com/dev', true);
req.onreadystatechange = function () {
if (req.readyState != 4) return;
if (xhr.status !== 200) return reject("I/O Error", xhr.status);
var _response = req.response;
try {
_response = JSON.parse(req.response.replace(/^.+?\{/, "{"));
}
catch (e) {}
if (_response.response) {
resolve(_response);
}
else if (_response.error && _response.error.error_code == 6) {
API(method, data).then(resolve, reject);
}
else {
reject(_response);
}
};
req.send(_data);
};
setTimeout(xhr.send.bind(xhr), Math.max(API.time - time, 1));
});
};
API.time = new Date();
var checkLink = window.location.href;
new MutationObserver(function () {
if ($(location).attr('href').includes("vk.com/im")) {
var checkButton = document.querySelector("#pv_like > span.pv_like_link._link");
if (checkButton !== null && checkLink !== window.location.href) {
checkLink = window.location.href;
var actionsBar = $('#pv_box > div.clear_fix.pv_photo_wrap > div.no_select.pv_left_wrap > div.pv_bottom_info.clear_fix > div > div.pv_bottom_actions');
var separator = '<span class="divider"></span>';
var linkButton = '<a>Показать в сообщении</a>';
actionsBar.prepend(separator);
actionsBar.prepend(linkButton).click(function () {
createLink();
});
}
}
}).observe(document.body, {
childList: true,
subtree: true
});
function createLink() {
var chatId = findGetParameter("sel");
if (chatId.includes("c")) {
chatId = 2000000000 + parseInt(chatId.substring(1));
}
var photoNumber = parseInt($('#pv_box > div.clear_fix.pv_photo_wrap > div.no_select.pv_left_wrap > div.pv_bottom_info.clear_fix > div > div.pv_bottom_info_left > span.pv_counter').text().match(/^\d+/));
if (photoNumber > 0) {
var data = {
"peer_id": chatId,
"media_type": "photo",
"count": photoNumber + 1
};
API("messages.getHistoryAttachments", data).then(value => {
var photos = value.response.items;
var photo = photos[photos.length - 2];
var saveLink = 'https://vk.com/im?msgid=' + photo.message_id + '&sel=' + chatId;
window.location = saveLink;
});
}
else {
var data = {
"peer_id": chatId,
"media_type": "photo",
"count": 1
};
API("messages.getHistoryAttachments", data).then(value => {
var photo = value.response.items[0];
var saveLink = 'https://vk.com/im?msgid=' + photo.message_id + '&sel=' + chatId;
window.location = saveLink;
});
}
}
function findGetParameter(parameterName) {
var result = null,
tmp = [];
location.search
.substr(1)
.split("&")
.forEach(function (item) {
tmp = item.split("=");
if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
});
return result;
}
})();