자동화를 위한 자동화
회사 앞에 한식 뷔페 식당이 있던 적이 있다.(함바집) 요즘은 이런 식당도 트랜드를 타는 건지 사장님이 매일 아침에 점심 메뉴를 인스타에 올려 주셨었고 우리는 점심 메뉴에 따라 한식 뷔페에서 먹을지 아니면 다른 식당에 가서 먹을지를 고민 했어야 됐었다. 점심을 사먹어야 되는 모든 회사에서 먹고 사는 문제에 대한 중차대한 일이었기 때문에 부장님은 막내에게 식당 메뉴가 무엇인지 물어보곤 하셨다.
정확하지는 않지만 10시 내외로 메뉴가 인스타 그램에 업로드가 됐기 때문에 점심 메뉴를 스크래핑해서 알려주는 슬랙 api를 만든다면 인스타 그램을 확인하여 공유를 하는 절차가 30초 정도 소요 된다고 했을 때 시간이 누적되면 결국에는 슬랙 api를 만드는 일이 효율적이라고 생각 했다.
인스타 확인 시간 * 연 평균 출근일 = 연 평균 점심을 위한 인스타 확인 시간
30s * 250 / 3600 = 2H
그렇다 2시간 내에 슬랙 api를 설정하고 스케쥴 기능을 만든다면 1년 이상 사용 했을 경우 api를 만드는 쪽이 더 효율적이다! 심지어 점심을 확인하기 위해서 인스타 피드를 확인이라도 하게 된다면 이로 인해 상실 되는 업무 능률까지 생각했을 때 어마어마한 차이를 보일 것이다!
Slack App 만들기
2024.03.22 - [프로그래밍/ToyProject] - Slack 을 막 시작한 당신이 몰라도 좋을 Slack Bot 사용해보기
Slack 을 막 시작한 당신이 몰라도 좋을 Slack Bot 사용해보기
Slack api 생성 https://api.slack.com/ Slack은 생산성 플랫폼입니다 Slack은 팀과 커뮤니케이션할 수 있는 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다. slack.com 'Your apps' 선택 '
code-mark.tistory.com
Slack App을 만들었으면 App이 메세지를 보낼 채널에 추가가 되어 있어야 한다.
채널 설정에서 위에서 만든 App을 추가를 한다.
사용 라이브러리
보통 이러한 간단히 프로그램은 python으로 작성하긴 하지만 nodeJS로 작성을 했다. 어차피 뭘로 만들던 상관은 없는데 중요한 것은 SlackAPI 라이브러리가 제공이 되느냐 이다. 왠만한 언어들은 다 제공이 될 것이기 때문에 취향껏 하도록 하자.
"@slack/web-api": "^7.0.1",
"dotenv": "^16.4.5",
"node-schedule": "^2.1.1",
"puppeteer": "^21.10.0"
사용한 라이브러리는 위와 같다. 다른건 일반적인 라이브러리이고 puppeteer은 crawl 할 때 많이 쓴다고 한다.
Puppeteer | Puppeteer
Build status
pptr.dev
구현해야 될 기능
원하는 프로그램 동작을 위해서는 다음과 같은 기능이 필요하다.
- 일정한 시간에 맞춰서 동작해야 되는 job schedule
- 웹 스크래핑
- Slack API 요청
Slack API 요청
슬랙에 API를 요청하기 위해서는 Slack App을 먼저 생성을 하고 그 다음 채널이 생성 되어 있어야 한다. 우리가 필요한 정보는 OAuth Token과 Channel ID 이다.
OAuth Token은 api.slack.com에서 얻을 수 있다.
Channel ID의 경우에는 슬랙 채널 설정에서 확인 할 수 있다.
Slack Token을 기반으로 WebClient를 생성 후에 ChannelID로 구별 되는 채널에 메세지를 전송한다.
import { WebClient } from '@slack/web-api';
const slackToken = process.env.SLACKTOKEN;
const channelId = process.env.CHANNELID;
const web = new WebClient(slackToken);
const result = await web.chat.postMessage({
channel: channelId,
text: `식당 - ${today}`,
blocks: [
{
type: 'image',
image_url: imageURL,
alt_text: '식당 메뉴'
}
]
});
웹 스크래핑
puppeteer를 활용한 웹 스크래핑이다.
async function scrapeLatestPostImage() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(process.env.TARGETURL);
//page.goto 는 페이지 접근에 대한 동작만 하기 때문에 유휴시간이 없을 경우에 image 를 못 가져 올 수 있음.
await sleep(2000);
// 첫 번째 게시물의 이미지 URL 추출
const imageUrl = await page.$eval('article > div img', img => img.src);
await browser.close();
return imageUrl
}
job schedule
node-schedule을 활용하여 job schedule을 구현했다. 시간 설정 부분은 cron expression으로 되어 있다.
2024.03.22 - [프로그래밍/General Development Skills] - cron expression 스케쥴 프로그래밍
cron expression 스케쥴 프로그래밍
스케쥴 프로그래밍 프로그래밍을 하다보면 특정 시간에 동작해야 되는 것들이 있다. 우리는 이것을 보고 job schedule 이라고 부르기로 했지만 스케쥴 프로그래밍이라고 없는 말을 좀 붙여봤다.
code-mark.tistory.com
schedule.scheduleJob('0 0 11 * * 1-5', async function() {
doAppFunction();
});
필자의 경우 월요일부터 금요일까지 오전 11시 00분에 동작하도록 설정을 했다. 회사에 출근하지 않는 공휴일 같은 경우를 예외처리 할 수 있겠지만 사소한 일에 구현하는 시간이 너무 오래 걸릴거 같아서 패스. 구현을 하고 싶다면 공공데이터 포털에서 api로 데이터를 얻어서 구현을 하는 것도 좋은 방법 일것 같다.
PM2로 실행 시키자
2024.03.22 - [프로그래밍/NodeJS] - 프로세스를 관리해주세요 - NodeJS 프로세스 관리하기 PM2
프로세스를 관리해주세요 - NodeJS 프로세스 관리하기 PM2
node app.js nodeJS를 처음 배울 때 하는 명령어는 app.js 파일을 만들고 간단하게 'console.log("Hello World");' 같은거 하나 적은 다음에 실행 시키는 것 부터 시작 했을 것이다. 우리가 프로젝트의 구현, 테
code-mark.tistory.com
이전 포스팅을 참고하면 알 수 있는데, 'PM2 startup' , 'PM2 save'를 하면 컴퓨터 실행시 자동적으로 PM2를 실행하고 저장 되어 있는 PM2 목록을 자동적을 실행 시킬 수 있는 기능을 수행 할 수 있다.
GitHub Code
짧은 코드지만 혹시나 헷갈려할 초보자 분들을 위해 링크를 남긴다.
https://github.com/silakr/code-mark/tree/main/Lanch_bot
'프로그래밍 > ToyProject' 카테고리의 다른 글
Slack 을 막 시작한 당신이 몰라도 좋을 Slack Bot 사용해보기 (1) | 2024.03.22 |
---|