【GAS】Twitter 리스트의 갱신분을 Gmail에 보낸다

왜 만들려고 생각했는가?



원래는 RSS 리더를 GAS로 구현하려고 생각했습니다만, 만드는 것이 의외로 번거롭고 RSS의 URL 끌어 오는 것도 귀찮았기 때문에 Twitter의 List를 RSS 대신에 사용하려고 하게 되었습니다.
Twitter 사용하면 좋지 않다고 됩니다만, Twitter는 흘려 보는 것이 어려운 것과 갱신분을 모르기 때문에 메일로 했습니다.
LINE이나 Slack로 하고 싶은 분은 API 사용해 주세요.

우이


  • Twitter 목록 등록
  • 하루에 한 번 그 목록의 갱신 분이 메일로 보내진다
  • 링크 클릭으로 사이트 열기

  • 최단 1분에 1회 실행할 수 있다고 생각하므로 자주 갱신 확인하고 싶은 분은 조정해 주세요.
    메일은 이런 느낌입니다.


    처리 흐름


  • Twitter의 특정 목록로드
  • 시간별로 필터링하여 업데이트 분만 가져오기
  • 메일문에의 성형
  • 메일 보내기

  • 출처



    Twitter 인증은 참고 자료 1 또는 참고 자료 2를 참조하십시오.
    
    // 認証用インスタンス
    var twitter = TwitterWebService.getInstance(
      //必要なライブラリ 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF
      'aaa', // 作成したアプリケーションのConsumer Key
      'bbb'  // 作成したアプリケーションのConsumer Secret
    );
    
    // 認証
    function authorize() {
      twitter.authorize();
    }
    
    // 認証解除
    function reset() {
      twitter.reset();
    }
    
    // 認証後のコールバック
    function authCallback(request) {
      return twitter.authCallback(request);
    }
    
    var service  = twitter.getService();
    
    function getListTweets(listName, userName, count, retweet) {
      return JSON.parse(service.fetch('https://api.twitter.com/1.1/lists/statuses.json?slug='+ listName +
                                      '&owner_screen_name=' + userName +
                                      '&count=' + count +
                                      '&include_rts=' + retweet));
    }
    
    function getHtmlBodyFromListUpdate(listName, userName, periodHour) {
      //@userNameのlistNameリストを200ツイート分読み込む、リツイートはなし(false)
      return getListTweets(listName, userName, 200, false)
      .filter(function(x) { 
        //periodHour時間以内のツイート取得。x.created_atは東京時間ではないがnew Dateが
        //勝手に東京時間にしてくれる、えらい。getTime()でミリ秒取得
        return new Date(x.created_at).getTime() > new Date().getTime() - periodHour * 60 * 60 * 1000
      }).map(function(x) { 
        //ツイート内部の改行削除
        return x.text.replace(/\n/g, '') 
      }).reduce(function(acc, cur) { 
        //見た目の処理。URLが2つある場合は最初のURLが使用される。残りは消える。
        const url = pullUrls(cur)[0];
        return acc + '<li><a href=' + url + '>'  + removeUrls(cur) + '</a></li><br>' 
      }, '<ol>') + '</ol>';
    }
    
    //文字列内のURLをすべて取得する。返り値は配列
    function pullUrls(str) {
      const urls = str.match(/(http(s)?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/gi);
      return (urls == null) ? [] : urls;
    }
    //文字列内のURLをすべて削除する。返り値はURLのなくなった文字列
    function removeUrls(str) {
      return str.replace(/(http(s)?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/gi, "");
    }
    
    function main() {
      const htmlBody = getHtmlBodyFromListUpdate('listName', 'userName', 24)
      GmailApp.sendEmail('[email protected]', 'ニュースまとめ', '', {htmlBody: htmlBody})
    }
    

    후기



    설정한 시간 내의 트윗이 200 이상이면 누출이 나온다. 이것은 API의 사양이므로 어쩔 수 없다. 실행 시간을 가속화하십시오. (periodHour 변경)
    뉴스 체크를 위해 만들었으므로, 트윗 내에 링크가 있는 전제로 쓰고 있습니다. 링크 없는 트윗도 문제 없게 움직인다고 생각합니다만, 무효인 링크가 붙여지므로 적당하게 수정해 주세요.

    참고 자료


  • Google Apps Script (GAS)로 Twitter에 게시하는 기능만 구현해 보세요.
  • GAS에서 Twitter 게시 및 타임라인 획득
  • GET lists/statuses — Twitter Developers
  • 좋은 웹페이지 즐겨찾기