휴대폰으로 제어하는 완전 자동화된 레딧 게시 봇을 어떻게 만들었어요.
**내 폰에서 완전히 자동화된 레딧 포스팅 봇 만들기**
**아이디어**
레딧에 자동으로 글을 올리고 싶었어 — 같은 서브레딧에 일정에 맞춰 완전히 hands-free로. 근데 여기서 문제가 하나 있거든. 레딧은 이미지를 쉽게 올릴 수 있는 좋은 API가 별로 없어서,即便それがあっても API 기반 봇은 금방 걸리더라고. 그래서 다른 방법을 쓰기로 했어.
레딧의 API 대신, 실제 안드로이드 폰을 제어해서 사람이 레딧 앱을 쓰는 것처럼 탭을 눌러주는 봇을 만들었어. 전체 구조는 저렴한 클라우드 서버($5/월)에서 돌아가고, 나는 텔레그램으로 내 폰에서 조종해. 시작 버튼 하나, 중지 버튼 하나만 있으면 돼. 어떤 서브레딧이든, 어떤 포스팅 스케줄이든, 어떤 타이틀 형식이든 커스텀할 수 있어.
**설치 (큰 그림)**
여기서 조각들이 어떻게 맞물리는지 봐줘.
내 폰(텔레그램) → 클라우드 서버(VPS) → 클라우드 안드로이드 폰(VMOS) → 레딧 앱
텔레그램 봇 — 이게 리모트 컨트롤이야. 텔레그램을 열어 대시보드를 보고 시작하거나 정지 버튼을 탭하면 돼.
VPS(가상 사설 서버) — 클라우드에 있는 tiny 리눅스 서버로, bot 스크립트를 24/7 돌려줘. 꺼지지 않는 컴퓨터라고 생각하면 돼. 나는 Vultr 썼는데, 월 $5 정도야.
VMOS 클라우드 폰 — 클라우드에서 돌고 있는 진짜 안드로이드 폰이야. 내 폰처럼 레딧이 설치돼 있어. 봇이 이폰에 연결되어 버튼을 누르고, 텍스트를 입력하고, 스크롤을 해 — 엄지로 하는 모든 행동을 똑같이 따라 해.
레딧 앱 — 그냥 일반적인 레딧 앱이야. 모디드 APK도, speciale 버전도 없어. 폰은自分が自動化されていることに気づかない.
이 전체 구조는 커스텀 가능해. VPS 제공업체, 클라우드 폰 제공업체, 서브레딧, 스케줄 — 전부 네가 정할 수 있어.
**왜 클라우드 폰을 API 대신 썼을까?**
대부분의 사람들은 레딧 자동화에 API(PRAW 등)를 써. 문제는:
API로 올린 글은 모양이 달라서 레딧이 API에서 온 글인지 앱에서 온 글인지 금방 알아채. 메타데이터가 다르거든.
API를 통해 이미지 올리는 게 귀찮아 — 특히 갤러리, 플레어, NSFW 태그 같은 경우에는 더 그렇고.
행동 지문 필터링 — API를 쓰면 스크롤도, 브라우징도, человека처럼 행동하는 흔적이 없어. 그냥 POST 요청 하나 끝. 레딧의 스팸 탐지가 이게 이상하다는 걸 바로 잡아.
클라우드 폰을 쓰면 봇이 실제로 레딧 앱을 열고, 피드를 스크롤하고, 목표 서브레딧으로 가서 Create 버튼을 탭하고, 화면 키보드로 타이틀을 한 글자씩 입력하고, 갤러리에서 이미지를.attach하고, Post 버튼을 누르는 거야. 레딧 입장에서는 마치 사람이 앱을 쓰는 것처럼 보여.
**기술 스택**
파이썬 — 봇 스크립트. 특별할 거 없는 순수 파이썬, 프레임워크 없음.
uiautomator2 — 파이썬 라이브러리로, 안드로이드 폰을 프로그래밍적으로 제어해줘. 버튼 탭, 텍스트 입력, 스와이프, 화면 내용 읽기 전부 UI 요소 ID를 참조해서 가능.
VMOS 클라우드 — 클라우드 폰 서비스. SSH와 ADB 접속이 가능한 안드로이드 디바이스를 제공해줘.
텔레그램 봇 API (pyTelegramBotAPI) — 리모트 컨트롤 인터페이스용.
autossh + sshpass — VPS와 클라우드 폰 사이의 연결을 24/7 유지시켜줘. 끊어지면 자동으로 재연결.
systemd — 리눅스 내장 서비스 관리자. 봇이나 SSH 터널이 죽어도 자동으로 재시작해줘.
구성 요소는 자유롭게 바꿔도 돼 — 다른 클라우드 폰 제공업체, 다른 메시징 앱으로 컨트롤러, 다른 VPS — 개념은 그대로야.
**봇이 실제로 어떻게 작동하는지**
하나의 포스팅 사이클은 세 단계로 이루어져. 서브레딧, 타이틀, 플레어, 타이밍 모두 스크립트 상단에서 설정 가능해.
**Phase 1 — 클린업:**
레딧 앱을 완전히杀死해서 매 사이클마다 깨끗한 상태에서 시작. 레딧 앱을 열어 프로필로 가서 antigos 포스트가 있으면 삭제(선택사항 — 끌 수도 있어).
**Phase 2 — 이미지 준비:**
갤러리를 열어 이미지를 랜덤으로 약간 크롭해서 이미지 해시를 매번 바꿔줘. 레딧은 중복 이미지를 감지해서 이게 도움이 돼. 저장하고 원래 파일은 삭제.
**Phase 3 — 포스팅:**
홈 피드를 좀 스크롤해서 사람의 browsing 행동처럼 만들어. 목표 서브레딧을 찾아서 그 서브레딧 피드를 스크롤. Create 버튼을 탭. 화면 키보드로 타이틀을 한 글자씩 눌러 입력(각 키를 탭하면서 미세한 랜덤 딜레이 줌). 갤러리에서 이미지.attach. Post 버튼 누름. 포스트가 라이브になるのを待つ. 포스트를 열어 플레어 설정.
전체 사이클은 설정된 스크롤 수에 따라 대략 7~8분 걸려. 그 뒤에 커스텀 가능한 대기 시간(나는 약 1시간에 랜덤 지터 추가)으로 다시 반복해.
**내가 배운 biggest 교훈들**
이런 실수 때문에 계정이 날아갔었어. similares 것을 만들 거라면 내 실수부터 배워줘.
**절대 ADB input text 쓰면 안 돼**
이게 내 가장 큰 실수였어. 안드로이드에서 프로그래밍적으로 텍스트를 입력하는 방법은 두 가지가 있어.
잘못된 방법 — "input text"(ADB 명령). 이 명령은 텍스트를 바로 필드에 주입해. 빠르고 쉬워도 앱이 감지할 수 있어 — 키스트로크 이벤트가 전혀 없으니까 텍스트가 마법처럼 나타나는 거야. 레딧이 이걸 봐채.
올바른 방법 — 화면 키보드의 키를 리소스 ID로 찾아서 하나씩 탭. Gboard의 각 키는 행과 열 기반의 고유 ID를 가지고 있어.そこから小さなランダムディレイを間に入れてタップすれば、本当に人間がタイプしているのと同じ挙動になる。WEditor(後述)を使えばすべてのキーをマッピングできる。
나는 코드에 "input text"를 silenzious fallback으로 뒀는데 — 키보드 키를 못 찾으면 quietly ADB 주입으로 넘어가고선 나한테 알리지 않았어. 그걸 몰랐는데, 그때마다 포스트가 probabilmente 플래그를 먹었을 거야. 코드에서 모든 "input text"와 "input keyevent"를 삭제해. 키를 못 찾으면 스크립트가 멈추고 에러를 알려줘야지, silenziously 속이지 말아.
**직선 스와이프는 로봇 같아**
처음 스크롤 구현은 점 A에서 점 B까지 똑바로 일정한 속도로 스와이프였어. 엄지는 그렇게 움직이지 않아 — 약간 휘고, 좌우로 흔들리고, 시작엔 langsamになって серединаで速くなって、最後にまた遅くなる感じ。
나는 멀티 포인트 스와이프로 바꾸었어 — X축에 랜덤 드리프트(스와이프 중에 엄지가 살짝 sideways 움직임), 각 중간 점에서 작은 워블, ease‑in‑out 속도 곡선(천천히 시작→ 빨라졌다→ 다시 느려짐), 그리고 단순히 두 끝점 대신 4~6개의 중간 점씩 넣어. 이렇게 하면 훨씬 자연스러워.
**매번 같은 타이틀 = sofort 플래그**
나는 매번 똑같은 타이틀로 포스팅했어. 레딧 스팸 필터가これがすぐに捕まる。対策は簡単 — タイトルをローテートさせる。小さな変化でもいい。複数のタイトルのプールを作って毎回ランダムで選ぶか、ベースタイトルに小さな回転要素(例えば最後に絵文字を交換する)を付ける。君のユースケースに合うやり方で。
**삭제‑재포스트는 알려진 스팸 패턴**
내 봇은 프로필에 중복이 안 생기게 기존 포스트를 삭제하고 새 포스트를 올렸어. 레딧은 이 패턴을 봐채 — 포스트, 삭제, 포스트, 삭제, 포스트, 삭제. 이건 전형적인 조작이야 — 슬롯을 recycle해서 노출을 유지하려는거지. 가능하면 오래된 포스트는 자연스럽게 ageing 시켜두고 삭제하지 말아.
**반응이 troppo 빠름**
봇이 화면에서 요소를 찾으면毫秒単位でクリック해. 인간은 200‑800ms 정도의 반응 시간이 필요해 — 버튼を見て、脳が処理して、指が動く。要素検出とクリックの間にランダムなディレイを入れて。小さなことだけど大きな差が出る。
**포스팅 간격도 중요**
매번 정확히 60분마다 포스팅하면 그것도 패턴이야. 베이스 간격에 랜덤 지터를 줘서 — 어떤 건 52분 차이, 어떤 건 67분 차이처럼. 시계처럼 보이는 스케줄이면 안 돼. 베이스 간격과 지터 범위는 스크립트에서 설정 가능해.
**WEditor로 UI 요소 ID 찾기**
이건 아마도 whole project 중에서 가장 지루한 부분일 거야. 봇이 взаимодействовать해야 할 모든 버튼, 필드, 메뉴 아이템의 리소스 ID를 알아내야 해.
WEditor는 uiautomator2와 함께 제공되는 웹 기반 툴이야. 안드로이드 디바이스에 연결하면 라이브 스크린샷과 함께 모든 UI 요소의 트리를 보여줘. cualquiera 요소をクリックすると、そのリソース ID、テキスト、インデックス、説明、クラス名が表示される。
リソース IDをテキストラベルよりも優先して使って。テキストはオートコレクトや言語、RedditのA/Bテストで変わることがあるけど、リソース IDはバージョン間で安定しているから。テキストはフォールバックとしてだけ使うといい。
君の特定のフローで必要なすべての要素 — ナビゲーションボタン、投稿作成画面、タイトルフィールド、イメージピッカー、フレアセレクター、キーボードのキー — をマッピングしておこう。サブレディットごとや画面解像度によってレイアウトが少し違うことがあるから、自分で自分の設定に合わせてやってみて。
Gboard キーボードはグリッドパターンで、各キーは行と列に基づいた ID を持っている。アルファベット、数字、一般的な記号を一度マッピングすれば、ADB インジェクションに触れずにあらゆる文字を入力できるよ。
**텔레그램으로 컨트롤하기**
텔레그램 인터페이스는 한 엄지로 폰에서 쓰기 쉽도록 만들어졌어. 계정당 한 줄씩 상태를 보여주고, 이모지로 상태(실행 중, 정지, 슬립, 오류, 도움이 필요)를 표시해. 현재 단계, 타이밍 정보, 포스트 횟수도 함께 보여줘. 두 개의 버튼 — 시작/중지 그리고 새로고침 — 만 있으면 돼.
메시지는 자동 삭제되어 채팅을 깔끔하게 유지하고, 대시보드만 남겨둬.
최고의 기능: 봇이 예상치 못한 팝업이나 요소를 못 찾는 등 빨간불에 부딪히면 crashes하지 않아. 대신 일시 정지하고, 무엇이 잘못됐는지와 앱이 어떤 화면에 있어야 resume할 수 있는지 설명하는 메시지를 보내줘. 너는 클라우드 폰에서 직접 문제를 해결하고 resume 버튼을 누르면, 그때부터 이어서 동작해. 이렇게 하면 봇이 완전히 죽어서 전 사이클을 다시 시작하는 것보다 시간을 많이 절약할 수 있어.
여러 계정도 돌려볼 수 있어 — 각 계정마다 대시보드에 own 줄과 자체 시작/중지 버튼이 생겨. 서로 stagger된 타이밍으로 실행해서 모두가同じ 초에 포스팅하지 않게 해.
**VPS 설정**
나는 Vultr을 선택했어 — 월 $5에 작은 Ubuntu 서버. 어떤 VPS 제공업체라도 괜찮아. 필요한 건:
봇 스크립트를 systemd 서비스 형태로 실행해서 크래시 시 자동 재시작.
클라우드 폰과의 SSH 터널도 또 다른 systemd 서비스 형태로 실행해서 연결이 끊어지면 자동 재접속.
터널을 통해 ADB로 폰과 대화.
필요한 파이썬 의존성을 설치.
SSH 터널은 VPS의 로컬 포트를 클라우드 폰의 ADB 포트에 연결해줘. 봇 스크립트는 uiautomator2를 통해 이 로컬 포트에 접속해서 통신해. autossh가 터널을 살게 하고, sshpass가 비밀번호를 처리해서 완전 자동화돼.
VMOS가 간혹 포트를 바꿔주면(가끔 그러더라) 터널 설정만 고치고 서비스를 다시 시작하면 돼 — 30초 정도면 끝.
**비용 내역**
VPS (1 CPU, 1GB RAM): $5/월
클라우드 폰 (1대): 제공업체와 플랜에 따라 $3‑8/월
총계: 계정당 약 $8‑13/월
API 사용료 필요 없음, 프록시 필요 없음, 클라우드 폰이 자체 IP를 가지고 있어, 캡차 솔버도 필요 없음. 클라우드 폰을 더 추가해서 스케일 업하면 돼.
**다음엔 이렇게 할게**
첫날부터 키보드 탭을 시작할 거야. ADB input text 때문에 계정을 날린 적이 있어서 그게 detectable하다는 걸 깨달은 뒤에야 바꾼 거였으니까.
개입 시스템을 일찍 갖출 거야. 봇이 충돌하는 대신 멈추고 Hilfe를 요청하게 하면 두통이 정말 줄어들어.
모든 걸 로테이트시킬 거야 — 타이틀, 이미지(정말 다른 이미지, مجرد 재크롭이 아니라), 포스팅 시간, 여러 서브레딧에 포스팅하면 방문 순서까지.
삭제‑재포스트 패턴은 버릴 거야. 그냥 기존 포스트를 자연스럽게 ageing 시켜둘게.
자동 포스팅을 시작하기 전에 카르마부터 먼저 쌓을 거야 — 댓글 달고, 업보트 하고, 둘러보고, 몇日間実際に参加してアカウントを本物らしく見せる。
테스트는 먼저 버려 계정에서 할 거야. 메인 계정은 소모하지 않을 거야.
**TL;DR**
레딧의 API 대신 클라우드 안드로이드 폰을 써. 파이썬 + uiautomator2로 제어하고, 실제 키보드 키를 탭해서 입력해 — ADB 인젝션은 절대 쓰지 마. 스와이프는 곡선처럼人間のように、タイトルと画像をローテートさせ、$5 VPS와 텔레그램을リモートコントロールとして使う。介入システムを組んで、クラッシュする代わりにヘルプを求めるようにすれば、月額約$10で済む。すべて君は自分のユースケースに合わせてカスタマイズできるよ。
설정에 관한 질문이 있으면 아래에 댓글 달아줘.
(AI를 이용해 전부 정리했으니, 혹시 기분이 상한 사람이 있으면 미안해)