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 │
lib/getMessage.ts
파일 내부의 미리 지정된 체크인/체크아웃 메시지를 변경한다.
(해외에서 사용하는 경우) index.ts
의 시간 및 타임존 설정을 변경해준다.
구글/에어비앤비의 경우 봇에 의한 로그인 시도를 차단하기 위해 수상한 로그인 시도를 발견할 경우 전화번호 등을 이용해 사용자를 인증하도록 하고 있습니다. 이 경우 아직 프로그래밍적으로 인증을 통과할 방법을 찾지 못했습니다.
headless
옵션을 true
로 설정하니 RECAPCHA를 입력해야 합니다1과 마찬가지로 구글은 봇의 활동을 차단하기 위해 headless
(UI없이 브라우저를 제어하는 경우) 옵션이 설정된 경우 로그인 시도 시에 RECAPCHA를 해결하게 만듭니다. 그러므로 headless
옵션을 false
로 둬야합니다.
pm2
서버가 리스트에서 사라졌습니다!pm2
는 Node.js
프로세스를 관리하지만 재부팅 시에 자동으로 다시 켜지는 않습니다. 서버를 데몬으로 돌리려면 pm2 startup
커맨드를 활용해야 합니다. 문서 읽기
Puppeteer
는 브라우저의 로그인 세션을 불러올 수 있게 옵션을 제공하고 있습니다. userDataDir
이라는 옵션을 명시하면 다음부터는 이전에 로그인된 세션을 활용하므로 다시 로그인할 필요가 없습니다.
const browser = await puppeteer.launch({
...
// reuse user profile session
userDataDir: './userData',
})
기본적으로 node-cron
라이브러리를 활용하기 때문에 문서를 참조하시면 됩니다.
# index.ts
cron.schedule(
'40 7 * * *', # 07 40 AM
async () => {
try {
...
{
timezone: 'Asia/Seoul', # you can set timezone like this
},
이 경우 schedule을 사용해서 특정 시간마다 컴퓨터를 시작 혹은 깨울 수 있습니다.