🎬 영화·운동 예약, 정각에 자동으로 클릭하게 만들기
Python + ADB로 안드로이드 예약 앱 자동화하기 — 핏투비(Fit2B) 예제
인기 영화 좌석이나 운동 수업처럼 특정 시간에 예약이 열리는 서비스를 이용하다 보면 이런 경험을 하게 된다.
“밤 10시에 예약이 열리는데 매번 기다렸다가 직접 눌러야 하나?”
웹사이트라면 Selenium 같은 브라우저 자동화 도구를 생각할 수 있지만, 예약 서비스가 안드로이드 앱으로만 제공되는 경우에는 조금 다른 방법이 필요하다.
이번에는 별도의 비공개 API를 분석하거나 서버에 직접 요청하는 방식이 아니라, PC가 실제 안드로이드 태블릿 화면을 사람이 조작하는 것처럼 터치하는 방식으로 자동예약 환경을 만들어봤다.
실제 테스트에는 운동 예약 앱 핏투비(Fit2B)를 사용했다.
1. 우리가 자동화하려는 것은 단순하다
운동 수업 예약을 예로 들면 사람이 하는 행동은 사실 몇 단계 되지 않는다.
예약 앱 실행 → 예약 날짜 선택 → 원하는 시간 선택 → 예약하기 → 확인
문제는 예약이 정해진 시각에 열린다는 것이다.
이번에 테스트한 환경에서는 월·수·금 운동 수업의 예약이 전날 밤 10시에 열린다.
그래서 최종 목표를 다음과 같이 잡았다.
21:58
태블릿 화면 자동 ON
↓
잠금화면 자동 해제
↓
22:00까지 대기
↓
예약 화면 새로고침
↓
다음날 날짜 선택
↓
원하는 수업 선택
↓
예약하기
↓
예
↓
화면 OFF
사람이 태블릿 앞에 없어도 이 과정이 진행되는 구조다.
2. 핵심 도구는 ADB
여기서 사용하는 것이 ADB(Android Debug Bridge)다.
ADB는 Google에서 제공하는 안드로이드 개발 도구로, PC에서 안드로이드 기기에 명령을 전달할 수 있다.
예를 들어 PC에서 다음 명령을 보내면,
adb shell input tap 400 500
안드로이드 화면의 X=400, Y=500 위치를 실제로 터치한다.
스와이프도 가능하다.
adb shell input swipe 150 450 650 450 250
화면을 켜거나 끄는 것도 된다.
adb shell input keyevent KEYCODE_WAKEUP
adb shell input keyevent KEYCODE_SLEEP
결국 Python이 시간을 체크하고 ADB에 명령을 보내면,
Python → ADB → 안드로이드 태블릿 → 실제 예약 앱
이라는 자동화 구조가 만들어진다.
3. 테스트 환경
이번에는 Redmi Pad SE 8.7을 예약 전용 기기로 사용했다.
처음에는 스마트폰으로 테스트하려고 했지만, 실제 생활에서 계속 사용하는 스마트폰보다는 집에 있는 태블릿을 예약 전용으로 두는 편이 훨씬 편했다.
태블릿에서는 먼저 개발자 옵션을 활성화한다.
설정 → 태블릿 정보 → OS 버전 여러 번 터치 → 개발자 모드 활성화
이후 개발자 옵션에서 USB 디버깅을 켰다.
PC에는 Google의 Android SDK Platform-Tools를 설치한다.
Google Android SDK Platform-Tools
그리고 USB로 PC와 태블릿을 연결한 후,
.\adb.exe devices
를 실행한다.
정상적으로 연결되면 다음과 비슷하게 표시된다.
List of devices attached
24524be97d91 device
여기까지 나오면 준비 완료다.
4. 실제 화면을 캡처해서 좌표를 잡는다
무작정 좌표를 예상할 필요도 없다.
ADB로 현재 태블릿 화면을 PNG로 캡처할 수 있다.
.\adb.exe shell screencap -p /sdcard/reserve.png
.\adb.exe pull /sdcard/reserve.png
그러면 PC에 실제 예약 화면이 저장된다.
이번에 사용한 핏투비 예약 화면은 이런 형태였다.



실제 캡처 화면을 기준으로 태블릿의 해상도와 각 버튼의 위치를 하나씩 확인했다.
예를 들어 날짜를 터치해보고,
.\adb.exe shell input tap 399 432
수업 목록에서 원하는 시간을 눌러본다.
.\adb.exe shell input tap 500 875
그리고 상세화면의 예약하기 버튼까지 하나씩 좌표를 확인한다.
이렇게 하면 화면 자동화에서 가장 흔한 문제인 “엉뚱한 버튼을 누르는 문제”를 크게 줄일 수 있다.
5. 예약 날짜가 안 뜨는 문제도 자동화
실제로 테스트하면서 재미있는 문제가 하나 있었다.
밤 10시가 되어 예약이 열려도 현재 보고 있는 달력 화면에 예약 가능 날짜가 즉시 표시되지 않는 경우가 있었다.
직접 사용해보니,
현재 달 → 이전 달 → 다시 현재 달
순서로 달력을 한번 넘겼다가 돌아오면 예약 가능한 날짜가 빠르게 갱신됐다.
그래서 이것도 그대로 자동화했다.
def refresh_calendar():
# 이전 달
swipe(150, 450, 650, 450, 250)
time.sleep(0.3)
# 현재 달로 복귀
swipe(650, 450, 150, 450, 250)
time.sleep(0.5)
이 부분이 중요한 이유는 예약 자동화에서 단순히 예약 버튼을 빨리 누르는 것보다, 예약 가능한 상태를 얼마나 빨리 화면에 표시시키느냐가 중요할 수 있기 때문이다.
6. 날짜 좌표도 자동 계산할 수 있다
매주 날짜가 달라지므로 9일은 여기, 11일은 여기 식으로 좌표를 일일이 지정하면 불편하다.
Python의 calendar를 이용하면 해당 날짜가 달력의 몇 번째 행, 몇 번째 열인지 계산할 수 있다.
예를 들어 화면의 요일별 X좌표를 다음처럼 정의한다.
CAL_X = [
76, # 일
183, # 월
291, # 화
399, # 수
508, # 목
616, # 금
723 # 토
]
그리고 각 주의 Y좌표를 지정한다.
CAL_Y = [
347,
432,
518,
603,
687,
772
]
Python이 오늘 날짜와 예약 대상 날짜를 계산한 다음 자동으로 해당 칸의 좌표를 찾아 터치한다.
따라서 매주 코드를 수정할 필요가 없다.
월말 → 다음 달로 넘어가는 경우도 별도로 처리할 수 있다.
7. 수업 시간도 요일에 따라 자동 지정
예를 들어 내가 원하는 예약 규칙이 다음과 같다고 하자.
REAL_SCHEDULE = {
0: ["19:00", "20:00"], # 월요일
2: ["19:00", "20:00"], # 수요일
4: ["19:00"], # 금요일
}
그러면 일요일 밤 10시에는 다음날이 월요일이므로 19시와 20시를 예약하고,
화요일 밤 10시에는 수요일 19시와 20시,
목요일 밤 10시에는 금요일 19시만 예약하도록 만들 수 있다.
사람은 그냥 프로그램을 켜두면 된다.
8. 마지막 예약 확인창까지 자동으로
실제 핏투비에서는 예약하기를 누른다고 바로 예약되는 것이 아니었다.
마지막으로
예약하시겠습니까?
아니요 / 예
확인창이 한 번 더 나온다.
따라서 처음 테스트할 때는 일부러 여기에서 멈추도록 했다.
TEST_MODE = True
테스트 결과는 다음과 같은 흐름이었다.
ADB 연결 확인
↓
달력 이전 달 이동
↓
현재 달 복귀
↓
목표 날짜 선택
↓
09:20 스피닝 선택
↓
예약하기
↓
예약 확인창
↓
STOP
실제 화면에서도 마지막 예 버튼 직전까지 정확하게 도달하는 것을 확인했다.
모든 동작이 검증된 후에야
TEST_MODE = False
로 변경해 최종 예까지 자동으로 누르도록 했다.
예약 프로그램을 만들 때는 이런 테스트 모드가 상당히 중요하다.
좌표 하나가 잘못됐다고 실제로 원하지 않는 수업을 예약해버리면 곤란하기 때문이다.
9. 태블릿 화면이 꺼져 있어도 된다
여기서 한 단계 더 자동화했다.
예약 때문에 태블릿 화면을 하루 종일 켜둘 필요는 없다.
예를 들어 예약 오픈이 22시라면 21시 58분에 자동으로 화면을 켜면 된다.
adb_shell(
"input",
"keyevent",
"KEYCODE_WAKEUP"
)
비밀번호나 패턴이 없는 단순 잠금화면이라면 스와이프로 해제할 수도 있다.
swipe(
400,
1100,
400,
300,
300
)
따라서 실제 동작은 이렇게 된다.
평상시
태블릿 화면 OFF
↓
21:58
자동 화면 ON
↓
자동 잠금 해제
↓
22:00
예약 시작
↓
예약 완료
↓
자동 화면 OFF
예약 전용 태블릿으로 사용하기에 상당히 편한 구조다.
10. 처음에는 USB 유선 연결이 가장 편하다
처음부터 무선으로 만들려고 하기보다는 USB부터 성공시키는 것을 추천한다.
USB 방식은 구조가 단순하다.
Windows PC
│
USB
│
Android 태블릿
│
예약 앱
USB 디버깅을 켜고 adb devices에서 기기만 정상적으로 잡히면 된다.
특히 좌표를 잡고 처음 자동예약을 테스트하는 단계에서는 유선 ADB가 안정적이고 문제 원인을 찾기도 쉽다.
이번 테스트 역시 유선으로 먼저 모든 동작을 검증했다.
11. 성공하면 Wi-Fi 무선 ADB로 확장
유선 버전이 안정적으로 돌아간다면 다음 단계는 Wi-Fi ADB다.
그러면 USB 케이블을 PC까지 연결해둘 필요가 없다.
구조가 이렇게 바뀐다.
Windows PC
│
Wi-Fi
│
Redmi Pad
│
운동예약 앱
PC와 태블릿을 같은 Wi-Fi에 연결하고, 최초 설정 단계에서 USB 연결 상태로 다음 명령을 실행한다.
.\adb.exe tcpip 5555
태블릿 IP가 예를 들어 192.168.0.123이라면 USB를 제거한 후:
.\adb.exe connect 192.168.0.123:5555
그리고:
.\adb.exe devices
결과가
192.168.0.123:5555 device
처럼 나온다면 무선 ADB 연결이 된 것이다.
이 상태에서도 기존의
adb shell input tap ...
adb shell input swipe ...
adb shell input keyevent ...
명령을 거의 그대로 사용할 수 있다.
즉 예약 프로그램 자체를 다시 만들 필요가 없다.
다만 Wi-Fi 환경이나 기기 재부팅 등에 따라 무선 연결이 끊길 수 있으므로, 처음 실전 예약은 유선으로 충분히 검증한 뒤 무선으로 넘어가는 편이 안전하다.
12. 운동 예약뿐 아니라 영화·시설 예약에도 응용 가능
이 방식의 재미있는 점은 핏투비에만 국한되지 않는다는 것이다.
ADB는 특정 앱 전용 기술이 아니다.
결국 사람이 화면에서 하는
터치 → 스와이프 → 대기 → 다음 화면 → 터치
를 자동화하는 방식이기 때문에 비슷한 UI를 가진 여러 작업에 응용할 수 있다.
예를 들면 영화 예매에서 날짜 → 영화 → 시간 → 좌석을 선택하거나, 체육시설·문화센터·강좌처럼 정해진 시각에 신청이 열리는 화면을 자동으로 조작하는 식이다.
다만 서비스마다 자동화 이용에 관한 약관이나 정책이 다를 수 있으므로 실제 서비스에 적용하기 전에는 해당 정책을 확인하는 것이 좋다. 결제나 좌석 선택처럼 조건이 복잡한 서비스는 단순 좌표 자동화만으로 처리하지 않는 편이 안전하다.
직접 만들어보니 핵심은 '예약'보다 화면 제어였다
처음에는 “예약 자동화 프로그램을 만들어야 한다”고 생각했지만, 실제 구현에서 핵심은 오히려 단순했다.
PC가 안드로이드 화면을 정확한 시간에 정확한 순서로 조작하도록 만드는 것.
ADB로 터치와 스와이프가 가능하다는 것을 알고 나면 상당히 많은 반복 작업을 Python으로 연결할 수 있다.
이번 핏투비 테스트에서는 실제로
화면 자동 ON → 잠금 해제 → 달력 갱신 → 날짜 자동 계산 → 수업 선택 → 예약하기 → 최종 확인 → 화면 OFF
까지 구현했다.
그리고 가장 중요한 원칙은 처음부터 완전자동으로 돌리지 않는 것이다.
① USB로 한 동작씩 확인 → ② 마지막 확인 버튼 직전까지 테스트 → ③ 실제 예약 1건 검증 → ④ 다중 예약 → ⑤ Wi-Fi 무선화
순서로 확장하면 실패 지점을 찾기가 훨씬 쉽다.
결국 집에서 놀고 있던 안드로이드 태블릿 하나가 정해진 시간이 되면 스스로 일어나 예약하고 다시 잠드는 예약 전용 단말기가 되는 셈이다. 😄