我有一个需要使用 curl 连接的站点。它需要一个两步过程:登录,然后发出数据请求。我已经实现了一个从 ubuntu 命令行运行的 shell 脚本,它可以工作。第一步创建一个 cookie 文件,第二步使用该 cookie 文件。
但是,我的实际要求是使用节点在 Javascript 中复制此功能,而无需访问 shell。我已经安装了node-libcurl,并且可以登录,但是数据请求失败了:代码:401,原因:'未授权'。我尝试了许多 setOpt 组合,但没有任何效果。我找到的几个例子都没有工作。在大多数配置中,登录步骤创建一个 cookie,然后数据步骤创建它自己的 cookie。下面的代码示例确实将 cookie 从 Login 传递到 Data,但它仍然失败并出现相同的错误。任何帮助,将不胜感激。谢谢。
const cookie = 'cookie.txt';
function doLogin(){
var Curl = curlLib.Curl;
var curlLogin = new Curl();
curlLogin.setOpt( 'URL', "www.xyz.com/ajaxauth/login" );
curlLogin.setOpt( 'COOKIEFILE', cookie );
curlLogin.setOpt( 'COOKIEJAR', cookie );
curlLogin.setOpt( 'USERNAME', '<username>' );
curlLogin.setOpt( 'PASSWORD', '<password>' );
// curlLogin.setOpt( 'VERBOSE', true );
curlLogin.setOpt( 'FOLLOWLOCATION', true );
curlLogin.on( 'end', function( statusCode, body, headers ) {
console.log("CurlLoginOk")
console.info(" Stat: ", statusCode );
console.info(" BLen: ", body.length );
console.info(" Head: ", headers );
console.info(" Time:", this.getInfo( 'TOTAL_TIME' ) );
var cookieInfo = headers[1]['Set-Cookie'][0];
console.log(cookieInfo)
getData(cookieInfo);
// this.close();
});
curlLogin.on( 'error', function ( err, errCode ) {
console.log("CurlLoginError", errCode, err)
this.close();
});
curlLogin.perform();
}
function getData(cookieInfo){
var Curl = curlLib.Curl;
var curlData = new Curl();
curlData.setOpt( 'URL', "www.xyz.com/<path to data>" );
// curlData.setOpt( 'COOKIE', cookieInfo );
curlData.setOpt( 'COOKIEFILE', cookieInfo );
curlData.setOpt( 'COOKIEJAR', cookieInfo );
// curlData.setOpt( 'COOKIEFILE', cookie );
// curlData.setOpt( 'COOKIEJAR', cookie );
// curlData.setOpt( 'VERBOSE', true );
curlData.setOpt( 'FOLLOWLOCATION', true );
curlData.on( 'end', function( statusCode, body, headers ) {
console.log("CurlDataOk")
console.info(" Stat: ", statusCode );
console.info(" BLen: ", body.length );
console.info(" Head: ", headers );
console.info(" Time:", this.getInfo( 'TOTAL_TIME' ) );
this.close();
});
curlData.on( 'error', function ( err, errCode ) {
console.log("CurlDataError", errCode, err)
this.close();
});
curlData.perform();
}
function getOrbData(){
doLogin();
}
getOrbData();