AlexTheRedditDork
Newbie
- Jun 25, 2026
- 16
- 9
How I Built a Fully Automated Reddit Posting Bot Controlled From My Phone
THE IDEA
I wanted to automate posting on Reddit — same subreddit, on a schedule, completely hands-free. But here's the thing: Reddit doesn't have a great API for posting images easily, and even if it did, API-based bots get flagged fast. So I went a different route.
Instead of using Reddit's API, I built a bot that controls an actual Android phone and taps through the Reddit app like a real person would. The whole thing runs on a cheap cloud server ($5/month) and I control it from Telegram on my phone. One button to start, one button to stop. You can customize it for any subreddit, any posting schedule, any title format.
THE SETUP (BIG PICTURE)
Here's how the pieces fit together:
Your Phone (Telegram) → Cloud Server (VPS) → Cloud Android Phone (VMOS) → Reddit App
Telegram Bot — this is your remote control. You open Telegram, see a dashboard, tap Start or Stop.
VPS (Virtual Private Server) — a tiny Linux server in the cloud that runs the bot script 24/7. Think of it as a computer that never turns off. I used Vultr, costs $5/month.
VMOS Cloud Phone — a real Android phone running in the cloud. It has Reddit installed on it just like your phone does. The bot connects to this phone and taps buttons, types text, scrolls — everything you'd do with your thumb.
Reddit App — just the normal Reddit app. No modded APK, no special version. The phone doesn't know it's being automated.
All of this is customizable. You pick the VPS provider, the cloud phone provider, the subreddit, the schedule — everything.
WHY A CLOUD PHONE INSTEAD OF AN API?
Most people who automate Reddit use the API (PRAW, etc). The problem:
API posts look different — Reddit can tell when a post came from the API vs the app. API posts have different metadata.
Image posting through API is annoying — especially with galleries, flairs, NSFW tags.
Behavioral fingerprinting — when you use the API, there's no scrolling, no browsing, no human-like activity. It's just a POST request and done. Reddit's anti-spam picks this up.
With a cloud phone, the bot literally opens Reddit, scrolls through feeds, navigates to your subreddit, taps Create, types the title letter by letter on the keyboard, attaches the image, and hits Post. From Reddit's perspective, it looks like a person using the app.
THE TECH STACK
Python — the bot script. Nothing fancy, no frameworks.
uiautomator2 — a Python library that lets you control an Android phone programmatically. Tap buttons, type text, swipe, read what's on screen — all by referencing UI element IDs.
VMOS Cloud — the cloud phone service. They give you an Android device running in their cloud with SSH and ADB access.
Telegram Bot API (pyTelegramBotAPI) — for the remote control interface.
autossh + sshpass — keeps the connection between your VPS and the cloud phone alive 24/7. If it drops, it reconnects automatically.
systemd — Linux's built-in service manager. Makes sure the bot and the SSH tunnel restart if they crash.
You can swap out any of these. Different cloud phone provider, different messaging app for the controller, different VPS — the concept stays the same.
HOW THE BOT ACTUALLY WORKS
Each posting cycle goes through three phases. The subreddit, title, flair, and timing are all configurable at the top of the script.
Phase 1 — Clean Up:
Kill Reddit app completely so every cycle starts fresh. Open Reddit, go to profile, check if there's an old post. If there is, delete it (optional — you can turn this off).
Phase 2 — Prep the Image:
Open the gallery, crop the image slightly with a random crop so the image hash changes every time. Reddit detects duplicate images, so this helps dodge that. Save it, delete the original.
Phase 3 — Post:
Scroll through the home feed for a while to act like a human browsing. Find your target subreddit. Scroll through the subreddit feed. Tap Create. Type the title using the on-screen keyboard, letter by letter, tapping each key. Attach the image from gallery. Hit Post. Wait for it to go live. Open the post and set the flair.
The whole cycle takes about 7-8 minutes depending on how many scrolls you configure. Then it sleeps for a customizable interval (I use around an hour with random jitter) and does it again.
THE BIGGEST LESSONS I LEARNED
These cost me accounts before I figured them out. If you're building something like this, learn from my mistakes.
NEVER use ADB input text
This was my biggest mistake. When you type text on Android programmatically, there are two ways to do it:
The wrong way — "input text" (ADB command). This injects text directly into the field. It's fast and easy, but the app can detect it because there are zero keystroke events. The text just magically appears in the field with no typing activity. Reddit can see this.
The right way — tapping keyboard keys by their resource IDs. You find each key on Gboard (every key has a unique ID based on its row and column position), and you tap them one by one with small random delays between each tap. This is identical to a real human typing. You can map out all the keys using WEditor (more on that below).
I had "input text" as a silent fallback in my code — if a keyboard key wasn't found, it would quietly fall back to ADB injection without telling me. I didn't even realize it was firing. Every time it did, that post probably got flagged. Remove every single "input text" and "input keyevent" from your code. If a key isn't found, the script should STOP and tell you, not silently cheat.
Straight-line swipes are robotic
My first scroll implementation was a simple swipe from point A to point B — perfectly straight, constant speed. A real thumb doesn't move like that. It curves, drifts sideways a little, wobbles, speeds up at the start, and slows down at the end.
I switched to multi-point swipes with random X drift (thumb moves sideways slightly during the swipe), small wobble on each intermediate point, ease-in-out speed curve (starts slow, speeds up, slows down again), and 4-6 intermediate points per swipe instead of just two endpoints. Makes it way more natural.
Same title every post = instant flag
I was posting the exact same title every single time. Reddit's spam filter catches this immediately. The fix is simple — rotate your titles. Even small variations help. You can keep a pool of different titles and pick one randomly each cycle, or use a base title with small rotating elements (like swapping the emoji at the end each time). Whatever fits your use case.
Delete-and-repost is a known spam pattern
My bot deleted the old post before making a new one to avoid duplicates on the profile. Reddit sees this pattern: post, delete, post, delete, post, delete. That's textbook manipulation — you're recycling your slot to stay visible. If you can, just let old posts age naturally instead of deleting them.
Your reactions are too fast
When the bot finds an element on screen, it clicks it instantly — within milliseconds. A human has 200-800ms of reaction time. They see the button, their brain processes it, their thumb moves to it. Add random delays between detecting an element and clicking it. Small thing, big difference.
The posting interval matters
Posting every exactly 60 minutes is a pattern. Use a base interval with random jitter — so some posts are 52 minutes apart, others 67 minutes apart. It shouldn't look like a clock schedule. The base interval and jitter range are configurable in the script.
FINDING UI ELEMENT IDs WITH WEDITOR
This is probably the most tedious part of the whole project. You need to know the resource ID of every button, field, and menu item the bot needs to interact with.
WEditor is a web-based tool that comes with uiautomator2. You connect it to your Android device and it shows you a live screenshot with a tree of all UI elements. Click on any element and it shows you its resource ID, text, index, description, and class name.
Always prefer resource IDs over text labels. Text can change (autocorrect, language, A/B tests Reddit runs), but resource IDs are stable across versions. Use text as a fallback only.
You'll need to map out every element in your specific flow — the navigation buttons, the post creation screen, the title field, the image picker, the flair selector, the keyboard keys. Every subreddit and every phone resolution might have slightly different layouts, so you need to do this yourself for your setup.
The Gboard keyboard follows a grid pattern where each key has an ID based on its row and column. Once you map the alphabet, numbers, and common symbols, you can type anything without ever touching ADB injection.
CONTROLLING IT FROM TELEGRAM
The Telegram interface is designed to be used on your phone with one thumb. It shows one status line per account with an emoji indicating the state (running, stopped, sleeping, error, or needs help), the current step, timing info, and post count. Two buttons — Start/Stop and Refresh. That's it.
Messages auto-delete to keep the chat clean. Only the dashboard stays.
The best feature: when the bot gets stuck (unexpected popup, element not found, Reddit being weird), it doesn't crash. Instead it pauses and sends you a message explaining what went wrong and exactly what screen the app needs to be on before you tap Resume. You go fix it on the cloud phone manually, tap Resume, and it picks up right where it left off. This saves a ton of time compared to the bot just dying and you having to restart the whole cycle.
You can run multiple accounts too — each one gets its own line on the dashboard with its own Start/Stop button. They run independently with staggered timing so they don't all post at the same second.
THE VPS SETUP
I went with Vultr — $5/month for a small Ubuntu server. Any VPS provider works. You need:
The bot script running as a systemd service so it auto-restarts if it crashes. An SSH tunnel to the cloud phone running as another systemd service so it auto-reconnects if the connection drops. ADB to talk to the phone through the tunnel. Python with the dependencies installed.
The SSH tunnel creates a link so a local port on your VPS connects to the cloud phone's ADB port. The bot script connects to this local port using uiautomator2. autossh keeps the tunnel alive and sshpass handles the password so it's fully automatic.
If VMOS rotates your port (which it does sometimes), you just update the tunnel config and restart. Takes 30 seconds.
COST BREAKDOWN
VPS (1 CPU, 1GB RAM): $5/month
Cloud Phone (1 device): $3-8/month depending on provider and plan
Total: roughly $8-13/month per account
No API fees, no proxies needed (the cloud phone has its own IP), no captcha solvers. Scale by adding more cloud phones.
WHAT I'D DO DIFFERENTLY
Start with keyboard tapping from day one. I wasted accounts using ADB input text before realizing it was detectable.
Build the intervention system early. Having the bot pause and ask for help instead of crashing saves so much headache.
Rotate everything — titles, images (real different images, not just re-crops), posting times, even the order you visit subreddits if you post to multiple.
Don't delete-and-repost. Just let posts live.
Build karma first before starting automated posting. Comment, upvote, browse around, participate for a few days manually so the account looks real.
Test on a throwaway account first. Don't burn your main.
TL;DR
Use a cloud Android phone instead of Reddit's API. Control it with uiautomator2 in Python. Type by tapping actual keyboard keys, never ADB injection. Make swipes curved and human-like. Rotate titles and images. Run it on a $5 VPS with Telegram as the remote control. Build an intervention system so the bot asks for help instead of crashing. Total cost around $10/month. Everything is customizable for your specific use case.
If anyone has questions about the setup, drop them below.
(I used AI to help me compile all of this, sorry if anyone is offended by it)
THE IDEA
I wanted to automate posting on Reddit — same subreddit, on a schedule, completely hands-free. But here's the thing: Reddit doesn't have a great API for posting images easily, and even if it did, API-based bots get flagged fast. So I went a different route.
Instead of using Reddit's API, I built a bot that controls an actual Android phone and taps through the Reddit app like a real person would. The whole thing runs on a cheap cloud server ($5/month) and I control it from Telegram on my phone. One button to start, one button to stop. You can customize it for any subreddit, any posting schedule, any title format.
THE SETUP (BIG PICTURE)
Here's how the pieces fit together:
Your Phone (Telegram) → Cloud Server (VPS) → Cloud Android Phone (VMOS) → Reddit App
Telegram Bot — this is your remote control. You open Telegram, see a dashboard, tap Start or Stop.
VPS (Virtual Private Server) — a tiny Linux server in the cloud that runs the bot script 24/7. Think of it as a computer that never turns off. I used Vultr, costs $5/month.
VMOS Cloud Phone — a real Android phone running in the cloud. It has Reddit installed on it just like your phone does. The bot connects to this phone and taps buttons, types text, scrolls — everything you'd do with your thumb.
Reddit App — just the normal Reddit app. No modded APK, no special version. The phone doesn't know it's being automated.
All of this is customizable. You pick the VPS provider, the cloud phone provider, the subreddit, the schedule — everything.
WHY A CLOUD PHONE INSTEAD OF AN API?
Most people who automate Reddit use the API (PRAW, etc). The problem:
API posts look different — Reddit can tell when a post came from the API vs the app. API posts have different metadata.
Image posting through API is annoying — especially with galleries, flairs, NSFW tags.
Behavioral fingerprinting — when you use the API, there's no scrolling, no browsing, no human-like activity. It's just a POST request and done. Reddit's anti-spam picks this up.
With a cloud phone, the bot literally opens Reddit, scrolls through feeds, navigates to your subreddit, taps Create, types the title letter by letter on the keyboard, attaches the image, and hits Post. From Reddit's perspective, it looks like a person using the app.
THE TECH STACK
Python — the bot script. Nothing fancy, no frameworks.
uiautomator2 — a Python library that lets you control an Android phone programmatically. Tap buttons, type text, swipe, read what's on screen — all by referencing UI element IDs.
VMOS Cloud — the cloud phone service. They give you an Android device running in their cloud with SSH and ADB access.
Telegram Bot API (pyTelegramBotAPI) — for the remote control interface.
autossh + sshpass — keeps the connection between your VPS and the cloud phone alive 24/7. If it drops, it reconnects automatically.
systemd — Linux's built-in service manager. Makes sure the bot and the SSH tunnel restart if they crash.
You can swap out any of these. Different cloud phone provider, different messaging app for the controller, different VPS — the concept stays the same.
HOW THE BOT ACTUALLY WORKS
Each posting cycle goes through three phases. The subreddit, title, flair, and timing are all configurable at the top of the script.
Phase 1 — Clean Up:
Kill Reddit app completely so every cycle starts fresh. Open Reddit, go to profile, check if there's an old post. If there is, delete it (optional — you can turn this off).
Phase 2 — Prep the Image:
Open the gallery, crop the image slightly with a random crop so the image hash changes every time. Reddit detects duplicate images, so this helps dodge that. Save it, delete the original.
Phase 3 — Post:
Scroll through the home feed for a while to act like a human browsing. Find your target subreddit. Scroll through the subreddit feed. Tap Create. Type the title using the on-screen keyboard, letter by letter, tapping each key. Attach the image from gallery. Hit Post. Wait for it to go live. Open the post and set the flair.
The whole cycle takes about 7-8 minutes depending on how many scrolls you configure. Then it sleeps for a customizable interval (I use around an hour with random jitter) and does it again.
THE BIGGEST LESSONS I LEARNED
These cost me accounts before I figured them out. If you're building something like this, learn from my mistakes.
NEVER use ADB input text
This was my biggest mistake. When you type text on Android programmatically, there are two ways to do it:
The wrong way — "input text" (ADB command). This injects text directly into the field. It's fast and easy, but the app can detect it because there are zero keystroke events. The text just magically appears in the field with no typing activity. Reddit can see this.
The right way — tapping keyboard keys by their resource IDs. You find each key on Gboard (every key has a unique ID based on its row and column position), and you tap them one by one with small random delays between each tap. This is identical to a real human typing. You can map out all the keys using WEditor (more on that below).
I had "input text" as a silent fallback in my code — if a keyboard key wasn't found, it would quietly fall back to ADB injection without telling me. I didn't even realize it was firing. Every time it did, that post probably got flagged. Remove every single "input text" and "input keyevent" from your code. If a key isn't found, the script should STOP and tell you, not silently cheat.
Straight-line swipes are robotic
My first scroll implementation was a simple swipe from point A to point B — perfectly straight, constant speed. A real thumb doesn't move like that. It curves, drifts sideways a little, wobbles, speeds up at the start, and slows down at the end.
I switched to multi-point swipes with random X drift (thumb moves sideways slightly during the swipe), small wobble on each intermediate point, ease-in-out speed curve (starts slow, speeds up, slows down again), and 4-6 intermediate points per swipe instead of just two endpoints. Makes it way more natural.
Same title every post = instant flag
I was posting the exact same title every single time. Reddit's spam filter catches this immediately. The fix is simple — rotate your titles. Even small variations help. You can keep a pool of different titles and pick one randomly each cycle, or use a base title with small rotating elements (like swapping the emoji at the end each time). Whatever fits your use case.
Delete-and-repost is a known spam pattern
My bot deleted the old post before making a new one to avoid duplicates on the profile. Reddit sees this pattern: post, delete, post, delete, post, delete. That's textbook manipulation — you're recycling your slot to stay visible. If you can, just let old posts age naturally instead of deleting them.
Your reactions are too fast
When the bot finds an element on screen, it clicks it instantly — within milliseconds. A human has 200-800ms of reaction time. They see the button, their brain processes it, their thumb moves to it. Add random delays between detecting an element and clicking it. Small thing, big difference.
The posting interval matters
Posting every exactly 60 minutes is a pattern. Use a base interval with random jitter — so some posts are 52 minutes apart, others 67 minutes apart. It shouldn't look like a clock schedule. The base interval and jitter range are configurable in the script.
FINDING UI ELEMENT IDs WITH WEDITOR
This is probably the most tedious part of the whole project. You need to know the resource ID of every button, field, and menu item the bot needs to interact with.
WEditor is a web-based tool that comes with uiautomator2. You connect it to your Android device and it shows you a live screenshot with a tree of all UI elements. Click on any element and it shows you its resource ID, text, index, description, and class name.
Always prefer resource IDs over text labels. Text can change (autocorrect, language, A/B tests Reddit runs), but resource IDs are stable across versions. Use text as a fallback only.
You'll need to map out every element in your specific flow — the navigation buttons, the post creation screen, the title field, the image picker, the flair selector, the keyboard keys. Every subreddit and every phone resolution might have slightly different layouts, so you need to do this yourself for your setup.
The Gboard keyboard follows a grid pattern where each key has an ID based on its row and column. Once you map the alphabet, numbers, and common symbols, you can type anything without ever touching ADB injection.
CONTROLLING IT FROM TELEGRAM
The Telegram interface is designed to be used on your phone with one thumb. It shows one status line per account with an emoji indicating the state (running, stopped, sleeping, error, or needs help), the current step, timing info, and post count. Two buttons — Start/Stop and Refresh. That's it.
Messages auto-delete to keep the chat clean. Only the dashboard stays.
The best feature: when the bot gets stuck (unexpected popup, element not found, Reddit being weird), it doesn't crash. Instead it pauses and sends you a message explaining what went wrong and exactly what screen the app needs to be on before you tap Resume. You go fix it on the cloud phone manually, tap Resume, and it picks up right where it left off. This saves a ton of time compared to the bot just dying and you having to restart the whole cycle.
You can run multiple accounts too — each one gets its own line on the dashboard with its own Start/Stop button. They run independently with staggered timing so they don't all post at the same second.
THE VPS SETUP
I went with Vultr — $5/month for a small Ubuntu server. Any VPS provider works. You need:
The bot script running as a systemd service so it auto-restarts if it crashes. An SSH tunnel to the cloud phone running as another systemd service so it auto-reconnects if the connection drops. ADB to talk to the phone through the tunnel. Python with the dependencies installed.
The SSH tunnel creates a link so a local port on your VPS connects to the cloud phone's ADB port. The bot script connects to this local port using uiautomator2. autossh keeps the tunnel alive and sshpass handles the password so it's fully automatic.
If VMOS rotates your port (which it does sometimes), you just update the tunnel config and restart. Takes 30 seconds.
COST BREAKDOWN
VPS (1 CPU, 1GB RAM): $5/month
Cloud Phone (1 device): $3-8/month depending on provider and plan
Total: roughly $8-13/month per account
No API fees, no proxies needed (the cloud phone has its own IP), no captcha solvers. Scale by adding more cloud phones.
WHAT I'D DO DIFFERENTLY
Start with keyboard tapping from day one. I wasted accounts using ADB input text before realizing it was detectable.
Build the intervention system early. Having the bot pause and ask for help instead of crashing saves so much headache.
Rotate everything — titles, images (real different images, not just re-crops), posting times, even the order you visit subreddits if you post to multiple.
Don't delete-and-repost. Just let posts live.
Build karma first before starting automated posting. Comment, upvote, browse around, participate for a few days manually so the account looks real.
Test on a throwaway account first. Don't burn your main.
TL;DR
Use a cloud Android phone instead of Reddit's API. Control it with uiautomator2 in Python. Type by tapping actual keyboard keys, never ADB injection. Make swipes curved and human-like. Rotate titles and images. Run it on a $5 VPS with Telegram as the remote control. Build an intervention system so the bot asks for help instead of crashing. Total cost around $10/month. Everything is customizable for your specific use case.
If anyone has questions about the setup, drop them below.
(I used AI to help me compile all of this, sorry if anyone is offended by it)