This repository was archived by the owner on Dec 30, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathuserscript.js
More file actions
82 lines (69 loc) · 2.41 KB
/
Copy pathuserscript.js
File metadata and controls
82 lines (69 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// ==UserScript==
// @name APIdog Plus
// @namespace http://tampermonkey.net/
// @version 3.3
// @author APIdog
// @grant GM_webRequest
// @grant GM_xmlhttpRequest
// @match *://apidog.ru/*
// @connect api.vk.com
// @connect api.vk.me
// @connect im.vk.com
// @icon https://www.google.com/s2/favicons?domain=apidog.ru
// ==/UserScript==
let userAgent;
let longpollServer;
let longpollKey;
let longpollTs;
let longpollVersion;
let longpollMode;
const METHOD_ACCESS_TOKEN_REQUIRE = 'onAccessTokenRequire';
const METHOD_LONGPOLL_DATA_RECEIVED = 'onLongPollDataReceived';
const EVENT_ACCESS_TOKEN_RECEIVED = 'onAccessTokenReceived';
function fetch(url) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url,
method: 'GET',
onload: res => {
try {
resolve(JSON.parse(res.responseText));
} catch (e) {
reject(undefined);
}
},
onerror: reject,
})
});
}
function sendMessage(method, data, callback) {
unsafeWindow.postMessage(JSON.stringify({ ...data, method, callback }), '*');
}
function getLongPollServer(token, version) {
return fetch(`https://api.vk.com/method/messages.getLongPollServer?v=${version}&access_token=${token}`);
}
function longPollHandle() {
const url = `https://${longpollServer}?act=a_check&key=${longpollKey}&ts=${longpollTs}&wait=25&mode=${longpollMode}&version=${longpollVersion}`;
fetch(url).then(({ ts, updates }) => {
longpollTs = ts;
sendMessage(METHOD_LONGPOLL_DATA_RECEIVED, { updates });
})
.catch(err => console.error('APIdog Plus TM error', err))
.then(() => setTimeout(longPollHandle, 100));
}
window.addEventListener('message', event => {
const data = event.data;
if (data.method === EVENT_ACCESS_TOKEN_RECEIVED) {
userAgent = data.userAgent;
longpollVersion = data.longpollVersion;
longpollMode = data.mode;
getLongPollServer(data.useraccesstoken, data.apiVersion).then(result => {
const { server, ts, key } = result.response;
longpollServer = server;
longpollKey = key;
longpollTs = ts;
longPollHandle();
});
}
});
sendMessage(METHOD_ACCESS_TOKEN_REQUIRE, { version: '3.3' }, EVENT_ACCESS_TOKEN_RECEIVED);