为什么我的urlFetchApp功能未能成功登录

问题描述 投票:3回答:2

我试图使用谷歌Apps脚本登录到一个ASP.Net网站,并刮去一些数据,我通常不得不手动检索。我使用Chrome开发人员工具,以获得正确的有效载荷名称(TEXT_Username,TEXT_Password,_VIEWSTATE,_VIEWSTATEGENERATOR),我也得到了ASP网络会话ID与我的帖子请求一起发送。

当我运行我的功能(S),它返回一个响应代码= 200,如果followRedirects设置为false,如果followRedirects设置为true返回响应代码= 302。不幸的是在两种情况下做的功能验证成功的网站。相反,返回的HTML是登录页面。

我已经尝试了不同的标题变种和参数,但我似乎无法成功登录。

其他点的夫妇。当我使用开发工具做登录Chrome浏览器,响应代码似乎找到302。

有没有人对我怎样才能成功登录到这个网站的任何建议。你看在我的函数的任何错误,可能是我的问题的原因。我接受任何和所有的建议。

把我气的功能如下:

    function login(cookie, viewState,viewStateGenerator) {
    var payload =
       {
         "__VIEWSTATE" : viewState,
         "__VIEWSTATEGENERATOR" : viewStateGenerator,
         "TEXT_Username" : "myUserName",
         "TEXT_Password" : "myPassword",
       };
    var header = {'Cookie':cookie};
    Logger.log(header);  
      var options =
       {
         "method" : "post",
         "payload" : payload,
         "followRedirects" : false,
         "headers" : header
       };
      var browser = UrlFetchApp.fetch("http://tnetwork.trakus.com/tnet/Login.aspx?" , options);
      Utilities.sleep(1000);
      var html = browser.getContentText();
      var response = browser.getResponseCode();
      var cookie2 = browser.getAllHeaders()['Set-Cookie'];
      Logger.log(response);
      Logger.log(html);

      }

    function loginPage() {
      var options =
       {
         "method" : "get",
         "followRedirects" : false,
       };
      var browser = UrlFetchApp.fetch("http://tnetwork.trakus.com/tnet/Login.aspx?" , options);
      var html = browser.getContentText();
     // Utilities.sleep(500);
      var response = browser.getResponseCode();
      var cookie = browser.getAllHeaders()['Set-Cookie'];
      login(cookie);
       var regExpGen = new RegExp("<input type=\"hidden\" name=\"__VIEWSTATEGENERATOR\" id=\"__VIEWSTATEGENERATOR\" value=\"(.*)\" \/>");
     var viewStateGenerator = regExpGen.exec(html)[1];
     var regExpView = new RegExp("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"(.*)\" \/>");
    var viewState = regExpView.exec(html)[1];
    var response = login(cookie,viewState,viewStateGenerator);
  return response
      }

我通过运行loginPage()函数调用脚本。此功能得到的cookie(会话ID),然后调用登录功能,并沿会话ID(饼干)通过。

以下是我在当我登录使用谷歌的Chrome浏览器的谷歌开发者工具的网络部分中看到:

    Remote Address: 66.92.89.141:80
    Request URL: http://tnetwork.trakus.com/tnet/Login.aspx
    Request Method: POST
    Status Code:302 Found

    **Request Headers** view source
      Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate
    Accept-Language: en-US,en;q=0.8
    Cache-Control:max-age=0
    Connection:keep-alive
    Content-Length: 252
    Content-Type:application/x-www-form-urlencoded
    Cookie: ASP.NET_SessionId=jayaejut5hopr43xkp0vhzu4; userCredentials=username=myUsername; .ASPXAUTH=A54B65A54A850901437E07D8C6856B7799CAF84C1880EEC530074509ADCF40456FE04EC9A4E47D1D359C1645006B29C8A0A7D2198AA1E225C636E7DC24C9DA46072DE003EFC24B9FF2941755F2F290DC1037BB2B289241A0E30AF5CB736E6E1A7AF52630D8B31318A36A4017893452B29216DCF2; __utma=260442568.1595796669.1421539534.1425211879.1425214489.16; __utmc=260442568; __utmz=260442568.1421539534.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=190106350.1735963725.1421539540.1425152706.1425212185.18; __utmc=190106350; __utmz=190106350.1421539540.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
    Host:tnetwork.trakus.com
    Origin:http://tnetwork.trakus.com
    Referer:http://tnetwork.trakus.com/tnet/Login.aspx?
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36

    **Form Dataview** sourceview URL encoded
__VIEWSTATE: O7YCnq5e471jHLqfPre/YW+dxYxyhoQ/VetOBeA1hqMubTAAUfn+j9HDyVeEgfAdHMl+2DG/9Gw2vAGWYvU97gml5OXiR9E/9ReDaw9EaQg836nBvMMIjE4lVfU=
    __VIEWSTATEGENERATOR:F4425990
    TEXT_Username:myUsername
    TEXT_Password:myPassword
    BUTTON_Submit: Log In

更新:看来,该网站使用的HttpOnly的cookie。因此,我不认为我捕捉整个饼干,因此我的头是不正确的。因此,我认为我需要followRedirects设置为false,并手动处理重定向和饼干。我目前正在研究这个过程,但任何人谁一直沿着这条道路欢迎输入。

asp.net google-apps-script urlfetch
2个回答
2
投票

我注意到,提供Chrome的有效载荷包括BUTTON_Submit: Log In但你POST有效载荷没有。我发现,对于POSTs气体事情更加顺利,如果我明确地设置submit变量在我payload对象。在任何情况下,如果你想效仿Chrome正在做什么,这是一个良好的开端。

所以你的情况,这是一个行变化:

var payload =
   {
     "__VIEWSTATE" : viewState,
     "__VIEWSTATEGENERATOR" : viewStateGenerator,
     "TEXT_Username" : "myUserName",
     "TEXT_Password" : "myPassword",
     "BUTTON_Submit" : "Log In"
   };

2
投票

我终于能够成功登录到该页面。这个问题似乎是在urlFetchApp无法跟随重定向。我贷记本计算器职位:how to fetch a wordpress admin page using google apps script

这篇文章描述了以下过程,使我成功登录:

  1. 设置followRedirect为false
  2. 提交后,并捕获饼干
  3. 使用捕捉饼干发出具有适当的URL的获取。

下面是相关的代码:

var url = "http://myUrl.com/;
   var options = {
      "method": "post",
      "payload": {
      "TEXT_Username" : "myUserName",
      "TEXT_Password" : "myPassword",
      "BUTTON_Submit" : "Log In",
      },
      "testcookie": 1,
      "followRedirects": false
   };
   var response = UrlFetchApp.fetch(url, options);
   if ( response.getResponseCode() == 200 ) {
     // Incorrect user/pass combo
   } else if ( response.getResponseCode() == 302 ) {
     // Logged-in
     var headers = response.getAllHeaders();
     if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
        // Make sure that we are working with an array of cookies
        var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
        for (var i = 0; i < cookies.length; i++) {
           // We only need the cookie's value - it might have path, expiry time, etc here
           cookies[i] = cookies[i].split( ';' )[0];  
        };

        url = "http://myUrl/Calendar.aspx";
        options = {
            "method": "get",
            // Set the cookies so that we appear logged-in
            "headers": {
               "Cookie": cookies.join(';') 
            }
        }
      ...
© www.soinside.com 2019 - 2024. All rights reserved.