0

我有一个需要使用 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();
4

0 回答 0