Я хочу начать с того, что мы только очищаем нашу собственную учетную запись, потому что моей компании нужны данные из нашей собственной панели мониторинга, которые мы не можем получить из MWS API. Я очень хорошо знаком с этими API.
В течение многих лет у меня были скрипты для входа/вызова. Но недавно Амазонка начала предлагать каптчи. Мой старый способ соскабливания был от PHP, делающего запросы cURL, чтобы имитировать браузер.
Мой новый подход использует PhantomJS и CasperJS для достижения такого же эффекта. Все работало нормально в течение дня, но я снова получаю капчу.
Теперь, из внутренних источников, я знаю, что Amazon не делает никаких царапин. Тем не менее, они выполняют обнаружение атаки с помощью взлома /DDOS. Поэтому я думаю, что что-то об этом кодексе casperJS становится помеченным как атака.
Я не думаю, что слишком часто вызываю сценарий. И я изменил свой IP-адрес, из которого поступают запросы.
Вот какой код casperJS
var fs = require('fs');
var casper = require('casper').create({
pageSettings: {
loadImages: false,
loadPlugins: false,
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
}
});
// use any cookies
var cookieFilename = "cookies/_cookies.txt";
var data = fs.read(cookieFilename);
if(data) {
phantom.cookies = JSON.parse(data);
}
//First step is to open Amazon
casper.start("https://sellercentral.amazon.com/gp/homepage.html", function() {
console.log("Amazon website opened");
});
casper.wait(1000, function() {
if(this.exists("form[name=signinWidget]")) {
console.log("need to login");
//Now we have to populate username and password, and submit the form
casper.wait(1000, function(){
console.log("Login using username and password");
this.evaluate(function(){
document.getElementById("username").value="*****";
document.getElementById("password").value="*****";
document.querySelector("form[name=signinWidget]").submit();
});
});
// write the cookies
casper.wait(1000, function() {
var cookies = JSON.stringify(phantom.cookies);
fs.write(cookieFilename, cookies, 644);
})
} else {
console.log("already logged in");
}
});
//Wait to be redirected to the Home page, and then make a screenshot
casper.wait(1000, function(){
console.log("is login found?");
console.log(this.exists("form[name=signinWidget]"));
this.echo(this.getPageContent());
});
casper.run();
Результатом этой последней строки является только страница входа с captcha. Что дает? Это должен быть обычный браузер. Когда я использую тот же логин на своем компьютере, у меня вообще нет проблем.
Я также пробовал несколько строк пользовательского агента. Иногда меняются эти работы временно.
Кроме того, когда я загружаю все это локально, он отлично работает. Но на сервере Linux он получает капчу. Обратите внимание, что я неоднократно менял IP-адрес удаленного сервера Linux. Он по-прежнему получает капчу.
Как это часто бывает при очистке/автоматизации, причиной ошибок является необязательно неправильно написанный скрипт, а также контекст, лежащий в основе инфраструктуры.
В этом случае мы определили (в комментариях), что сценарий был запрограммирован captcha только при запуске с определенного сервера, IP-адрес которого, похоже, был помещен в ненадежный список.