Скрипт Google для входа в систему, получения cook ie и получения CSV в листы - PullRequest
0 голосов
/ 06 мая 2020

Я могу получить повара ie с помощью curl -d "_u = user_name" -d "_p = password" --cook ie -jar ./cookie https://url.tologin.com/admin/login успешно, но не могу сделать то же самое с скриптом Google

function myFunction() {
  var payload = {"_u" : "user_name","_p" : "password"};
  var opt ={"payload":payload,"method":"post"};
  var response = UrlFetchApp.fetch("https://url.tologin.com/admin/login",opt);
  var headers = response.getAllHeaders(); 
  Logger.log(headers);
  var cookie = headers['Set-Cookie'];     
  Logger.log(cookie);
  Logger.log(response);
  response.getContentText();  

  var header = {'Cookie':cookie};

  var opt2 = {"headers":header};

  var pagedata = UrlFetchApp.fetch("https://url.tologin.com/admin/sales/order/export/csv",opt2);
  Logger.log(pagedata);
}

Я получаю ответ от веб-сервера с ошибкой страницы входа и не могу понять, что не так с скриптом Google

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Как написано в документации MDN , заголовок ie запроса должен иметь формат:

Cookie: name=value; name2=value2; name3=value3

Список пар имя-значение в форма <cookie-name>=<cookie-value>. Пары в списке разделяются точкой с запятой и пробелом (;).

Как написано в документации UrlFetchApp#HttpResponse , getAllHeaders() возвращает

Возвращает карту атрибутов / значений заголовков для ответа HTTP, с заголовками , которые имеют несколько значений, возвращаемых в виде массивов .

Когда массив неявно преобразуется в строку, он соединяется с помощью запятой ,, что не является допустимой строкой cook ie. Вы можете получить отформатированный заголовок cook ie из заголовка Set-cook ie, используя такую ​​функцию полосы:

const getCookie = setCookie =>
   Array.isArray(setCookie) 
    ? setCookie.map(getCookie).join("; ") //get each cookie and join them by ; 
    : setCookie.split("; ")[0]//get only the first part of cookie; remove irrelevant info like `Max-Age`, `expires` etc.
0 голосов
/ 09 мая 2020

У меня все работает

Скрипт GAS для

  1. Войдите в систему и загрузите Cook ie с помощью POST
  2. создайте newCook ie и используйте его в GET запросы
  3. Получить CSV и проанализировать его, чтобы при необходимости заменить разделители
  4. Загрузить содержимое CSV на активный лист

    function parseCsvResponse(csvString) {
        var retArray = [];
    
        var strLines = csvString.split(/\n/g);
        var strLineLen = strLines.length;
        for (var i = 0; i < strLineLen; i++) {
            var line = strLines[i];
            if (line != '') {
                retArray.push(line.replace(/"/g, "").split(/;/));
                //replace ; with separator from your CSV file
         }
        }
    
        return retArray;
    }
    
    function myFunction(sheet) {
      var payload = {'user_name' : 'username','password' : 'password'};
    //replace with values on your login page "name=user_name" and "name=password"
    //if your username contains @ send it directly or use %40 instead
      var opt ={
        'payload': payload,
        'method':'post',
        "followRedirects": false,
        "testcookie": 1
      };
      var response = UrlFetchApp.fetch("https://url.tologin.com/admin/login",opt);
      //inspect the right link via Chrome inspect of your login page
      Logger.log(response);
      Logger.log(response.getResponseCode());
      if ( response.getResponseCode() == 200 ) {
         // Incorrect user/pass combo
      } else if ( response.getResponseCode() == 302 ) {
        // Logged-in
        Logger.log("Logged in");
      var headers = response.getAllHeaders(); 
      Logger.log(headers);
      var cookies = headers['Set-Cookie'];
    // Extract the cookies from the login response
      var cookieParts = [];
      for (var i = 0; i < cookies.length; i++) {
        var arr = cookies[i].split('; ');
        cookieParts.push(arr[0]);
      }
    // Create a new cookie to send with subsequent requests
      var newCookie = cookieParts.join('; ');
      Logger.log(newCookie);
      };
    
    
      opt2 = {
        "method" : "get",    
        "headers": {
          "Cookie": newCookie
        }
      };
      var url = "https://url.tologin.com/admin/sales/order/export/csv";
      response2 = UrlFetchApp.fetch(url, opt2);
      var resp1=response2.getContentText();  
      var csvContent = parseCsvResponse(response2.getContentText());
      Logger.log(resp1);
      Logger.log(csvContent);
    // clear everything in the sheet
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.clearContents().clearFormats();
    
      // set the values in the sheet (as efficiently as we know how)
      sheet.getRange(1, 1, csvContent.length /* rows */, csvContent[0].length /* columns */).setValues(csvContent);
    }
    

затем

  1. Импортировать myFunction на лист «Инструменты> Макросы> Импорт»
  2. При первом запуске запрашивается проверка подлинности Google вашего приложения, где myFunction -
  3. Run myFunction »Инструменты> Макросы > myFunction "
  4. И вы получите правильно отформатированные данные CSV на свой лист
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...