javascript - (未经授权)从 localhost 请求时 - “node testRequest.js”时没有错误
问题描述
我正在抓取一个需要登录的网站。当我只运行本地测试功能来测试我的请求时,一切正常。
这是奇怪的部分。一切正常,当我在客户端运行我的脚本时,但是当它在我的本地主机服务器上的服务器端运行时,我在成功登录后得到一个错误。当我尝试向目标网站api。我得到的错误是:401(未经授权)错误。res msg 是:{Message: "Authorization has been denied for this request."}
我认为我试图抓取的网站正在阻止来自其他网站的外部 api 请求,这解释了当我在本地主机的服务器端运行脚本时出现的错误。
让我们假设是这种情况。我应该如何避免服务器从 corssorigin 阻止我的请求?
我在客户端运行它:https ://gyazo.com/ec8fb27ef9a679413eed04f5c4acf475
我在服务器端运行它:https ://gyazo.com/43096da6c5f381c0faa39ced92a0108c
请注意:在客户端运行脚本时一切正常,我没有收到任何错误,一切都按预期工作。
但是,当我从应用程序的服务器端运行完全相同的脚本时,事情开始变得很奇怪。我以某种方式能够成功登录,但此后我对其 api 的所有 GET 请求都会导致 401 未经授权的错误。
script.js - 随意使用我的用户名和密码登录。(缩进有点偏离。)
const Async = require('simplify-async').simpleAsync;
var request = require('request');
var request = request.defaults({jar: true, headers: {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"}});
const formData = {
username: 'zinuku.public@gmail.com',
password: 'Ryan1234',
grant_type: 'password'
};
const options = {
url: 'https://www.eovendo.com/token',
form: formData,
referer: 'https://www.eovendo.com/',
};
const callback = (err, res, body) => {
if (err) {console.log(err, 'FAILED'); return}
const info = JSON.parse(body);
console.log(info);
console.log('Succesfully logged in');
const getBalance = () => {
console.log('WE AR ENOW IN GET BALANCE');
const promise = new Async();
request.get({url: 'https://www.eovendo.com/api/Balance/GetBalance'}, (err, res, body) => {
if (err) promise.reject(err);
const balance = JSON.parse(body);
console.log('>>>', balance);
promise.resolve(balance)
});
return promise.promise;
};
getBalance()
.catch(err => console.log(err))
.then(res => {
console.log('balance func response, msg:', res)
});
};
const eo_login = (options) => {
request.post(options, callback);
};
eo_login(options);
解决方案
我在这里假设您已经登录到该服务,但是您没有正确地将会话 ID 发送给它。当您登录并执行请求时,请查看浏览器的网络选项卡,查看发送到服务器的内容和接收的内容。通过模仿您的用户浏览器和他们的服务器之间的通信,您将能够登录和爬网。但是,如果他们不想让您这样做,请不要这样做。
推荐阅读
- ios - Xcode 的 Build Options 中的 $VALIDATE_PRODUCT 标志做了什么样的验证?
- javascript - 如何优化我的功能不重复行?
- scheme - 在 Racket 程序中使用 Scheme 库
- python - Excel 中的 Oracle - 动态创建列类型
- amazon-web-services - AWS EC2 实例并通过 gmail SMTP 587 发送电子邮件
- c# - 是否可以使用 WPF 从 2D PNG 图像(高级形状)创建 3D 模型?
- http - 使用 http 或更好的 https 的 itemtype?
- python - Python从文件编码问题中读取
- java - addChildEventListener(Firebase)中的数组问题
- sql - 分组查询的历史