Advertisement
stuppid_bot

Untitled

Feb 1st, 2016
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Форма для ввода капчи
  2. ;(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)})();
  3.  
  4. // event-emitter.js
  5. //
  6. // @author Sergei Snegirev (tz4678@gmail.com)
  7. //
  8.  
  9. /**
  10.  * EventEmitter constructor
  11.  */
  12. function EventEmitter() {
  13.   this._listeners = {};
  14. }
  15.  
  16. EventEmitter.prototype = {
  17.   /**
  18.    * Add event listener
  19.    *
  20.    * @param event {string}
  21.    * @param fn {function}
  22.    * @param context {object} (optional)
  23.    * @param once {boolean} (optional)
  24.    * @return {this}
  25.    */
  26.   on: function(event, fn, context, once) {
  27.     (this._hasOwn(event) ? this._listeners[event] :
  28.       this._listeners[event] = []).push({
  29.       fn: fn,
  30.       context: context != null ? context : this,
  31.       once: once
  32.     });
  33.     return this;
  34.   },
  35.   /**
  36.    * Add one-shot event listener
  37.    *
  38.    * @param event {string}
  39.    * @param fn {function}
  40.    * @param context {object} (optional)
  41.    * @return {this}
  42.    */
  43.   once: function(event, fn, context) {
  44.     return this.on(event, fn, context, true);
  45.   },
  46.   /**
  47.    * Remove event listeners
  48.    *
  49.    *
  50.    * @param event {string} (optional)
  51.    * @param fn {function} (optional)
  52.    * @param context {object} (optional)
  53.    * @return {this}
  54.    */
  55.   off: function(event, fn, context) {
  56.     if (!arguments.length) {
  57.       // .off() remove all listeners
  58.       this._listeners = {};
  59.     } else if (arguments.length == 1) {
  60.       // .off(event) remove all listeners for event
  61.       if (this._hasOwn(event)) {
  62.         delete this._listeners[event];
  63.       }
  64.     } else {
  65.       // .off(event, fn[, context]) remove all listeners fn for event or
  66.       // remove all listeners fn for event in the context
  67.       if (this._hasOwn(event)) {
  68.         var listeners = this._listeners[event];
  69.         var i = 0;
  70.         while (i < listeners.length) {
  71.           var listener = listeners[i];
  72.           if (fn === listener.fn && (context == null ||
  73.               context === listener.context)) {
  74.             listeners.splice(i, 1);
  75.           } else {
  76.             ++i
  77.           }
  78.         }
  79.         if (!listeners.length) {
  80.           delete this._listeners[event];
  81.         }
  82.       }
  83.     }
  84.     return this;
  85.   },
  86.   /**
  87.    * Emit event
  88.    *
  89.    * <code>.emit(event[, arg1[, arg2[, ...]]])</code>
  90.    *
  91.    * @param event {string}
  92.    * @param *args
  93.    */
  94.   emit: function(event, args) {
  95.     if (!this._hasOwn(event)) {
  96.       return;
  97.     }
  98.     args = [].slice.call(arguments, 1);
  99.     var listeners = this._listeners[event];
  100.     var i = 0;
  101.     while (i < listeners.length) {
  102.       var listener = listeners[i];
  103.       listener.fn.apply(listener.context, args)
  104.       if (listener.once) {
  105.         listeners.splice(i, 1);
  106.       } else {
  107.         ++i
  108.       }
  109.     }
  110.     if (!listeners.length) {
  111.       delete this._listeners[event];
  112.     }
  113.  
  114.   },
  115.   _hasOwn: function(event) {
  116.     return this._listeners.hasOwnProperty(event);
  117.   }
  118. };
  119.  
  120. /**
  121.  * Add mixin to obj
  122.  *
  123.  * <code>
  124.  * function Foo() {}
  125.  *
  126.  * EventEmitter.mixin(Foo);
  127.  * var foo = new Foo();
  128.  * foo.on("test", () => console.log("It's works!"));
  129.  * foo.emit("test");
  130.  * </code>
  131.  *
  132.  * @param obj {object}
  133.  * @return {object}
  134.  */
  135. EventEmitter.mixin = function(obj) {
  136.   if (typeof obj == "function") {
  137.     obj = obj.prototype;
  138.   }
  139.   var proto = new EventEmitter();
  140.   for (var i in proto) {
  141.     obj[i] = proto[i];
  142.   }
  143.   return obj;
  144. };
  145.  
  146. // common.js
  147.  
  148. // function clone(o) {
  149. //   return JSON.parse(JSON.stringify(o));
  150. // }
  151.  
  152. function clone(obj, deep) {
  153.   if (obj == null || typeof obj != "object") {
  154.     return obj;
  155.   }
  156.   var copy = obj.constructor();
  157.   for (var i in obj) {
  158.     if (obj.hasOwnProperty(i)) {
  159.       copy[i] = deep ? clone(obj[i], deep) : obj[i];
  160.     }
  161.   }
  162.   return copy;
  163. }
  164. // http.js
  165. // requires common.js
  166.  
  167. var PARAM_SEP = "&";
  168. var PARAM_EQ = "=";
  169.  
  170. function encodeQueryParams(params, sep, eq) {
  171.   sep = sep || PARAM_SEP;
  172.   eq = eq || PARAM_EQ;
  173.   var pairs = [];
  174.   for (var i in params) {
  175.     if (params.hasOwnProperty(i)) {
  176.       var name = encodeURIComponent(i);
  177.       var value = encodeURIComponent(params[i]);
  178.       pairs.push(name + eq + value);
  179.     }
  180.   }
  181.   return pairs.join(sep);
  182. }
  183.  
  184. function parseQueryString(str, sep, eq) {
  185.   sep = sep || PARAM_SEP;
  186.   eq = eq || PARAM_EQ;
  187.   var pairs = str.split(sep);
  188.   var ret = {};
  189.   for (var i = 0; i < pairs.length; ++i) {
  190.     var pair = pairs[i].split(eq);
  191.     var name = decodeURIComponent(pair[0]);
  192.     var value = pair.length > 1 ? decodeURIComponent(pair[1]) : '';
  193.     ret[name] = value;
  194.   }
  195.   return ret;
  196. }
  197.  
  198. /**
  199.  * Send request
  200.  *
  201.  * @param method {string}
  202.  * @param url {string}
  203.  * @param callback {function}
  204.  * @param options.context {object}
  205.  * @param options.data {object}
  206.  * @param options.headers {object}
  207.  * @param options.params {object}
  208.  */
  209. function request(method, url, callback, options) {
  210.   options = options || {};
  211.   if (options.params) {
  212.     var params = encodeQueryParams(options.params);
  213.     url += (url.indexOf('?') == -1 ? '?' : '&') + params;
  214.   }
  215.   var xhr = new XMLHttpRequest();
  216.   xhr.open(method.toUpperCase(), url);
  217.   var data = options.data;
  218.   // В Qml typeof FormData == "undefined"
  219.   var contentTypeIsSet = false;
  220.   if (options.headers) {
  221.     var headers = options.headers;
  222.     for (var i in headers) {
  223.       if (headers.hasOwnProperty(i)) {
  224.         if (!contentTypeIsSet && i.toLowerCase() == "content-type") {
  225.           contentTypeIsSet = true;
  226.         }
  227.         xhr.setRequestHeader(i, headers[i]);
  228.       }
  229.     }
  230.   }
  231.   if (data && (typeof FormData == "undefined" || !(data instanceof FormData))) {
  232.     data = encodeQueryParams(data);
  233.     if (!contentTypeIsSet) {
  234.       xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  235.     }
  236.   }
  237.   xhr.onload = function() {
  238.     if (typeof callback != "function") {
  239.       return;
  240.     }
  241.     try {
  242.       xhr.responseJSON = JSON.parse(xhr.responseText);
  243.     } catch (e) {}
  244.     var response = xhr.responseJSON || xhr.responseText;
  245.     callback.call(options.context, response, xhr.status, xhr);
  246.   };
  247.   xhr.send(data);
  248. }
  249.  
  250. /**
  251.  * get('http://httpbin.org/get', (q) => console.log(q.args), {foo: "bar"})
  252.  */
  253. function get(url, callback, params, options) {
  254.   options = clone(options || {});
  255.   options.params = params;
  256.   request("GET", url, callback, options);
  257. }
  258.  
  259. /**
  260.  * post('http://httpbin.org/post', {foo: "bar"}, (q) => console.log(q.form))
  261.  */
  262. function post(url, data, callback, options) {
  263.   options = clone(options || {});
  264.   options.data = data;
  265.   request("POST", url, callback, options);
  266. }
  267.  
  268. var API_VERSION = 5.44;
  269. var API_URL = "https://api.vk.com/method/";
  270. var API_DELAY = 334;
  271.  
  272. var ERRORS = {
  273.   // ...
  274.   CAPTCHA_NEEDED: 14,
  275.   // ...
  276. }
  277.  
  278. function Api(accessToken, userId, delay, version) {
  279.     this.accessToken = accessToken;
  280.     this.userId = userId;
  281.     // Искуственная задержка перед выполнением запроса
  282.     // У Вконтакте есть ограничение на количество запросов в секунду
  283.     this.delay = delay || API_DELAY;
  284.     this.version = version || API_VERSION;
  285.     // Для отладки
  286.     this.lastResponse = null;
  287.     // Очередь запросов
  288.     this._queue = [];
  289.     this._waiting = false;
  290.     this._lastRequestTime = 0;
  291. }
  292.  
  293. Api.prototype = {
  294.   // call(method, callback, params)
  295.   // call(method, callback, params)
  296.   call: function(method, callback, params, delay) {
  297.     // Мы не отправляем запрос сразу, а только добавляем его в очередь
  298.     // ((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");
  299.     params = clone(params || {});
  300.     params.v = this.version;
  301.     if (this.accessToken) {
  302.       params.access_token = this.accessToken;
  303.     }
  304.     delay || (delay = this.delay)
  305.     this._queue.push({
  306.       method: method,
  307.       callback: callback,
  308.       params: params,
  309.       delay: delay
  310.     });
  311.     console.log("Добавили запрос в очередь");
  312.     this._handle();
  313.     // .call(...).call(...)
  314.     return this;
  315.   },
  316.   cont: function() {
  317.     console.log("Продолжаем обработку озапросов");
  318.     this._waiting = false;
  319.     this._handle();
  320.   },
  321.   wait: function() {
  322.     console.log("Ждем обработки запроса");
  323.     this._waiting = true;
  324.   },
  325.   current: function() {
  326.     return this._queue[0];
  327.   },
  328.   next: function() {
  329.     console.log("Переходим к следующему запросу");
  330.     this._queue.shift();
  331.     this.cont();
  332.   },
  333.   _handle: function() {
  334.     if (this._waiting) {
  335.       console.log("Ждем");
  336.       return;
  337.     }
  338.     var cur = this.current();
  339.     if (cur === undefined) {
  340.       console.log("Закончили");
  341.       return;
  342.     }
  343.     this.wait();
  344.     console.log("Вызываем метод %s с параметрами %s", cur.method,
  345.       JSON.stringify(cur.params).replace(
  346.         /("access_token":")[^"]+/, "$1**censored**"));
  347.     var endpoint = API_URL.replace(/(\/|)$/, '/') + cur.method;
  348.     var newRequestTime = cur.delay + this._lastRequestTime;
  349.     var nowTime = Date.now();
  350.     var delay = newRequestTime > nowTime ? newRequestTime - nowTime : 0;  
  351.     console.log("Ждем %s мсек", delay);
  352.     var self = this;
  353.     setTimeout(function() {
  354.       post(endpoint, cur.params, function(response) {
  355.         self._lastRequestTime = Date.now();
  356.         console.log("Last Request Time: %s", self._lastRequestTime);
  357.         if (response.error) {
  358.           var error = response.error;
  359.           if (error.error_code == ERRORS.CAPTCHA_NEEDED) {
  360.             cur.params.captcha_sid = error.captcha_sid;
  361.             console.log("Требуется ввод капчи");
  362.             self.emit("captcha", error.captcha_img);
  363.             // Ожидаем ввода капчи
  364.             // self.next() не выполнится
  365.             return;
  366.           }
  367.         }
  368.         if (typeof cur.callback == "function") {
  369.           self.lastResponse = response;
  370.           cur.callback(response.error, response.response);
  371.         }
  372.         self.next();
  373.       });
  374.     }, delay);
  375.   },
  376. };
  377.  
  378. EventEmitter.mixin(Api);
  379.  
  380. var cookies = parseQueryString(document.cookie, "; ");
  381. var api = new Api(cookies.access_token, parseInt(cookies.user_id));
  382.  
  383. api.on("captcha", function(url) {
  384.   captchaImg.src = url;
  385. });
  386.  
  387. captchaImg.onload = function() {
  388.   captchaForm.style.display = "block";
  389.   captchaKey.value = "";
  390.   captchaKey.focus();
  391.   captchaKey.scrollIntoView();
  392. };
  393.  
  394. captchaForm.addEventListener('submit', function() {
  395.   this.style.display = "none";
  396.   api.current().params.captcha_key = captchaKey.value;
  397.   api.cont();
  398. });
  399.  
  400. for (var i = 1; i <= 20; ++i) {
  401.   api.call("wall.post", function(error, response) {
  402.     console.log(response.post_id);
  403.   }, {message: "Сообщение #" + i});
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement