Rᴇɴᴅʏ Pʀᴏɪᴇᴄᴛs
224 subscribers
1.04K photos
29 videos
17 files
743 links
tgcore is open source. Built for production Telegram apps.

https://github.com/TeamKillerX/tgcore/
Download Telegram
Top:
When you use Pyrogram + FastAPI
but your bot runtime goes down without webhook

Bottom:
Meanwhile tgcore:
Sleeping… still sending messages automatically.
ev tg.base_url = "https://tgcore.ryzenths.dpdns.org"

kw = await tg._post(
"/api/web/pinterest",
payload={"query": "pocong"}
)
if not kw["ok"]:
return None

await tg.raw.sendPhoto(
chat_id=m.chat.id,
caption="Result from Pinterest",
photo=kw["data"]["pins"][0]["media"]["images"]["orig"]["url"]
).execute()
Result from Pinterest
Years later… still playing with userbot and eval.
Meanwhile real devs are building APIs, docs, and ecosystems.
started with telethon userbots back in 2019
lost accounts, yeah it happens
now i'm building my own tgcore engine
solo dev, no team yet
if you're still running userbots, keep going
this channel isn't about that anymore
no more userbot updates
source code comes as paid zip
⚡1💯1
This channel is no longer private.

Now public: https://t.me/tgcore_dev

Join if you want.
Snippet code:
kw = await tg._post(
"/api/web/pinterest/download",
payload={"pinUrl": "https://pinterest.com/pin/579205202127386072"}
)
if not kw["ok"]:
return None

y = tg.to_obj(kw)
urls = []
for x in y.data.pins.media_urls:
if x.type == "image":
urls.append(x.url)
if not urls:
return "No url"
return urls
The TGCore button builder can be used directly with Pyrogram without creating a Client() instance. TGCore simply creates a reply_markup object, and Pyrogram then sends the message.

Example of using one button:
from tgcore import ButtonExamples
from pyrogram.enums import ButtonStyle

reply_markup = ButtonExamples.style(
"custom name",
ButtonStyle.SUCCESS,
url="https://google.com"
)

Bots can still use the regular Pyrogram send_message, but the reply markup is generated by TGCore.

Available button functions:
ButtonExamples.url()
Create a button that opens a link.

ButtonExamples.callback()
Create a button with data callback for bot interaction.

ButtonExamples.style()
Create a button with additional styles.

Parameters style:
text
style
url
callback_data
copy_text
**kw

For simple buttons, one line is enough.

If you want to create several buttons in several rows, you can use KeyboardBuilder().

Multiple button example:
from tgcore import KeyboardBuilder

keyboard = (KeyboardBuilder().url("....", "....").url("....", "https://....").row().url(".....", "https://...").build())

Essentially, TGCore serves as a builder layer for buttons and markup, while Pyrogram remains used to send messages to Telegram.

So the flow is:
Pyrogram = send_message
TGCore = build keyboard / button

The advantage is that developers do not need to write the InlineKeyboardMarkup structure manually.
Me: tgcore is simple

opens message BaseModel = 2000 lines

Don't click Expand all ☠️
Telegram full API is a big monster
One message object = 100 optional fields.
Updating Telegram models be like:
+60 lines changed
Welcome to the monster.💀
Telegram Bot API update log:
Added a few features
+207 lines
Python is simple.
Telegram API models are not. 💀
Expand all

My phone:
System UI isn't responding.
Learn Python ❌
Learn Telegram API ☠️
ev from tgcore import KeyboardBuilder

kw = await tg._post(
"/api/web/tiktok/download",
payload={"url": "https://vt.tiktok.com/ZSMdyXqXd/"}
)
_ = tg.to_obj(kw)
if not _.ok or not _.data:
return None

await tg.raw.sendVideo(
chat_id=m.chat.id,
video=_.data.data.play,
caption=_.data.data.title,
cover=_.data.data.cover,
reply_markup=(
KeyboardBuilder()
.copy_text("Ok", "Ok")
.build()
)
).execute()
Please open Telegram to view this post
VIEW IN TELEGRAM
Tgcore Changelog Update!

- Add tg.fetch_post(path, something=something, check_errors=True)
- Add tg.kb()

You can python-telegram-bot or Pyrogram

tg = Client(api_key="ignore", base_url="https://example.com")

this = await tg.fetch_post("/api/todo", url=url, check_errors=True)

Logic return {"ok": True, "data", data}

this.data for object
this["data"] for raw (check_errors=False)

tg.kb().add()
tg.kb().url()