A python library created to make life easier for Telegram API Developers.

Overview

opentele

documentation github last commit github commits issues workflow build pypi status pypi version pypi installs license


A python library created to make life easier for Telegram API Developers. Read the documentation

Features

Dependencies

  • telethon - Widely used Telegram's API library for Python.
  • tgcrypto - AES-256-IGE encryption to works with tdata.
  • pyQt5 - Used by Telegram Desktop to streams data from files.

Installation

  • Install from PyPI:
pip install --upgrade opentele

First Run

Load TDesktop from tdata folder and convert it to telethon, with a custom API:

from opentele.td import TDesktop
from opentele.tl import TelegramClient
from opentele.api import API, CreateNewSession, UseCurrentSession
import asyncio

async def main():
    
    # Load TDesktop client from tdata folder
    tdataFolder = "Path\\To\\tdata"
    tdesktop = TDesktop(tdataFolder)

    # Using official iOS API with randomly generated device info
    # print(api) to see more
    api = API.TelegramIOS.Generate()

    # Convert TDesktop session to telethon client
    # CreateNewSession flag will use the current existing session to
    # authorize the new client by `Login via QR code`.
    client = await tdesktop.ToTelethon("newSession.session", CreateNewSession, api)

    # Although Telegram Desktop doesn't let you authorize other
    # sessions via QR Code (or it doesn't have that feature),
    # it is still available across all platforms (APIs).

    # Connect and print all logged in devices
    await client.connect()
    await client.PrintSessions()

asyncio.run(main())

Authorization

opentele offers the ability to use official APIs, which are used by official apps. You can check that out here.

According to Telegram TOS: all accounts that sign up or log in using unofficial Telegram API clients are automatically put under observation to avoid violations of the Terms of Service.

It also uses the lang_pack parameter, of which telethon can't use because it's for official apps only.
Therefore, there are no differences between using opentele and official apps, the server can't tell you apart.

Incoming Features

  • Writing data to tdata for converting telethon sessions to tdesktop.
  • Random device information for initConnection to avoid spam-detection.
  • Add support for pyrogram.

Documentation documentation

Comments
  • tdesk.isLoaded() failed assertion with new tdatas

    tdesk.isLoaded() failed assertion with new tdatas

    Describe the bug You can capture the problem if you'll try to import fresh new tdatas, I think tdata folder structure was changed by Telegram

    To Reproduce Steps to reproduce the behavior:

    1. Get fresh new tdata
    2. Try to load it with TDesktop

    Expected behavior Loaded tdesk object with account(s) loaded

    Snippet

        try:
            tdesk = TDesktop(f"{tdata}")
            assert tdesk.isLoaded()
        except:
            print('No accounts loaded, skipping')
            accounts_not_loaded += 1
            continue
    
    bug 
    opened by Chronosms 5
  • Can I use a proxy? Thank you

    Can I use a proxy? Thank you

    Can I use a proxy? Thank you

    tdesk = await client.ToTDesktop(flag=UseCurrentSession)
    
    // like
    client = TelegramClient('sessions.session',111,'c1111111119',proxy=('socks5','127.0.0.1',8080))
    
    enhancement 
    opened by AtlantisDe 5
  • {Bug}

    {Bug}

    Hi. can help Fixed

    'C:\Users\Administrator\Downloads\Compressed\Telegram-noborderz-main\Telegram-noborderz-main\sessions>1.py Traceback (most recent call last): File "C:\Users\Administrator\Downloads\Compressed\Telegram-noborderz-main\Telegram-noborderz-main\sessions\1.py", line 29, in asyncio.run(main()) File "C:\Python310\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Python310\lib\asyncio\base_events.py", line 646, in run_until_complete return future.result() File "C:\Users\Administrator\Downloads\Compressed\Telegram-noborderz-main\Telegram-noborderz-main\sessions\1.py", line 10, in main tdesk = TDesktop(tdataFolder) File "C:\Python310\lib\site-packages\opentele\td\tdesktop.py", line 141, in init self.LoadTData() File "C:\Python310\lib\site-packages\opentele\td\tdesktop.py", line 216, in LoadTData raise e File "C:\Python310\lib\site-packages\opentele\td\tdesktop.py", line 203, in LoadTData self.__loadFromTData() File "C:\Python310\lib\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData Expects(len(self.accounts) > 0, "No account has been loaded") File "C:\Python310\lib\site-packages\opentele\exception.py", line 326, in Expects raise exception File "C:\Python310\lib\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData Expects(len(self.accounts) > 0, "No account has been loaded") opentele.exception.OpenTeleException: Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData() ]'

    bug 
    opened by lolminerxmrig 3
  • Too many requests (caused by InviteToChannelRequest)

    Too many requests (caused by InviteToChannelRequest)

    Hey. Could you help me to find out how to avoid the error "Too many requests (caused by InviteToChannelRequest)", when I do inviting from a few accounts(one after another) I got this error on a the second account. I guess the Telegram sees that my two accounts have some similar data, like default app_id/app_hash or smgth?!

    Should I generate a new API or smgth like that to show that I user different account?

    My code: tdesk = TDesktop(tdata_path) async with await TelegramClient.FromTDesktop(tdesk, flag=UseCurrentSession, proxy=ipv4_sock5_proxy,connection_retries=3, receive_updates=False)

    P.S Help me understand how to use your library through tdata format account, so that the Tlegram does not consider that my conditionally 5 accounts are the same and does not restrict them as one and the same, and in general is it possible to use your library so, if not, how? Do I need to generate API for UsingCurrentSession or not, how that work?

    bug 
    opened by Ch4ttY 1
  • RecursionError: maximum recursion depth exceeded withing converting

    RecursionError: maximum recursion depth exceeded withing converting

    Describe the bug RecursionError: maximum recursion depth exceeded

    To Reproduce Steps to reproduce the behavior: Run example

    from opentele.td import TDesktop
    from opentele.tl import TelegramClient
    from opentele.api import API, UseCurrentSession, CreateNewSession
    import asyncio
    
    async def main():
    
        # Load TDesktop client from tdata folder
        tdataFolder = r"F:\Telegram Desktop\tdata"
        tdesk = TDesktop(tdataFolder)
        
        # Check if we have loaded any accounts
        assert tdesk.isLoaded()
    
        # flag=UseCurrentSession
        #
        # Convert TDesktop to Telethon using the current session.
        client = await tdesk.ToTelethon(session="telethon.session", flag=CreateNewSession)
        
        # Connect and print all logged-in sessions of this client.
        # Telethon will save the session to telethon.session on creation.
        await client.connect()
        await client.PrintSessions()
    
    asyncio.run(main())
    

    Expected behavior Loaded account and .session output

    Screenshots If applicable, add screenshots to help explain your problem.

    Additional context

    File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 677, in api
        self.owner.api = self.api
        ^^^^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\tdesktop.py", line 666, in api
        account.api = value
        ^^^^^^^^^^^
      File "c:\Users\SeB4ik\Desktop\checker\venv\Lib\site-packages\opentele\td\account.py", line 676, in api
        if self.owner.api != self.api:
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
    RecursionError: maximum recursion depth exceeded
    
    bug 
    opened by RiujiX 0
  • No account has been loaded

    No account has been loaded

    Python version: 3.8.2 Pip version: 22.3.1 Operation System: Windows 10 (10.0.19044)

    Tdata: Снимок экрана 2022-12-13 233245

    Code:

    from opentele.td import TDesktop
    from opentele.tl import TelegramClient
    from opentele.api import API, UseCurrentSession
    import asyncio
    
    async def main():
    
        # Load TDesktop client from tdata folder
        tdataFolder = r"C:\Users\Alex\Downloads\15\79872317223\tdata"
        tdesk = TDesktop(tdataFolder)
        
        # Check if we have loaded any accounts
        assert tdesk.isLoaded()
    
        # flag=UseCurrentSession
        #
        # Convert TDesktop to Telethon using the current session.
        client = await tdesk.ToTelethon(session="telethon.session", flag=UseCurrentSession)
        
        # Connect and print all logged-in sessions of this client.
        # Telethon will save the session to telethon.session on creation.
        await client.connect()
        await client.PrintSessions()
    
    asyncio.run(main())
    

    Error:

    Traceback (most recent call last):
      File "test.py", line 63, in <module>
        asyncio.run(main())
      File "C:\Program Files\Python38\lib\asyncio\runners.py", line 43, in run
        return loop.run_until_complete(main)
      File "C:\Program Files\Python38\lib\asyncio\base_events.py", line 616, in run_until_complete
        return future.result()
      File "test.py", line 48, in main
        tdesk = TDesktop(tdataFolder)
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 141, in __init__ 
        self.LoadTData()
    PS D:\Code\Python\TgTool> py test.py
    Traceback (most recent call last):
      File "test.py", line 25, in <module>
        asyncio.run(main())
      File "C:\Program Files\Python38\lib\asyncio\runners.py", line 43, in run
        return loop.run_until_complete(main)
      File "C:\Program Files\Python38\lib\asyncio\base_events.py", line 616, in run_until_complete
        return future.result()
      File "test.py", line 10, in main
        tdesk = TDesktop(tdataFolder)
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 141, in __init__ 
        self.LoadTData()
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 216, in LoadTData
        raise e
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 203, in LoadTData
        self.__loadFromTData()
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData
        Expects(len(self.accounts) > 0, "No account has been loaded")
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\exception.py", line 326, in Expects
        raise exception
      File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData
        Expects(len(self.accounts) > 0, "No account has been loaded")
    opentele.exception.OpenTeleException: Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData() ]
    
    bug 
    opened by AleksFimin 0
  • Dont work (

    Dont work (

    File "C:\Users\ns\AppData\Local\Programs\Python\Python39\lib\site-packages\opentele\td\storage.py", line 310, in ReadFile raise tries_exception if tries_exception else TFileNotFound( opentele.exception.TFileNotFound: TFileNotFound: Could not open key_data [ Called by ReadFile() ]

    bug 
    opened by w1ld32 2
  • Missing emum lskCustomEmojiKeys caused tdata loading fail

    Missing emum lskCustomEmojiKeys caused tdata loading fail

    Telegram add a value named lskCustomEmojiKeys in (https://github.com/telegramdesktop/tdesktop/commit/ddd5021966568a7d999aa6d35cd069a6fbc2aa3b)

    so opentele can not load tdata when find this key

    it will raise an exception here

    https://github.com/thedemons/opentele/blob/ff90c36a867cf7902e80f480a35041c5e7902e4c/src/td/account.py#L214

    opened by qwqdanchun 1
  • RuntimeError: Event loop is closed

    RuntimeError: Event loop is closed

    Hello, I am using ".session to tdata" feature. But it gives error:

    Traceback (most recent call last):
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\proactor_events.py", line 116, in __del__
        self.close()
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\proactor_events.py", line 108, in close
        self._loop.call_soon(self._call_connection_lost, None)
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 750, in call_soon
        self._check_closed()
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 515, in _check_closed
        raise RuntimeError('Event loop is closed')
    RuntimeError: Event loop is closed
    Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x0000019F5C6B1CF0>
    Traceback (most recent call last):
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\proactor_events.py", line 116, in __del__
        self.close()
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\proactor_events.py", line 108, in close
        self._loop.call_soon(self._call_connection_lost, None)
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 750, in call_soon
        self._check_closed()
      File "C:\Users\honur\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 515, in _check_closed
        raise RuntimeError('Event loop is closed')
    RuntimeError: Event loop is closed
    

    I think its something about async but could not figure it out. Can you help?

    opened by drdoof2019 5
Owner
discord: thedemons#8671
null
A smooth and powerful Telegram Userbot made to make Telegram easier.

| Xᴇɴᴏ Bᴏᴛ Is One Of The Fastest & Smoothest Bot On Telegram Based on Telethon|

SimpleBoy 1 Dec 1, 2021
Just a python library to make reddit post caching easier

Reddist Just a python library to make reddit post caching easier. Caching Options In Memory Caching Redis Caching Pickle Caching Usage Installation: D

Samrid Pandit 3 Jan 16, 2022
domhttpx is a google search engine dorker with HTTP toolkit built with python, can make it easier for you to find many URLs/IPs at once with fast time.

domhttpx is a google search engine dorker with HTTP toolkit built with python, can make it easier for you to find many URLs/IPs at once with fast time

Naufal Ardhani 59 Dec 4, 2022
Framework to make using Bottle less time-consuming and easier

A class for the Bottle API to reduce clutter and difficulty while creating a website.

Tygzy 0 Dec 26, 2022
The purpose of this bot is to take soundcloud track requests, that are posted in the stream-requests channel, and add them to a playlist, to make the process of scrolling through the requests easier for Root

Discord Song Collector Dont know if anyone is actually going to read this, but the purpose of this bot is to check every message in the stream-request

null 2 Mar 1, 2022
A Telegram Repo For Devs To Controll The Bots Under Maintenance.This Bot Is For Developers, If Your Bot Is Down, Use This Repo To Give Your Dear Subscribers Some Support By Providing Them Response.

Maintenance Bot A Telegram Repo For Devs To Controll The Bots Under Maintenance About This Bot This Bot Is For Developers, If Your Bot Is Down, Use Th

Vɪᴠᴇᴋ 47 Dec 29, 2022
A Telegram Repo For Devs To Controll The Bots Under Maintenance.This Bot Is For Developers, If Your Bot Is Down, Use This Repo To Give Your Dear Subscribers Some Support By Providing Them Response.

Maintenance Bot A Telegram Repo For Devs To Controll The Bots Under Maintenance About This Bot This Bot Is For Developers, If Your Bot Is Down, Use Th

Vɪᴠᴇᴋ 47 Dec 29, 2022
The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

Python wrapper for Spyse API The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

Spyse 15 Nov 22, 2022
pyDuinoCoin is a simple python integration for the DuinoCoin REST API, that allows developers to communicate with DuinoCoin Master Server

PyDuinoCoin PyDuinoCoin is a simple python integration for the DuinoCoin REST API, that allows developers to communicate with DuinoCoin Main Server. I

BackrndSource 6 Jul 14, 2022
Asyncevents: a small library to help developers perform asynchronous event handling in Python

asyncevents - Asynchronous event handling for modern Python asyncevents is a small library to help developers perform asynchronous event handling in m

Mattia 5 Aug 7, 2022
A simple use library for bot discord.py developers

Discord Bot Template It's a simple use library for bot discord.py developers. Ob

Tir Omar 0 Oct 16, 2022
Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API.

Tg_PHub_Bot Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API. OS Support All linu

TheProgrammerCat 13 Oct 21, 2022
null 1 Feb 18, 2022
CRUD database for python discord bot developers that stores data on discord text channels

Discord Database A CRUD (Create Read Update Delete) database for python Discord bot developers. All data is stored in key-value pairs directly on disc

Ankush Singh 7 Oct 22, 2022
Algofi Python SDK is useful for developers who want to programatically interact with the Algofi lending protocol

algofi-py-sdk Algofi Python SDK Documentation https://algofi-py-sdk.readthedocs.

Algofi 41 Dec 15, 2022
Telegram bot to stream videos in telegram voicechat for both groups and channels. Supports live strams, YouTube videos and telegram media.

Telegram VCVideoPlayBot An Telegram Bot By @ZauteKm To Stream Videos in Telegram Voice Chat. NOTE: Make sure you have started a VoiceChat in your Grou

Zaute 20 Oct 21, 2022
Telegram bot to stream videos in telegram voicechat for both groups and channels. Supports live strams, YouTube videos and telegram media.

Telegram bot to stream videos in telegram voicechat for both groups and channels. Supports live strams, YouTube videos and telegram media.

SUBIN 449 Dec 27, 2022
trackbranch is a tool for developers that can be used to store collections of branches in the form of profiles.

trackbranch trackbranch is a tool for developers that can be used to store collections of branches in the form of profiles. This can be useful for sit

Kevin Morris 1 Oct 21, 2021