Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Форма для ввода капчи
- ;(function(){var s=document.createElement('style');s.textContent="\n body {\n color: #212121;\n margin: 0;\n font: normal 13px/1em Arial, sans-serif;\n }\n #mainWrapper {\n margin: auto;\n width: 200px;\n padding: 10px 20px;\n }\n .inputBox {\n padding: 2px 4px;\n }\n .inputBox input {\n width: 100%;\n box-sizing: border-box;\n text-align: center;\n display: block;\n margin: auto;\n }\n .captchaBox {\n padding: 2px 4px;\n height: 50px;\n width: 130px;\n display: block;\n margin: auto;\n }\n #captchaKey {\n width: 130px;\n }\n .buttonBox {\n padding: 2px 4px;\n }\n .buttonBox button {\n width: 130px;\n box-sizing: border-box;\n display: block;\n margin: auto;\n }\n #captchaForm {\n display: none;\n }\n ";document.head.appendChild(s);document.body.innerHTML="<div id=\"mainWrapper\">\n <form id=\"captchaForm\">\n <div class=\"captchaBox\">\n <img id=\"captchaImg\">\n </div>\n <div class=\"inputBox\">\n <input type=\"text\" id=\"captchaKey\" name=\"captchaKey\" placeholder=\"Captcha Code\">\n </div>\n <div class=\"buttonBox\">\n <button>Send</button>\n </div>\n </form>\n </div>";s=document.createElement('script');s.textContent="\n var captchaForm = document.getElementById(\"captchaForm\");\n captchaForm.addEventListener(\"submit\", function(ev) {\n ev.preventDefault();\n });\n var captchaImg = document.getElementById(\"captchaImg\");\n var captchaSrc = captchaImg.src;\n captchaImg.addEventListener(\"click\", function() {\n this.src = this.src.replace(/&t=\\d+/, '') + '&t=' + Date.now();\n });\n ";document.body.appendChild(s)})();
- // event-emitter.js
- //
- // @author Sergei Snegirev (tz4678@gmail.com)
- //
- /**
- * EventEmitter constructor
- */
- function EventEmitter() {
- this._listeners = {};
- }
- EventEmitter.prototype = {
- /**
- * Add event listener
- *
- * @param event {string}
- * @param fn {function}
- * @param scope {object} (optional)
- * @param once {boolean} (optional)
- * @return {this}
- */
- on: function(event, fn, scope, once) {
- (this._hasOwn(event) ? this._listeners[event] :
- this._listeners[event] = []).push({
- fn: fn,
- scope: scope != null ? scope : this,
- once: once
- });
- return this;
- },
- /**
- * Add one-shot event listener
- *
- * @param event {string}
- * @param fn {function}
- * @param scope {object} (optional)
- * @return {this}
- */
- once: function(event, fn, scope) {
- return this.on(event, fn, scope, true);
- },
- /**
- * Remove event listeners
- *
- *
- * @param event {string} (optional)
- * @param fn {function} (optional)
- * @param scope {object} (optional)
- * @return {this}
- */
- off: function(event, fn, scope) {
- if (!arguments.length) {
- // .off() remove all listeners
- this._listeners = {};
- } else if (arguments.length == 1) {
- // .off(event) remove all listeners for event
- if (this._hasOwn(event)) {
- delete this._listeners[event];
- }
- } else {
- // .off(event, fn[, scope]) remove all listeners fn for event or
- // remove all listeners fn for event in the scope
- if (this._hasOwn(event)) {
- var listeners = this._listeners[event];
- var i = 0;
- while (i < listeners.length) {
- var listener = listeners[i];
- if (fn === listener.fn &&
- (scope == null || scope === listener.scope)) {
- listeners.splice(i, 1);
- } else {
- ++i
- }
- }
- if (!listeners.length) {
- delete this._listeners[event];
- }
- }
- }
- return this;
- },
- /**
- * Emit event
- *
- * <code>.emit(event[, arg1[, arg2[, ...]]])</code>
- *
- * @param event {string}
- * @param *args
- */
- emit: function(event, args) {
- if (!this._hasOwn(event)) {
- return;
- }
- args = [].slice.call(arguments, 1);
- var listeners = this._listeners[event];
- var i = 0;
- while (i < listeners.length) {
- var listener = listeners[i];
- listener.fn.apply(listener.scope, args)
- if (listener.once) {
- listeners.splice(i, 1);
- } else {
- ++i
- }
- }
- if (!listeners.length) {
- delete this._listeners[event];
- }
- },
- _hasOwn: function(event) {
- return this._listeners.hasOwnProperty(event);
- }
- };
- /**
- * Add mixin to obj
- *
- * <code>
- * function Foo() {}
- *
- * EventEmitter.mixin(Foo);
- * var foo = new Foo();
- * foo.on("test", () => console.log("It's works!"));
- * foo.emit("test");
- * </code>
- *
- * @param obj {object}
- * @return {object}
- */
- EventEmitter.mixin = function(obj) {
- if (typeof obj == "function") {
- obj = obj.prototype;
- }
- var proto = new EventEmitter();
- for (var i in proto) {
- obj[i] = proto[i];
- }
- return obj;
- };
- // http.js
- var PARAM_SEP = "&";
- var PARAM_EQ = "=";
- function encodeQueryParams(params, sep, eq) {
- var pairs = [];
- sep = sep || PARAM_SEP;
- eq = eq || PARAM_EQ;
- for (var i in params) {
- if (params.hasOwnProperty(i)) {
- var name = encodeURIComponent(i);
- var value = encodeURIComponent(params[i]);
- pairs.push(name + eq + value);
- }
- }
- return pairs.join(sep);
- }
- function parseQueryString(str, sep, eq) {
- sep = sep || PARAM_SEP;
- eq = eq || PARAM_EQ;
- var pairs = str.split(sep);
- var ret = {};
- for (var i = 0; i < pairs.length; ++i) {
- var pair = pairs[i].split(eq);
- var name = decodeURIComponent(pair[0]);
- var value = pair.length == 2 ? decodeURIComponent(pair[1]) : '';
- ret[name] = value;
- }
- return ret;
- }
- function request(method, url, callback, data, params, headers) {
- method = method.toUpperCase();
- if (params) {
- params = encodeQueryParams(params);
- url += (url.indexOf('?') == -1 ? '?' : '&') + params;
- }
- var xhr = new XMLHttpRequest();
- xhr.open(method, url);
- xhr.onload = function() {
- if (typeof callback != "function") {
- return;
- }
- try {
- xhr.responseJSON = JSON.parse(xhr.responseText);
- } catch (e) {}
- var data = xhr.responseJSON || xhr.responseText;
- callback(data, xhr.status, xhr);
- };
- var contentType;
- // В Qml typeof FormData == "undefined"
- if (data && (typeof FormData == "undefined" || !(data instanceof FormData))) {
- data = encodeQueryParams(data);
- contentType = "application/x-www-form-urlencoded";
- }
- if (headers) {
- for (var i in headers) {
- if (headers.hasOwnProperty(i)) {
- if (i.toLowerCase() == "content-type") {
- contentType = headers[i];
- } else {
- xhr.setRequestHeader(i, headers[i]);
- }
- }
- }
- }
- contentType && xhr.setRequestHeader("Content-Type", contentType);
- xhr.send(data);
- }
- function get(url, callback, params, headers) {
- request("GET", url, callback, null, params, headers);
- }
- function post(url, callback, data, params, headers) {
- request("POST", url, callback, data, params, headers);
- }
- // Utils
- // Fast copy
- // В консоли какой-то баг Хром, если пробуешь переопределить встроенный метод
- // copy
- function clone(o) {
- return JSON.parse(JSON.stringify(o));
- }
- //
- var API_VERSION = 5.44;
- var API_URL = "https://api.vk.com/method/";
- var API_DELAY = 334;
- var ERRORS = {
- // ...
- CAPTCHA_NEEDED: 14,
- // ...
- }
- function Api(accessToken, userId, delay, version) {
- this.accessToken = accessToken;
- this.userId = userId;
- // Искуственная задержка перед выполнением запроса
- // У Вконтакте есть ограничение на количество запросов в секунду
- this.delay = delay || API_DELAY;
- this.version = version || API_VERSION;
- // Для отладки
- this.lastResponse = null;
- // Очередь запросов
- this._q = [];
- this._waiting = false;
- this._lastRequest = 0;
- }
- Api.prototype = {
- call: function(method, callback, params, delay) {
- // Мы не отправляем запрос сразу, а только добавляем его в очередь
- // ((s)=>{var q=s.split(/\s*,\s*/),o={};for(var i=0;i<q.length;++i)o[q[i]]=q[i];prompt("Ctrl+C:",JSON.stringify(o,0,2).replace(/"/g,''))})("method, callback, params, delay");
- params = clone(params || {});
- params.v = this.version;
- if (this.accessToken) {
- params.access_token = this.accessToken;
- }
- delay || (delay = this.delay)
- this._q.push({
- method: method,
- callback: callback,
- params: params,
- delay: delay
- });
- console.log("Добавили запрос очередь");
- this._handle();
- // .call(...).call(...)
- return this;
- },
- current: function() {
- return this._q[0];
- },
- next: function() {
- console.log("Переходим к следующему запросу");
- this._q.shift(); // в dev/null отправили к праотцам
- this._waiting = false;
- console.log("Сняли блокировку с очереди");
- this._handle();
- },
- retry: function() {
- console.log("Повторяем попытку");
- this._waiting = false;
- this._handle();
- },
- _handle: function() {
- console.log("Пробуем обработать запрос");
- if (this._waiting) {
- console.log("Очередь заблокирована!");
- return;
- }
- var cur = this.current();
- if (cur === undefined) {
- console.log("Очередь пуста");
- return;
- }
- this._waiting = true;
- console.log("Блокируем очередь");
- console.log("Вызываем метод %s с параметрами %s", cur.method,
- JSON.stringify(cur.params).replace(
- /("access_token":")[^"]+/, "$1**censored**"));
- var endpoint = API_URL.replace(/(\/|)$/, '/') + cur.method;
- var delay = cur.delay + this._lastRequest - Date.now();
- delay = delay > 0 ? delay : 0;
- console.log("Ждем %s миллисекунд", delay);
- var self = this;
- setTimeout(function() {
- post(endpoint, function(response) {
- self._lastRequest = Date.now();
- if (response.error) {
- var error = response.error;
- if (error.error_code == ERRORS.CAPTCHA_NEEDED) {
- console.log("Требуется ввод капчи");
- cur.params.captcha_sid = error.captcha_sid;
- self.emit("captcha", error.captcha_img);
- // Ожидаем ввода капчи
- // self.next() не выполнится
- return;
- }
- }
- self.next(); // Выполняем запросы далее
- if (typeof cur.callback == "function") {
- self.lastResponse = response;
- cur.callback(response.error, response.response);
- }
- }, cur.params);
- }, delay); // если отрицательный выполнится сразу
- },
- };
- EventEmitter.mixin(Api);
- var cookies = parseQueryString(document.cookie, "; ");
- var api = new Api(cookies.access_token, parseInt(cookies.user_id));
- api.on("captcha", function(url) {
- captchaImg.src = url;
- });
- captchaImg.onload = function() {
- captchaForm.style.display = "block";
- captchaKey.value = "";
- captchaKey.focus();
- captchaKey.scrollIntoView();
- };
- captchaForm.addEventListener('submit', function() {
- this.style.display = "none";
- api.current().params.captcha_key = captchaKey.value;
- api.retry();
- });
- for (var i = 1; i <= 20; ++i) {
- api.call("wall.post", function(error, response) {
- console.log(response.post_id);
- }, {message: "Сообщение #" + i});
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement