100줄의 Flask를 사용해 클라우드 서버에서 Android 폰을 제어하는 방법

발행: (2026년 4월 24일 PM 05:29 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

문제

대부분의 크로스‑디바이스 자동화는 다음 중 하나를 선택하도록 강요합니다:

  • 너무 단순함: 조정이 전혀 없는 하드코딩된 cron 작업
  • 너무 복잡함: Redis, RabbitMQ, Firebase — 간단한 알림을 위한 전체 인프라

저는 클라우드 스크립트가 “야, 내 폰을 울려줘.” 라고 말하기만 원했습니다. 그게 전부였습니다.

작동 방식

Intent Bus는 SQLite를 백엔드로 하는 작은 Flask 앱입니다. 하나의 역할만 수행합니다: 스크립트가 작업을 게시하고, 워커가 그 작업을 청구하고 실행하도록 합니다.

1단계 — 클라우드 스크립트가 인텐트를 게시

curl -X POST https://your-bus.pythonanywhere.com/intent \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_key_here" \
  -d '{"goal":"send_notification","payload":{"message":"Scrape complete"}}'

2단계 — Termux 워커가 청구

폰에서 실행되는 bash 스크립트가 10 초마다 버스를 폴링합니다. 작업을 발견하면 원자적 락으로 청구하고, 실행한 뒤 완료 표시를 합니다.

3단계 — 폰이 진동

termux-notification --title "System Update" --content "$MESSAGE"

이것이 전체 흐름입니다.

신뢰성을 보장하는 요소

  1. 원자적 락 – SQLite의 UPDATE와 행 수 검사를 이용해 동시에 여러 워커가 실행되더라도 오직 하나의 워커만 작업을 청구하도록 합니다.
  2. 가시성 타임아웃 – 워커가 작업 중에 크래시가 발생하면 60 초 후에 락이 만료되고 작업이 자동으로 큐에 반환됩니다.
  3. 주제 라우팅 – 워커는 ?goal= 파라미터를 통해 자신과 일치하는 goal의 작업만 청구합니다. 알림 워커가 실수로 로깅 작업을 잡아먹는 일은 없습니다.

아키텍처

Cloud Scraper (PythonAnywhere)
        |
        | POST /intent

Intent Bus (Flask + SQLite)
        |
        | claim + fulfill

Termux Worker (Android Phone)
        |
        | termux-notification

📱 Phone Notification

할 수 있는 일

버스가 단순히 HTTP이기 때문에 어디서든 어떤 스크립트든 작업을 게시하거나 청구할 수 있습니다:

  • 스크래퍼가 완료 → 폰에 알림
  • 웹사이트가 다운 → Discord에 경고
  • GitHub 푸시 → 방화벽 뒤에 있는 라즈베리 Pi에 배포 트리거
  • 오래된 안드로이드 폰 → termux-sms-send로 Twilio 대체 무료 사용

보안

이 글을 공개한 직후, 사람들은 즉시 공개 엔드포인트에 스트레스 테스트를 진행했습니다. 저는 API‑키 인증을 추가했으며, 키는 PythonAnywhere의 WSGI 환경 변수에 저장되고 레포에는 절대 포함되지 않습니다. 워커는 로컬 .apikey 파일에서 키를 읽습니다.

사용해 보기

전체 코드, 사양, 예제는 GitHub에 있습니다:

https://github.com/dsecurity49/Intent-Bus

PythonAnywhere와 Termux가 설치된 안드로이드 폰만 있으면 무료로 실행됩니다. Docker도 필요 없고, Flask 외에 다른 의존성도 없습니다.

워커 스크립트를 만들면 PR을 환영합니다.

0 조회
Back to Blog

관련 글

더 보기 »