我正在尝试从Instagram JSON端点获取某个位置的最新媒体:https://www.instagram.com/explore/locations/214991417/?__a=1
。这要求客户端进行有效的身份验证会话,但我很难想出如何做到这一点。
这是我目前的尝试:
var request = require('request').defaults({jar: true});
var cheerio = require('cheerio');
var uri = "https://www.instagram.com/accounts/login/?force_classic_login";
request(uri, function(error, response, body){
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
var csrf = $("#login-form > input").attr("value");
var cookie = response.headers['set-cookie'];
request.post({uri: uri,
form: {
"username": "myinstauser",
"password": "myinstapass"
},
headers:{
'User-Agent': "bob",
"Cookie": cookie,
"x-csrftoken": csrf
}
}, function(err, response, body){
console.log(body);
});
}
});
但是回复是一个包含以下消息的页面:
无法加载此页面。如果您在浏览器中禁用了cookie,或者您正在私密模式下浏览,请尝试启用cookie或关闭私有模式,然后重试您的ac 灰。
不确定是否有更简单的方法,但不知怎的,我之前登录过。也许我手动验证或者我在玩游戏时使用的另一个插件做了但是我想找到最好的方法来做到这一点,我上面做的半邋way的方式感觉非常hacky。
使用实际的API是不可能的,因为我需要申请完全访问而不是Sandbox模式,而且我的使用违反了他们的政策。
更新
这是我目前的代码:
var request = require('request').defaults({jar: true});
var Cookie = require('request-cookies').Cookie;
var uri = "https://www.instagram.com/accounts/login/ajax/";
var csrf_token, cookie_string;
request.post({
uri: uri
}, function(error, response, body){
var rawcookies = response.headers['set-cookie'];
for (var i in rawcookies) {
var cookie = new Cookie(rawcookies[i]);
if (cookie.key == "csrftoken")
csrf_token = cookie.value;
}
cookie_string = response.headers["set-cookie"];
request.post({
uri: uri,
formData: {
username: "instauser",
password: "instapass"
},
headers: {
"referer": "https://www.instagram.com/",
"accept": "*/*",
"Accept-Language": "en-GB,en;q=0.8",
"cache-control": "no-cache",
"content-length": "40",
"Content-Type": "application/x-www-form-urlencoded",
"cookie": cookie_string,
"origin": "https://www.instagram.com",
"pragma": "no-cache",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"x-csrftoken": csrf_token,
"x-instagram-ajax": "1",
"X-Requested-With": "XMLHttpRequest"
}
}, function(error, response, body){
console.log(body);
});
});
此代码返回未找到页面的HTML或以下响应:
{"user": "", "authenticated": false, "status": "ok"}
它回应的看似随机。我可以继续运行脚本,并且它有可能感觉到50/50 ......