Slack에서 반응을 할 때 트윗을 시도했습니다.
소개
비공개로 팀 개발을 하고 있습니다만, 동기를 유지하는 것은 어렵습니다.
동기 부여를 높이기 위한 시책으로서 지난번은 GitHub의 Webhook에서 풀 요청을 병합 할 때 트윗을 시도했습니다. 로 GitHub로부터 트윗을 하는 구조를 작성했습니다.
그리고, 이번은 Slack의 리액션으로부터 트윗할 수 있는 구조를 해설이 됩니다.
※주의점
현재 소스 코드는 상당히 복잡합니다.
적절히 수정할 예정이므로 최신 코드는 GitHub 보다 확인을 부탁드립니다.
동작 이미지
슬랙에서 댓글에 트위터의 반응을 통해 트윗을합니다.
지금부터 Qiita에 투고하는 기사를 쓰자! ! 열심히 💪 slack의 게시물입니다. - a6s-cloud (@CloudA6s) 2019년 5월 14일
구성
슬랙에서 댓글에 트위터의 반응을 통해 트윗을합니다.
지금부터 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이 시간 초과로 여러 번 응답하는 것을 방지
Reference
이 문제에 관하여(Slack에서 반응을 할 때 트윗을 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/turmericN/items/23c86d70aae3dd8bfc77텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)