** 2019. 03. 04 업데이트 **
아래의 Getting Started 가이드는 최신 버전이 아닙니다. 만약 최신 버전의 가이드를 찾고 있다면 깃헙 레포 README#Getting Started 부분을 참고해주세요.


영문[Medium]: https://medium.com/@leejh3224/build-airbnb-check-out-reminder-with-node-js-and-puppeteer-ab0791473347

약 6개월 전에 처음으로 에어비앤비를 시작했다. 그리고 그 동안 가장 귀찮은 것은 에어비앤비가 예약 메시지 기능을 제공하지 않는다는 것이었다. 손님들에게 체크인/아웃 시간을 미리 알려줘야 빨리 청소를 하거나 준비를 할 수 있기 때문에 꼭 필요한 기능이었지만 에어비앤비 자체적으로 제공하고 있지는 않다. 그래서 매일 아침 7시 40분에 나를 대신해서 이 귀찮은 일을 대신해줄 스크립트를 작성하기로 마음 먹었다.

이미 파이썬과 셀레니움을 통해서 웹 자동화를 경험했기 때문에 셀레니움을 쓸 수도 있었지만 이번에는 Node.js와 Puppeteer를 써보고 싶었다. 그리고 이제는 자랑스럽게 프로젝트를 공개할 수 있을 것 같다.

시작하기

시작하기 전에 먼저 Node.js가 인스톨되어 있어야 한다.

다운로드: https://nodejs.org/en/

그리고 물론 에어비앤비 계정과 호스팅 중인 숙소가 있어야 한다.
(Facebook 로그인의 경우 아직 로그인 스크립트를 작성하지 못했으므로 Google 혹은 이메일 로그인인 경우에만 사용가능합니다)

이제 깃 저장소를 clone합니다.

git clone https://github.com/leejh3224/airbnb-checkout-reminder.git

다음으로 필요한 (글로벌) 모듈을 설치해줍니다.

npm install pm2 typescript -g
# 선택사항
npm install tslint -g

마지막으로 이메일과 비밀번호를 저장할 .env파일을 만듭니다.

# 프로젝트 루트 디렉토리에 생성
touch .env
# .env
email=blahblah@gmail.com
password=blahblah

이제 pm2를 사용해 서버를 시작합니다.

pm2 start npm -- start

서버의 상태를 확인하려면 pm2 list를 사용합니다.

│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem    │ user        │ watching │
├──────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼────────┼─────────────┼──────────┤
│ npm      │ 0  │ 0.33.11 │ fork │ 511 │ online │ 0       │ 2h     │ 0%  │ 0 B    │ leejunhyung │ disabled │

주의사항

  1. lib/getMessage.ts 파일 내부의 미리 지정된 체크인/체크아웃 메시지를 변경한다.

  2. (해외에서 사용하는 경우) index.ts의 시간 및 타임존 설정을 변경해준다.

기타

  1. 왜 클라우드 서비스를 사용하지 않는 건가요?

구글/에어비앤비의 경우 봇에 의한 로그인 시도를 차단하기 위해 수상한 로그인 시도를 발견할 경우 전화번호 등을 이용해 사용자를 인증하도록 하고 있습니다. 이 경우 아직 프로그래밍적으로 인증을 통과할 방법을 찾지 못했습니다.

  1. headless 옵션을 true로 설정하니 RECAPCHA를 입력해야 합니다

1과 마찬가지로 구글은 봇의 활동을 차단하기 위해 headless(UI없이 브라우저를 제어하는 경우) 옵션이 설정된 경우 로그인 시도 시에 RECAPCHA를 해결하게 만듭니다. 그러므로 headless 옵션을 false로 둬야합니다.

  1. 컴퓨터를 재부팅했더니 pm2 서버가 리스트에서 사라졌습니다!

pm2Node.js 프로세스를 관리하지만 재부팅 시에 자동으로 다시 켜지는 않습니다. 서버를 데몬으로 돌리려면 pm2 startup 커맨드를 활용해야 합니다. 문서 읽기

  1. 브라우저가 매번 로그인을 하라고 요구하네요. 로그인 세션은 어떻게 관리하나요?

Puppeteer는 브라우저의 로그인 세션을 불러올 수 있게 옵션을 제공하고 있습니다. userDataDir이라는 옵션을 명시하면 다음부터는 이전에 로그인된 세션을 활용하므로 다시 로그인할 필요가 없습니다.

const browser = await puppeteer.launch({
...
// reuse user profile session
userDataDir: './userData',
})
  1. 시간/타임존을 바꾸고 싶습니다. 어떻게 하나요?

기본적으로 node-cron 라이브러리를 활용하기 때문에 문서를 참조하시면 됩니다.

# index.ts
cron.schedule(
'40 7 * * *', # 07 40 AM
  async () => {
    try {
...
{
timezone: 'Asia/Seoul', # you can set timezone like this
},
  1. [맥] 컴퓨터가 수면 모드일때는 스크립트가 작동하지 않습니다.

이 경우 schedule을 사용해서 특정 시간마다 컴퓨터를 시작 혹은 깨울 수 있습니다.