Qiita의 새로운 트렌드를 놓치고 싶지 않으므로 Slack에 기록했습니다.

13991 단어 슬랙slackbotgas
매일 빠뜨리지 않고 Qiita에 와서는 보고 있습니다만, 바쁘거나 놓쳐 버리는 것이 자주 있기 때문에, 놓쳐도 좋도록 Slack에 기록하도록(듯이) 했습니다
그렇다고 보는 것을 소홀히해서는 안됩니다.

이용한 기술, 툴 등


  • Google Apps Script(이하, GAS)
  • Slack
  • Incoming Webhooks


  • 기본 흐름


  • GAS에서 Qiita의 톱 페이지를 스크래핑합니다
  • new 태그가 붙어있는 기사의 URL과 기사명을 Slack의 메세지 형식으로 가공합니다.
  • Slack의 Incoming Webhooks를 통해 Slack에 기록합니다.

    슬랙



    GAS로부터 메시지를 받기 위해 새로 설정을 추가 웹 훅스에 추가하십시오.
    Incoming Webhooks를 아직 Slack에 도입하지 않은 분은 여기에서
    게시 시점이면 "Incoming"에서 맨 위에 표시됩니다.


    추가하면 ↓과 같이 표시되므로 "설정 추가"에서 실제로 설정을합니다.


    「설정 추가」를 누르면, 투고처의 채널을 설정하는 화면이 나오므로, 적당한 채널명을 설정해 인테그레이션을 추가합니다
    이 때 Webhook URL이 생성되지만 GAS에서 사용하므로 어딘가에 복사하십시오.

    슬랙 설정은 이상입니다.

    GAS



    GAS 파일을 만들고 다음 소스를 복사합니다.
    
    function doPost() {
      // Qiitaのトップページから取得
      var url = 'https://qiita.com/';
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');
    
      // getTextでSlackに表示する文章を作成
      postSlack(getText(html));
    }
    
    // SlackのTextに設定する文字列を作成
    function getText(html) {
      var text = '現在の新着トレンド記事\n';
      // 新着タグが付くときの条件
      var searchHtml = 'isNewArrival":true';
      var firstIndex = html.indexOf(searchHtml);
      var secondIndex = html.indexOf(searchHtml, firstIndex + 1)
    
      while(firstIndex != html.length) {
        // 新着タグから次の新着タグまでをごっそり抽出
        var str = html.substring(firstIndex, secondIndex);
        var itemUrl = getItemUrl(str);
        var itemName = getItemName(str);
        // Slackのtext部分を加工
        // <url|表示名>で,表示名にリンクを付与することができます
        text = text + '・<' + itemUrl + '|' + itemName + '>\n';
    
        // 新着タグのインデックスを更新
        var firstIndex = secondIndex;
        var secondIndex = html.indexOf(searchHtml, firstIndex + 1);
    
        // 一番最後の新着タグでマイナス(検索できなかった)は困るので,htmlの長さまでとする
        if (secondIndex == -1) {
          secondIndex = html.length;
        }
      }
    
      return text;
    }
    
    // ここから下のgetメソッド群は,&quot;でセパレートして,該当のインデックスを取得してます
    function getUserId(str) {
      var searchHtml = '&quot;';
      var strs = str.split(searchHtml);
      return strs[28];
    }
    
    function getItemId(str) {
      var searchHtml = '&quot;';
      var strs = str.split(searchHtml);
      return strs[18];
    }
    
    function getItemName(str) {
      var searchHtml = '&quot;';
      var strs = str.split(searchHtml);
      return strs[14];
    }
    
    function getItemUrl(str) {
      return 'https://qiita.com/' + getUserId(str) + '/items/' + getItemId(str);
    }
    
    function postSlack(text) {
      var url = 'インテグレーションを追加したときに生成されたWebhook URL';
      var username = 'Slackに投稿するときのユーザー名';
      var jsonData = {
        "username": username,
        "text": text
      };
    
      var payload = JSON.stringify(jsonData);
      var options = {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };
    
      UrlFetchApp.fetch(url, options);
    }
    
    doPost 메서드를 이동하면 Slack의 Incoming Webhooks에서 설정한 채널에 게시됩니다.


    GAS 정기 실행



    이대로는 doPost는 의도적으로 움직이지 않으면 Slack에 게시되지 않으므로 정기 실행하도록 설정합니다.
    Qiita의 갱신 시각은 대략 5:00과 17:00이므로, 여유를 보고 6:00과 18:00에 투고하도록 설정합니다
    GAS 편집 화면에 ↓와 같은 시계 아이콘이 있지만 여기에서 정기 실행 설정을 할 수 있습니다.

    클릭하여 열면 "트리거 만들기"라는 버튼이 있으므로 거기에서 트리거를 추가합니다.
    설정하는 부분은 ↓의 노란색 선을 그린 곳입니다.

    ↓와 같이 설정을 변경합니다.
  • 시간 기반 트리거 유형을 선택을 "날짜 기반 타이머"로 변경
  • 시각을 선택을 「오전 6시~7시」로 변경(스쿠쇼에서는 시간의 간격을 선택(시간)이 되어 있습니다만, 일자 ​​베이스의 타이머로 변경하면 바뀝니다)
  • (GAS의 doPost 메서드 이름을 변경 한 경우) 실행할 함수를 선택하고 변경 한 후 메서드 이름으로 변경

  • 투고 일시로는, 아직 이 동작 확인은 하고 있지 않습니다만, 어쩌면 움직입니다(움직이고 문제 없으면, 여기는 바꿔 둡니다)

    끝에


  • 초돌관 공사로 작성했으므로, 특히 스크래핑 후의 문자열 가공은 좀 더 좋은 느낌으로 하고 싶다···
  • 라고 할까, 신착 태그로부터 신착 태그까지 괄호 빼고 있으므로, 사이에 신착 태그가 붙지 않은 기사라든지가 있어, 약간의 잠재 버그···

  • 그렇다고는 해도, Qiita의 신착 트렌드는 놓쳐도 괜찮은 상태가 되었습니다
  • 또한 기사의 필자명과 링크나 태그의 부여 등을 할 수 있을 것 같다


  • 그렇다고 보는 것을 소홀히해서는 안됩니다.
  • 소중하고 자계를 담아 두 번 썼습니다


  • 참고 사이트



    Formatting messages | Slack

    좋은 웹페이지 즐겨찾기