On a schedule
Approve article posts for X in Telegram
New articles from your feeds become X post drafts in Telegram, and one tap publishes the ones worth sharing.
- Runs
- On a schedule
- Apps
- Telegram, X
- AI
- Yes, uses the built-in AI allowance
- Access
- bot token; tweet.write
Send this to your assistant
Create a ClickRuntime automation: every hour, check my feeds for new articles, write an X post for each, send it to me on Telegram with Post and Skip buttons, and only publish what I approve.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Sharing good articles keeps an X account useful, but not every article in a feed is worth putting your name to. Posting everything automatically risks sharing something off-topic or wrong, and checking every item by hand on a laptop is slow.
Turning each new article into a ready draft on your phone, with a Post button, gives you the speed of automation and the judgement of a person. Good articles go out in seconds; the rest are skipped.
What you get out of it
Your judgement, without the typing
You decide what goes out, but the post is already written. Approving takes one tap.
Review on the move
Drafts arrive in Telegram, so you can approve them from your phone wherever you are.
Fewer off-topic posts
Nothing posts on its own, so an odd article in a feed never reaches your followers by accident.
Each article handled once
Articles are remembered once drafted, so you are never asked about the same one twice.
How it works
What happens, step by step
Every hour ClickRuntime checks your feeds for articles it has not seen before.
AI writes a short X post for each new article with its link.
Each draft is sent to you in Telegram with Post and Skip buttons.
Tapping Post publishes it on X; each draft can only be posted once.
Before it runs live
- Connect Telegram
- Connect X
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Telegram and X steps into one automation
Under the hood
The code that runs this automation
import uuid
import feedparser
from clickruntime import on_trigger, on_event, report_fetched, credentials, http, state, ai
FEEDS = ["https://blog.example.com/feed"]
MY_CHAT = 123456789
def tg(method, **params):
return http.post(f"https://api.telegram.org/bot{credentials.secret('TELEGRAM_BOT_TOKEN')}/{method}", json=params).json()
@on_trigger
def check(event):
seen = set(state.get("seen") or [])
new = [e for url in FEEDS for e in feedparser.parse(url).entries[:10] if e.link not in seen]
report_fetched(len(new))
if not new:
return {"drafts": 0}
for e in new:
text = ai.generate(f"Write an X post under 230 characters sharing: {e.title}", max_output_tokens=90).text.strip() + f"\n{e.link}"
key = uuid.uuid4().hex[:12]
state.set(f"draft:{key}", text)
tg("sendMessage", chat_id=MY_CHAT, text=text, reply_markup={"inline_keyboard": [[
{"text": "Post", "callback_data": f"post:{key}"}, {"text": "Skip", "callback_data": f"skip:{key}"}]]})
state.set("seen", (list(seen) + [e.link for e in new])[-500:])
return {"drafts": len(new)}
@on_event
def tap(event):
cb = (event.json or {}).get("callback_query") or {}
if cb.get("from", {}).get("id") != MY_CHAT:
return {"ignored": True}
action, key = cb.get("data", ":").split(":", 1)
text = state.get(f"draft:{key}")
state.delete(f"draft:{key}")
if action == "post" and text:
http.post("https://api.x.com/2/tweets", headers={"Authorization": "Bearer " + credentials.connection("x", "main")},
json={"text": text[:280]}).raise_for_status()
tg("answerCallbackQuery", callback_query_id=cb["id"], text="Posted" if action == "post" and text else "Skipped")
return {"action": action}FAQ
Common questions
Can I add newsletters as sources?
What happens to drafts I ignore?
Can someone else approve?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Post crypto news summaries to X and Telegram
Breaking crypto news from your chosen feeds is summarised in a line or two and posted to X and your Telegram channel.
See how it worksApprove AI-written X posts in Telegram
Each day AI drafts posts for your X account and sends them to Telegram, where one tap publishes the ones you like.
See how it worksShare the best posts from your sources on X
Every few hours the most interesting article from sources you follow is shared on X with your own comment, and you get a note in Telegram.
See how it worksKeep exploring
Set up “Approve article posts for X in Telegram” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.