Отправка капчи через HTTP (POST/GET) !!!РЕШЕНИЕ!!!

HprNv

Новичок
Регистрация
02.01.2018
Сообщения
2
Благодарностей
5
Баллы
3
Знаю что многие здесь маются с этой проблемой а решение как ни странно так никто из саппорта и не дает. В общем потратив последние сутки на борьбу с этой проблемой я нашел решение. Сначала ковырялся через POSTMAN и в нем все было хорошо и радужно. Запрос уходил и приходил ответ. Когда же попытался конвертнуть в JS (XHR или Ajax) и засунуть это дело в tampermonkey начался гемморой. но решение найдено. Итак внимание :-)
Шаг первый. Добираемся до тега img на искомой странице, в моем случае это так
Код:
var imgsrc = document.querySelector('body > div.row > div.col.s12.m9 > form > div:nth-child(4) > div > img');
Шаг второй преобразуем содержимое в base64.
Код:
var base64 = getBase64Image(imgsrc);
Шаг третий получаем blob для отправки через форму на сервер.
Код:
var blob = dataURItoBlob(base64);
Шаг четвертый отправляем собственно форму со всеми данными на сервер и наслаждаемся ответом.
Код:
uploadData(blob);
Соответствующие функции ниже (код не идеален подправьте под себя, писал лишь бы уже добиться рабочего состояния).
Код:
function getBase64Image(img) {
  var canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;
  var ctx = canvas.getContext("2d");
  ctx.drawImage(img, 0, 0);
  var dataURL = canvas.toDataURL("image/png");
  return dataURL;
}

function dataURItoBlob(dataURI)
{
  var byteString = atob(dataURI.split(',')[1]);

  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < byteString.length; i++)
  {
  ia[i] = byteString.charCodeAt(i);
  }

  var bb = new Blob([ab], { "type": mimeString });
  return bb;
}

function uploadData(blob)
{
  var form = new FormData();
  form.append("method", "post");
  form.append("file", blob);
  form.append("filename", "captcha.png");
  form.append("key", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

  var request = new XMLHttpRequest();

  request.onload = request.onerror = function() {
  if (this.status == 200) {
  console.log(request.responseText);
  }
  else {
  console.log("error " + this.status);
  }
  };
  request.open("POST", "http://127.0.0.3/in.php");
  request.send(form);
}
 

vaulroon

Client
Регистрация
20.10.2017
Сообщения
274
Благодарностей
11
Баллы
18
Если бы ты еще и закомментировал для тех, кто не шарит...
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)