AHOHNMYC

anon.fm AJAX posting

Feb 3rd, 2018 (edited)
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         anon.fm AJAX posting
  3. // @namespace    FM veshtschaniye
  4. // @version      0.0.1.6
  5. // @author       AHOHNMYC
  6. // @match        https://anon.fm/feedback*
  7. // @match        https://alcxemuct.accountant/feedback*
  8. // @grant        none
  9. // ==/UserScript==
  10.  
  11. /* Клик на капчу обновляет её
  12.  * Сообщение отправляется по Enter
  13.  * R на поле ввода капчи обновляет её
  14.  * */
  15.  
  16. const img = document.getElementsByTagName('img')[0];
  17. const capchaInput = document.querySelector('[name=check]');
  18. /* Стили */
  19. img.style.cursor = 'pointer';
  20. img.style.filter = 'invert(.0666)';
  21.  
  22. capchaInput.style = 'text-align: center; width: 6em';
  23. capchaInput.type = 'number';
  24. capchaInput.min = 0;
  25. capchaInput.max = 99999;
  26. document.head.appendChild(document.createElement`style`).textContent = 'input::-webkit-inner-spin-button {display: none}';
  27.  
  28. document.querySelector('[type=submit]').style.display = 'none';
  29. document.getElementById('charsleft').tabIndex = -1;
  30. /* События */
  31. img.addEventListener('click', updateCapcha);
  32. document.forms[0].onsubmit = alternativeSend;
  33.  
  34. function updateCapcha(focusOnInput=true) {
  35.     if (focusOnInput) capchaInput.focus();
  36.     img.removeAttribute('src');
  37.     fetch('/feedback')
  38.         .then( response=>response.text() )
  39.         .then( text=>{
  40.             const capchaID = text.match(/(\d+)\.gif/)[1];
  41.             updateCapchaID(capchaID);
  42.         });
  43. }
  44.  
  45. function updateCapchaID(capchaID) {
  46.     if (!capchaID) return;
  47.     document.querySelector('[name=cid]').value = capchaID;
  48.     img.src = '/feedback/'+capchaID+'.gif';
  49.     capchaInput.value = '';
  50. }
  51.  
  52. addEventListener('keypress', e=>{
  53.     if (e.ctrlKey && 'Enter' === e.code)
  54.         document.forms[0].dispatchEvent(new Event('submit'));
  55.     if (document.activeElement.name === 'check' && ('KeyR' === e.code || 114 === e.keyCode || 'r' === e.key.toLowerCase() || 'к' === e.key.toLowerCase())) {
  56.         e.preventDefault();
  57.         updateCapcha();
  58.     }
  59. });
  60.  
  61.  
  62. function alternativeSend(e) {
  63.     e.preventDefault();
  64.     if (!capchaInput.value) return capchaInput.focus();
  65.     if (!te.value || !checkChmo()) return te.focus();
  66.  
  67.     const xhr = new XMLHttpRequest();
  68.     xhr.open('POST', '/feedback', true);
  69.     xhr.onreadystatechange = function() {
  70.         if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
  71.             let capchaFieldColor = '#dfd'; /* green */
  72.             if ( xhr.responseText.match('Отправлено') ) {
  73.                 updateCapcha(false);
  74.                 te.value = '';
  75.                 te.focus();
  76.                 CountLeft(te);
  77.             } else {
  78.                 capchaFieldColor = '#fbb'; /* red */
  79.                 const capchaID = xhr.responseText.match(/(\d+)\.gif/)[1];
  80.                 updateCapchaID(capchaID);
  81.             }
  82.             capchaInput.value = '';
  83.             capchaInput.style.backgroundColor = capchaFieldColor;
  84.         }
  85.     };
  86.     let text = '';
  87.     ['cid', 'left', 'msg', 'check'].forEach(arg=>text+=(text?'&':'')+arg+'='+encodeURIComponent(document.querySelector(`[name=${arg}]`).value));
  88.     xhr.send(text);
  89. }
Add Comment
Please, Sign In to add comment