GAS를 사용하여 도서관 사이트에서 자신이 빌린 책과 예약하는 책의 정보를 얻으려고했지만 포기했습니다.

개요



GAS를 시도했다.
GAS를 사용하여 도서관 사이트에서 자신의 빌린 책과 예약하고 있는 책의 정보를 취득하려고 했지만 단념했다.
이유는 세션을 유지할 수 없습니다.
fetch 때마다 IP가 바뀌기 때문에? (다른 원인이 있을 수 있음)

소개



GAS에 흥미 있고 조금 만져 보았다.
간단한 일을하는 사람의 사이트를 참고로 몇 가지 시도해 보았다.
전부터 하고 싶었던, 도서관의 사이트의 스크래핑도 시험해 보았다.

시험에 Google Sheets에서 GAS



시도에 Google Sheets에서 GAS 사용 연습을 해 보았다.

이 사람을 보고, 모방해 본다.
【GAS 초급자용】Google Apps Script로 바이트의 급여를 예측하는 앱을 만들자 - Qiita
시간을 측정하고 싶지는 않기 때문에, 이벤트명만 표시하는 함수로 해 보았다.

코드는 이런 느낌.

code.gs
function myFunction() {
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getActiveSheet();
  var myCal = CalendarApp.getCalendarById('xx@yy'); 
  var today = new Date();
  var date = today.setDate(1);
  var startDate = new Date(date);
  var endDate = new Date(date);
  endDate.setMonth(endDate.getMonth()+1);
  myEvents = myCal.getEvents(startDate,endDate);

  for (var i in myEvents) {
    var title = myEvents[i].getTitle();
    objSheet.getRange(i+1,1,1,1).setValue(i); 
    objSheet.getRange(i+1,2,1,1).setValue(title); 
  }
}

작업 화면은 이런 느낌.



결과는 이런 느낌.
왜인지, 10행마다 입력된다. 왜?



이런 느낌으로 쓰면 제대로 한 줄씩 표시되는데, 왜? ?
var hoge = [10,11,12,13];
for (var i in hoge){
for (var i=1; i<4; i++){
  objSheet.getRange(i+1,1).setValue(i);
  objSheet.getRange(i+1,2).setValue(hoge[i]);
}

시험에 이메일 보내기



초보자도 간단! Google Apps Script에서 Gmail을 사용하여 이메일을 보내는 방법

이 사람의 코드를 복사.
순조롭게 움직였다.

GET하고 싶은 정보 얻기



Google App Script로 웹 스크래핑이 쉬웠습니다 - phicdy devlog
이 사이트를 참고로, 원하는 정보 취득했다.

자바스크립트 정규식 요약 - Qiita
정규식은 여기 확인했다.

로그인 세션을 유지하고 정보 획득


  • Form Authentication, keep session Google Apps Script - Stack Overflow
  • 【초보자용 GAS】 스크래핑을 위해 로그인 페이지에서 자동 로그인하는 방법 | Yokoji.work
  • GoogleSpreadSheet에서 스크래핑할 때 사이트에 로그인한 후 소스 가져오기 | katsulog

  • 여기를 참고로 쿠키를 보존해 시험해 보았지만, 잘 되지 않았다.

    Google 스프레드시트에서 GET/POST 통신을 통해 콘텐츠 얻기 - 소플라보 기술 블로그
    여러가지 시도해 본 후, 이 사이트에 도착했다.

    GoogleAppsScript는 서버측 언어이므로 서버측에서 실행됩니다. fetch마다 서버의 IP 주소가 바뀌는 사양인 것처럼 세션을 유지해야 하는 사이트에 접속하고 일련의 처리를 하려고 해도 IP 주소가 바뀌어 동일 세션으로 취급되지 않으므로 주의 제발.

    이것 탓인 것 같다. 브라우저와 서버에서, 쿠키뿐만 아니라, authenticity_token 라는 것을 교환하고 있는 것 같고, 그것이 바뀌어 버리고 있지 않을까 생각한다. 반, 상상 화상.
    디버그 환경을 잘 모르기 때문에, 조사하기의 힘들 것 같다. 그래서 포기했다.

    일단, 시행착오의 결과의 코드를 둡니다.
    function getKobeLibInfo(){
      var url = 'https://www.lib.city.kobe.jp/opac/opacs/mypage_display';
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');
    
      var reg = /<input type="hidden" name="authenticity_token" value="(\S*)" \/>/i;
      var match = reg.exec(html);
    
      var cookies = response.getAllHeaders()['Set-Cookie']; 
      session_cookie = cookies[0].split( ';' )[0];
      Logger.log(session_cookie);
      cookies = "locale=ja; cokkie=opac_server2; searchkan=all; " + session_cookie;
      //  Logger.log(match[0]);
      var auth_token = match[1];
      Logger.log(match[1]);
    
      var payload = {
        'utf8': '',
        'user[login]': 'xxx',
        'user[passwd]': 'yyy',
        'act_login': 'ログイン',
        'nextAction': 'mypage_display',
        'prevAction': '',
        'prevParams': '',
        'kobeid': '',
        'pvolid': '',
        'type': '',
        'shozo_kyk': '',
        'authenticity_token':auth_token
      };
    
      var headers = {'Cookie' : cookies,
                     'Connection': 'keep-alive',
                     'Content-Type': 'application/x-www-form-urlencoded'
                    };
    
      var options = {
        "method" : "post",
        "headers" : headers,
        "payload" : payload
      };
      response = UrlFetchApp.fetch("https://www.lib.city.kobe.jp/opac/opacs/login", options);
      Logger.log(response);
      var cookies = response.getAllHeaders()['Set-Cookie']; 
      session_cookie = cookies[0].split( ';' )[0];
      Logger.log(session_cookie);
      cookies = "locale=ja; cokkie=opac_server2; searchkan=all; " + session_cookie;
      // Logger.log(response);
      var headers = {'Cookie' : cookies,
                     'Connection': 'keep-alive',
                     'Content-Type': 'application/x-www-form-urlencoded'
                    };
    
      var options = {
        "method" : "get",
        "headers" : headers
      };
    
      var response = UrlFetchApp.fetch("https://www.lib.city.kobe.jp/opac/opacs/mypage_display", options);
    
      var html = response.getContentText('UTF-8');
    
      Logger.log(html);
    }
    

    결론



    상당히 노력했지만, 하고 싶은 일은 할 수 없었다.
    글쎄, 어쩔 수 없는가?
    다만, GAS 사용할 수 있게 되어 기쁘다.
    그 밖에도 여러가지 일에 사용할 수 있을 것 같다.

    좋은 웹페이지 즐겨찾기