GoogleAppsScript에서 Twitter 이미지 수집

이 기사는이 기사는 마이넷 Advent Calendar 17 일째 기사입니다.
7일째 도 썼습니다 @w_cota 가 보내 드리겠습니다.

소개



당사 Advent Calendar 8일째 에서 @ ぺ와 _t 도 말씀 드렸습니다만 당사에서는 효율화 등 다양한 목적으로 Spreadsheets를 비롯한 많은 Google Apps를 이용하여 운영하고 있습니다.
사내에서도 운영에 관련된 KPI 지표이며 이벤트 스케줄 나름을 Spreadsheets 등으로 관리하고 있으며, 이들을 효율화하기 위해 사내 엔지니어는 GoogleAppsScript(이하 GAS)를 활용하여 편리 스크립트 등을 쓰고 있습니다만, 나는 거의 GAS를 만지지 않았다.
거기서 이번 이런 기회도 얻은 것이고 일념 발기, 우선은 GAS를 만져 보지 않을까 하는 것으로 완전하게 취미의 스크립트를 써 보았으므로 그 소개 등.

개요



GAS와 TwitterAPI를 이용하여 특정 사용자의 타임라인에 게시된 이미지를 오로지 수집합니다.
수집한 이미지는 Spreadsheets에 URL을 내보내고 GoogleDrive에 저장합니다.

구현



코드.gs
// OAuth1認証
var twitter = TwitterWebService.getInstance(
  'consumer_key',
  'consumer_secret'
);

// Twitter認証
function authorize() {
  twitter.authorize();
}

// コールバック
function authCallback(request) {
  return twitter.authCallback(request);
}

// 特定ユーザのタイムラインを取得
function getUserTimeline() {

  // 書き込み先のスプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var as = SpreadsheetApp.getActiveSheet();

  // 現在のシートの状態を確認
  var col = as.getLastRow() + 1;
  var urls = as.getRange(1, 1, col).getValues();

  // 画像を保存するドライブのフォルダを指定
  // https://developers.google.com/apps-script/reference/drive/folder
  var folder = DriveApp.getFolderById('画像を保存するGoogleDriveのフォルダID');

  // TwitterAPIでタイムラインを取得してJSONパース
  // https://dev.twitter.com/rest/reference/get/statuses/user_timeline
  var twitter_id = 'タイムラインを取得したいTwitterID';
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='+twitter_id);
  var tweets = JSON.parse(response);

  var url, is_duplicate, tweet, imageBlob;

  or (var i=0; i<tweets.length-1; i++) {

    is_duplicate = false;
    tweet = tweets[i];

    // 写真が添付されているツイートのみピックアップ
    if (tweet.entities.media!=undefined && tweet.entities.media[0].type=='photo') {

      // ツイートに添付されている枚数分だけ繰り返す
      for(var k=0; k<tweet.extended_entities.media.length; k++) {

        // JSONから画像のURLを取得
        url = tweet.extended_entities.media[k].media_url;

        // 写真のURLが重複しているかどうかチェック
        for (var j=0; j<col; j++) {
          if (urls[j][0] == url) {
            is_duplicate = true;
            break;
          }
        }

        // 重複していなかったらシートへ書き込み
        if(!is_duplicate) {
          as.getRange(col, 1).setValue(url);
          col++;
          urls = as.getRange(1, 1, col).getValues();

          // ドライブにアップロード
          // https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
          imageBlob = UrlFetchApp.fetch(url).getBlob();
          folder.createFile(imageBlob);
        }
      }
    }
  }
}

이번 주안으로는 GAS를 사용해 보는 것이 목적이었으므로, TwitterAPI에의 액세스는 yoshiyuki-hirano님의 이 글 로 소개되고 있습니다 라이브러리를 사용시키고 받았습니다.
  • 쓰기 대상의 Spreadsheet, sheet, 쓰기를 행하는 행과 지금까지 들어있는 데이터를 취득
  • 이미지를 저장할 GoogleDrive 폴더를 가져옵니다
  • TwitterAPI를 통해 타임 라인 얻기 및 퍼스
  • 트윗 내용물 씻기
  • 트윗에 이미지가 첨부되어 있는지 확인
  • 첨부되어 있으면 이미지의 URL을 취득
  • 현재 시트에 동일한 URL의 사진이 없는지 확인
  • 없으면 시트에 URL 저장 & 드라이브의 지정 폴더로 업


  • 그리고 이상과 같이 내용으로서는 매우 간단하게 되어 있다고 생각합니다.
    마지막으로 getUserTimeline 함수가 정기적으로 움직이도록 GAS에서 설정합니다.
    ※ 실행간격은 API의 상한을 넘지 않도록 && 줍고 싶은 유저의 TL의 속도와 합치고


    나중에 적당히 기다리고 있으면 ...


    이 거리!
    제대로 드라이브에 업로드되었습니다.


    이것이 어떻게 스마트 폰 앱의 운영에 연결되는지는 스스로도 모르겠지만 우선 생각해 낸 것을 형태로 할 수 있어서 좋았습니다.

    주요 개선점


  • 다른 앱에 업로드 된 이미지를 선택하고 싶습니다
  • 하나의 트윗에 대해 여러 개의 이미지가 연결되어 있으면 두 번째 이미지를 얻을 수 없습니다

  • 가끔 오류를 뱉고 있습니다.
  • 대응 및 코드 수정


  • 주의점



    여기까지 쓰고 있습니다만, 자신 이외의 Twitter에 흐르고 있는 화상을 GoogleDrive에 올리거나, 저작권이 되어 초상화권이 되어 귀찮은 생각이 들기 때문에 빡빡하지 않는 것이 좋다고 생각합니다.

    참고 자료



    htp // 요시유키-히라노. 하테나 bぉg. jp/엔트리/2015/10/13/010317
    htp : // bg. 히카 69. 이 m/bぉg/2014/01/28/굉장히 ぇ- psssc리 pt/
    htps : //에서 ゔぇぺぺrs. 오, ぇ. 코 m / 아 ps-sc 리 pt / 레후 렌세 / sp 라 d ぇ t /
    htps : //에서 v. 라고 r. 코 m / 레 st / 푸 b c

    좋은 웹페이지 즐겨찾기