Slack에서 반응을 할 때 트윗을 시도했습니다.

소개



비공개로 팀 개발을 하고 있습니다만, 동기를 유지하는 것은 어렵습니다.

동기 부여를 높이기 위한 시책으로서 지난번은 GitHub의 Webhook에서 풀 요청을 병합 할 때 트윗을 시도했습니다. 로 GitHub로부터 트윗을 하는 구조를 작성했습니다.
그리고, 이번은 Slack의 리액션으로부터 트윗할 수 있는 구조를 해설이 됩니다.

※주의점
현재 소스 코드는 상당히 복잡합니다.
적절히 수정할 예정이므로 최신 코드는 GitHub 보다 확인을 부탁드립니다.

동작 이미지



슬랙에서 댓글에 트위터의 반응을 통해 트윗을합니다.


지금부터 Qiita에 투고하는 기사를 쓰자! ! 열심히 💪 slack의 게시물입니다. - a6s-cloud (@CloudA6s) 2019년 5월 14일


구성



구성은 전회 쓴 「 GitHub의 Webhook에서 풀 요청을 병합 할 때 트윗을 시도했습니다. 」와 매우 유사한 구성이 됩니다. GitHub의 부분이 그대로 Slack로 변경되었을 뿐입니다.



이전에는 파이썬을 사용했으므로 이번에는 어쨌든 Node.js로 시도했습니다.





환경 구축



「Twitter API」와「lambda와 API Gateway의 설정」은 전회 써 GitHub의 Webhook에서 풀 요청을 병합 할 때 트윗을 시도했습니다. 를 참고해 주시면 됩니다.



Slack API 설정



Slack API에서 Slack App을 만듭니다.

요청 URL이지만 처음 인증할 때는 challenge 항목의 내용(토큰)을 응답으로 반환해야 합니다.



이벤트는 reaction_added를 등록합니다. (무언가의 반응을 할 때 발화됩니다)



설정에 관해서는 이 기사를 알기 쉬웠습니다.

AWS 초보자라도 알 수 있다! 브라우저에서 완결! AWS+Slack Event API를 사용한 Slack 봇 초입문





lambda 구현



slack api 사양에서 3초 이내에 응답을 반환하지 않으면 다시 요청이 발생합니다.



이번에는 외부 API를 호출하고 있기 때문에 응답 시간이 5초 정도 걸려 재시도 실행되어 버렸습니다.

응답을 돌려주는 lambda와 비동기 실행하는 lambda를 준비하는 것으로 회피 가능하다고 합니다만, 이번은 실패를 허용하는 구현으로 하고 있습니다. .

※적절히 수정할 예정이므로, 최신의 코드는 GitHub 보다 확인을 부탁합니다.



slack의 token은 설정 화면에서 확인할 수 있습니다.




exports.handler = (event, context, callback) => {
  // slack apiの仕様で3秒以内にレスポンスを返さなければ、再度リクエストを行う
  // 2回目のリクエストの場合は終了する
  if(event.headers["X-Slack-Retry-Num"]){
    console.log("リトライのため終了");
    console.log(event);
    callback(null, {statusCode: 200,body: JSON.stringify({ok:"ok"})});
    return;
  }

  // レスポンスからデータを取得
  const body = JSON.parse(event.body);
  console.log(event);
  console.log("channel:" + body.event.item.channel);
  console.log("latest:" + body.event.item.ts);
  console.log("reaction:" + body.event.reaction);

  // リアクションが「tweet」リアクション以外なら終了
  if(body.event.reaction !== 'tweet'){
    console.log("tweetリアクションではないので終了")
    callback(null, {statusCode: 200,body: JSON.stringify({ok:"ok"})});
    return;
  }

  const twitter = require('twitter');
  const twitter_client = new twitter({
      consumer_key: 'xxxxxxxxxxxxx',
      consumer_secret: 'xxxxxxxxxxxxx',
      access_token_key: 'xxxxxxxxxxxxx',
      access_token_secret: 'xxxxxxxxxxxxx'
  });

  // axios を require してインスタンスを生成する
  const axiosBase = require('axios');
  const axios = axiosBase.create({
    headers: {
      'Content-Type': 'application/json',
      'X-Requested-With': 'XMLHttpRequest'
    },
    responseType: 'json'  
  });

  // Slack APIからコメントを取得するためにパラメータを作成
  const queries = {
    token: "xxxxxxxxxxxxx",
    latest:body.event.item.ts,
    limit:1,
    inclusive:true,
    channel: body.event.item.channel
  };

  // Slack APIからコメントを取得
  axios.get('https://slack.com/api/conversations.history/',{params: queries})
    .then(res => {
      // 絵文字文字列を絵文字に変換
      // 使い方は「Node.jsで絵文字を扱うための、node-emojiライブラリの使い方」に書いています
      const emoji = require('node-emoji')
      const text = emoji.emojify(res.data.messages[0].text);
      console.log("ツイート文章")
      console.log(text);

      // twitter apiでtweetを行う
      twitter_client.post('statuses/update', {status: text + '\nslackからの投稿です。'},  function(error, tweet, response){
        if(error) {
            console.log('Twitter APIエラー.');
            console.log(error);
        }
        console.log('Twitter完了');
      });
    }).catch(err => 
      console.log(err);
  });

  callback(null, {statusCode: 200,body: JSON.stringify({ok:"ok"})});
  return;
};



참고 URL



Node.js에서 이모티콘을 처리하기위한 node-emoji 라이브러리 사용

GitHub의 Webhook에서 풀 요청을 병합 할 때 트윗을 시도했습니다.

AWS Lambda + Node.js에서 Twitter Bot 개발

AWS 초보자라도 알 수 있다! 브라우저에서 완결! AWS+Slack Event API를 사용한 Slack 봇 초입문

Slack의 Reaction Event에 따라 〇〇

Slack 게시물을 기반으로 Twitter 운영을 위해 GAS에서 일정한 반응 수에 도달한 Slack 메시지를 수집한 이야기

Slack Bot을 서버리스로 운용할 때의 타임아웃 대책【소기】

[AWS lambda] Slack Bot이 시간 초과로 여러 번 응답하는 것을 방지


좋은 웹페이지 즐겨찾기