A lightweight Python wrapper for the IG Markets API

Overview
Latest Version Supported Python versions Wheel format License Development Status Downloads monthly Requirements Status Documentation Status Test Coverage

trading_ig

A lightweight Python wrapper for the IG Markets API. Simplifies access to the IG REST and Streaming APIs with a live or demo account.

What is it?

IG Markets provides financial spread betting and CFD platforms for trading equities, forex, commodities, indices, cryptocurrencies, bonds, rates, options and more.

IG provide APIs so that developers can access their platforms programmatically. Using the APIs you can get live and historical data, automate your trades, or create apps. For details about the IG APIs please see their site:

https://labs.ig.com/

NOTE: this is not an IG project. Use it at your own risk

Installation

From Python package index:

$ pip install trading_ig

with Poetry:

$ git clone https://github.com/ig-python/ig-markets-api-python-library
$ cd ig-markets-api-python-library
$ poetry install

or with optional packages:

$ poetry install --extras "pandas munch"

From source:

$ git clone https://github.com/ig-python/ig-markets-api-python-library
$ cd ig-markets-api-python-library
$ python setup.py install

or direct from Github:

$ pip install git+https://github.com/ig-python/ig-markets-api-python-library

Dependencies

For full details, see pyproject.toml

Docs

https://trading_ig.readthedocs.io/

License

BSD (See LICENSE)

Comments
  • Open and close position with API

    Open and close position with API

    'm trying using API and i want open a position.

    I'm following the Documentation and i'm in

    https://labs.ig.com/rest-trading-api-reference/service-detail?id=542

    I'm using POST request but i understand some params like:

    currencyCode,dealReferenc, expiry, level orderType,quoteID,timeInForce,trilingStop and trilingStopIncrement

    Yes, are practically all params. Can someone explain better me what do this params? Or can someone do a example request and them i try to understand all this.

    Thank you and sorry for my bad english

    opened by StebsV2 22
  • Market data not printed

    Market data not printed

    Hi, I tried the sample with my account, and the log has such error:

    TransientError: ERROR -1: Invalid account type

    I used my LIVE account, which works fine with REST api and minute data, but I want to have tick data with stream api. The account information is exactly the same.

    So, could anyone give me some hint?

    Thanks

    opened by ljcljc 22
  • Issue#82 Encrypt password during login.

    Issue#82 Encrypt password during login.

    The IG API in some countries require an encrypted password during login. Otherwise you'll get an error error.public-api.failure.encryption.required. We get the encryption key first, then create session with the encrypted password.

    Use the optional parameter encryption=True to enable this feature

    from trading_ig import IGService
    from trading_ig.config import config
    
    ig_service = IGService(config.username, config.password, config.api_key, config.acc_type)
    ig_service.create_session(encryption=True)
    
    opened by doggyeh 16
  • Lightstreamer stops after 2 hours

    Lightstreamer stops after 2 hours

    Hello everyone,

    Hope you're all ok in those tough times,

    I have an issue with the lightstreamer stream api : it works fine for about 2 hours and then stops. I have found online that it's a problem with the LOOP that "finishes its natural cycle" so I need to reconnect and subscribe to all the feeds that I had but I can't find a way to detect that "end of cycle".

    I tried to log something everytime I receive a loop message but I don't log anything.

    Please help! It drives me crazy! :)

    Thanks in advance, Sacha

    opened by sacharbit 13
  • sphinx is an unnecessary requirement

    sphinx is an unnecessary requirement

    Not sure when this happened, but suddenly sphinx is a requirement for this project. At least, when I run pip-compile --upgrade, I am seeing the following new requirements:

    snowballstemmer==2.1.0
        # via sphinx
    sphinx==4.2.0
        # via sphinx-rtd-theme
    sphinx-rtd-theme==0.5.2
        # via trading-ig
    sphinxcontrib-applehelp==1.0.2
        # via sphinx
    sphinxcontrib-devhelp==1.0.2
        # via sphinx
    sphinxcontrib-htmlhelp==2.0.0
        # via sphinx
    sphinxcontrib-jsmath==1.0.1
        # via sphinx
    sphinxcontrib-qthelp==1.0.3
        # via sphinx
    sphinxcontrib-serializinghtml==1.1.5
        # via sphinx
    

    I don't think sphinx should be necessary for running this library, and frankly is not a package I'm super happy to be adding as a requirement for my project.

    Is this perhaps a mistake on my end? I can't really see where the sphinx requirement is coming in, other than in https://github.com/ig-python/ig-markets-api-python-library/blob/master/pyproject.toml .

    opened by Doggie52 11
  • Error on LIVE, not on DEMO: KeyError: 'cst'

    Error on LIVE, not on DEMO: KeyError: 'cst'

    Dear @femtotrader, DEMO version is ok. When I change from DEMO to LIVE (username, password etc... are changed), I get the folloging error: KeyError: 'cst' (see below).

    Any help? Thank you in advance, Gilberto

    This is the error output:

    KeyError                                  Traceback (most recent call last)
    <ipython-input-10-de3f99b49acd> in <module>()
         74 
         75 if __name__ == '__main__':
    ---> 76     main()
    
    <ipython-input-10-de3f99b49acd> in main()
         34 
         35     ig_stream_service = IGStreamService(ig_service)
    ---> 36     ig_session = ig_stream_service.create_session()
         37     accountId = ig_session[u'accounts'][0][u'accountId']
         38     ig_stream_service.connect(accountId)
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/stream.py in create_session(self)
         19 
         20     def create_session(self):
    ---> 21         ig_session = self.ig_service.create_session()
         22         self.ig_session = ig_session
         23         return ig_session
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/rest.py in create_session(self, session)
        942         action = 'create'
        943         # this is the first create (BASIC_HEADERS)
    --> 944         response = self._req(action, endpoint, params, session)
        945         data = self.parse_response(response.text)
        946         self.ig_session = data # store IG session
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/rest.py in _req(self, action, endpoint, params, session)
        202         """Creates a CRUD request and returns response"""
        203         session = self._get_session(session)
    --> 204         response = self.crud_session.req(action, endpoint, params, session)
        205         return response
        206 
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/rest.py in req(self, action, endpoint, params, session)
        119             'delete': self.delete
        120         }
    --> 121         return d_actions[action](endpoint, params, session)
        122 
        123     def _set_headers(self, response_headers, update_cst):
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/rest.py in _create_first(self, endpoint, params, session)
         70                                 data=json.dumps(params),
         71                                 headers=self.HEADERS['BASIC'])
    ---> 72         self._set_headers(response.headers, True)
         73         self.create = self._create_logged_in
         74         return response
    
    /Users/gb/anaconda/lib/python3.5/site-packages/trading_ig/rest.py in _set_headers(self, response_headers, update_cst)
        124         """Sets headers"""
        125         if update_cst:
    --> 126             self.CLIENT_TOKEN = response_headers['CST']
        127 
        128         if 'X-SECURITY-TOKEN' in response_headers:
    
    /Users/gb/anaconda/lib/python3.5/site-packages/requests/structures.py in __getitem__(self, key)
         52 
         53     def __getitem__(self, key):
    ---> 54         return self._store[key.lower()][1]
         55 
         56     def __delitem__(self, key):
    
    KeyError: 'cst'
    

    This is the main code (modules and credentials account imports are omitted):

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    """
    IG Markets Stream API sample with Python
    2015 FemtoTrader
    """
    
    import time
    import sys
    import traceback
    import logging
    
    from trading_ig import (IGService, IGStreamService)
    #from trading_ig.config import config
    from trading_ig.lightstreamer import Subscription
    
    
    # A simple function acting as a Subscription listener
    def on_prices_update(item_update):
        # print("price: %s " % item_update)
        print("{stock_name:<19}: Time {UPDATE_TIME:<8} - "
              "Bid {BID:>5} - Ask {OFFER:>5}".format(stock_name=item_update["name"], **item_update["values"]))
    
    def on_account_update(balance_update):
        print("balance: %s " % balance_update)
    
    def main():
        logging.basicConfig(level=logging.INFO)
        # logging.basicConfig(level=logging.DEBUG)
    
        #ig_service = IGService(config.username, config.password, config.api_key, config.acc_type)
        ig_service = IGService(username, password, api_key, acc_type)
    
        ig_stream_service = IGStreamService(ig_service)
        ig_session = ig_stream_service.create_session()
        accountId = ig_session[u'accounts'][0][u'accountId']
        ig_stream_service.connect(accountId)
    
        # Making a new Subscription in MERGE mode
        subcription_prices = Subscription(
            mode="MERGE",
            items=['L1:CS.D.GBPUSD.CFD.IP', 'L1:CS.D.USDJPY.CFD.IP'],
            fields=["UPDATE_TIME", "BID", "OFFER", "CHANGE", "MARKET_STATE"],
            )
            #adapter="QUOTE_ADAPTER")
    
    
        # Adding the "on_price_update" function to Subscription
        subcription_prices.addlistener(on_prices_update)
    
        # Registering the Subscription
        sub_key_prices = ig_stream_service.ls_client.subscribe(subcription_prices)
    
    
        # Making an other Subscription in MERGE mode
        subscription_account = Subscription(
            mode="MERGE",
            items='ACCOUNT:'+accountId,
            fields=["AVAILABLE_CASH"],
            )
        #    #adapter="QUOTE_ADAPTER")
    
        # Adding the "on_balance_update" function to Subscription
        subscription_account.addlistener(on_account_update)
    
        # Registering the Subscription
        sub_key_account = ig_stream_service.ls_client.subscribe(subscription_account)
    
        input("{0:-^80}\n".format("HIT CR TO UNSUBSCRIBE AND DISCONNECT FROM \
        LIGHTSTREAMER"))
    
        # Disconnecting
        ig_stream_service.disconnect()
    
    if __name__ == '__main__':
        main()
    
    opened by alienoia 10
  • error.security.client-token-invalid in create_session()

    error.security.client-token-invalid in create_session()

    It happens after an application is idle for some time. Doing logout() does not help.

    Any ideas?

    See some logs below:
    create_session()
      File "/usr/lib/python3.6/site-packages/trading_ig/rest.py", line 1093, in create_session
        data = self.parse_response(response.text)
      File "/usr/lib/python3.6/site-packages/trading_ig/rest.py", line 236, in parse_response_with_exception
        raise(Exception(response['errorCode']))
    Exception: error.security.client-token-invalid
    
    opened by abialy 9
  • Replace bunch by munch

    Replace bunch by munch

    Use Munch instead of Bunch

    Bunch does not detect python version in python3_compat file. Bunch uses platform.version() instead of sys.version_info. As a result, the python version is set as 2 instead of 3 and generates the following error.

    Traceback (most recent call last):
      File "api_test.py", line 1, in <module>
        from trading_ig import IGService
      File ".../site-packages/trading_ig/__init__.py", line 17, in <module>
        from .rest import IGService
      File ".../site-packages/trading_ig/rest.py", line 15, in <module>
        from .utils import (_HAS_PANDAS, _HAS_BUNCH)
      File ".../site-packages/trading_ig/utils.py", line 21, in <module>
        from infi.bunch import bunchify
      File ".../site-packages/infi/bunch/__init__.py", line 31, in <module>
        from .python3_compat import *
      File ".../site-packages/infi/bunch/python3_compat.py", line 20, in <module>
        iteritems = dict.iteritems
    AttributeError: type object 'dict' has no attribute 'iteritems'
    
    opened by cimourdain 9
  •  [SSL: CERTIFICATE_VERIFY_FAILED]

    [SSL: CERTIFICATE_VERIFY_FAILED]

    Hi, i am testing stream_ig.py and I got this issue

    OError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
    

    ideas?

    thanks

    opened by oliveriopt 9
  • Pandas object to_offset is unhashable

    Pandas object to_offset is unhashable

    https://github.com/ig-python/ig-markets-api-python-library/blob/b5799390752551f28038c258684259636ede8c8f/trading_ig/utils.py#L38

    TypeError: unhashable type: 'pandas._libs.tslibs.offsets.Minute'

    opened by Weizhang2017 8
  • I'm getting lightstreamer deamon not available, what should I do?

    I'm getting lightstreamer deamon not available, what should I do?

    Is there some package I need to install? This is the warning:

    WARNING:trading_ig.lightstreamer:systemd.daemon not available, no watchdog notifications will be sent.
    
    opened by jappeace 8
  • ValueError: columns cannot be a set

    ValueError: columns cannot be a set

    I'm trying to update my code to use the latest version of trading_ig and I'm getting the error below. Can anyone help please? Python 3.10 Pandas 1.5.2 File "site-packages/trading_ig/rest.py", line 895, in fetch_open_positions data = pd.DataFrame(columns=self.colname_unique(cols)) File "site-packages/pandas/core/frame.py", line 639, in init raise ValueError("columns cannot be a set") ValueError: columns cannot be a set

    opened by oliverpolden 3
  • can stream account info but not prices info

    can stream account info but not prices info

    Hi, the following code tries to stream two things :

    • some info on my account
    • some prices

    while the account info are streamed correctly, it seems I never receive the price data, do you know why ? would it be because the config I tried is my demo account config ?

    Thanks in advance

            
    import logging
    
    from trading_ig import IGService, IGStreamService
    from trading_ig.config import config
    from trading_ig.lightstreamer import Subscription
    
    
    def on_prices_update(item_update):
        print("---------- tag on prices update")
        if 0:print("price: %s " % item_update)
        if 0:print(
            "{stock_name:<19}: Time {UPDATE_TIME:<8} - "
            "Bid {BID:>5} - Ask {OFFER:>5}".format(
                stock_name=item_update["name"], **item_update["values"]
            )
        )
    
    def on_update(item):
        print("{UPDATE_TIME:<8} {stock_name:<19} Bid {BID:>5} Ask {OFFER:>5}".format(stock_name=item["name"], **item["values"]))
    
    def on_account_update(balance_update):
        print("---------- tag on account update")
        print("balance: %s " % balance_update)
    
    if 1:logging.basicConfig(level=logging.INFO)
    if 0:logging.basicConfig(level=logging.DEBUG)
    ig_service = IGService(config.username, config.password, config.api_key, config.acc_type, acc_number=config.acc_number)
    ig_stream_service = IGStreamService(ig_service)
    if 1:ig_stream_service.create_session()
    if 0:ig_stream_service.create_session(version='3')
    
    # subscription prices
    subscription_prices = Subscription(
        mode="MERGE",
        #items=["L1:CS.D.GBPUSD.CFD.IP", "L1:CS.D.USDJPY.CFD.IP"], # sample CFD epics
        #items=["L1:CS.D.GBPUSD.TODAY.IP", "L1:IX.D.FTSE.DAILY.IP"], # sample spreadbet epics
        items=["CS.D.EURUSD.MINI.IP"],
        fields=["UPDATE_TIME", "BID", "OFFER", "CHANGE", "MARKET_STATE"],
    )
    if 0:subscription_prices.addlistener(on_prices_update)
    if 1:subscription_prices.addlistener(on_prices2_update)
    sub_key_prices = ig_stream_service.ls_client.subscribe(subscription_prices)
    
    # subscription account
    subscription_account = Subscription(mode="MERGE", items=["ACCOUNT:" + config.acc_number], fields=["AVAILABLE_CASH"],)
    subscription_account.addlistener(on_account_update)
    sub_key_account = ig_stream_service.ls_client.subscribe(subscription_account)
    
    input(
        "{0:-^80}\n".format(
            "HIT CR TO UNSUBSCRIBE AND DISCONNECT FROM \
    LIGHTSTREAMER"
        )
    )
    
    # Disconnecting
    ig_stream_service.disconnect()
    
    opened by xiajya 0
  • IG Rest API gives error.security.client-token-invalid after 13-14 hours of continuous usage

    IG Rest API gives error.security.client-token-invalid after 13-14 hours of continuous usage

    I observed that the IG Rest API gives the error.security.client-token-invalid error after 13-14 hours of continuous usage in the demo account.

    I would appreciate guidance on possible ways to overcome this error.

    Thank you.

    opened by MilindRCodes 5
  • Create working order with force_open parameter

    Create working order with force_open parameter

    Hi all,

    I found a bug in the rest.py, create_working_order method:

        if force_open:
            params["forceOpen"] = 'true'
    

    it needs to be:

        if force_open:
            params["forceOpen"] = 'true'
        else:
            params["forceOpen"] = 'false'
    

    as IG's default forceOpen is true. when even the method defaults force_open as False, but it is not offsetting position.

    opened by jackyclever 1
  • pycryptodome lib deprecated

    pycryptodome lib deprecated

    bandit, the static code analysis library for Python, reports that the pycryptodome library has been deprecated, and that we should be using cryptography instead:

    https://bandit.readthedocs.io/en/1.7.4/blacklists/blacklist_imports.html#b413-import-pycrypto

    opened by bug-or-feature 0
Releases(0.0.19)
  • 0.0.19(Jan 5, 2023)

    • fix for 'ValueError: columns cannot be a set' error with pandas 1.5.2+ (PR #267)
    • fetch_historical_prices*() methods improvements (Issue #272)
    • remove requirements status badge (Issue #259)
    • publish with API token (Issue #260)
    • specify importlib-metadata version to prevent flake8 problems with python 3.7
    • updating github actions to latest versions
    Source code(tar.gz)
    Source code(zip)
  • 0.0.18(Aug 23, 2022)

  • 0.0.17(Jan 26, 2022)

  • 0.0.16(Jan 1, 2022)

    • fix for http error 405 response from IG when confirming deal (PR#237)
    • updating Poetry for automated testing
    • removing some unused legacy project config
    • removing support for unsupported Python 3.6, adding 3.10
    • better handling and docs for optional dependencies (#216, #240)
    • fixing occasional KeyError when deleting session headers (#238)
    Source code(tar.gz)
    Source code(zip)
  • 0.0.15(Oct 19, 2021)

  • 0.0.14(Oct 4, 2021)

    • fixes the bug where guaranteed stop loss was replaced with a normal stop loss on working order update (#224)
    • legacy 'setup.py' style project config files removed
    Source code(tar.gz)
    Source code(zip)
  • 0.0.13(Oct 2, 2021)

  • 0.0.12(Jul 28, 2021)

  • 0.0.11(Jul 19, 2021)

    0.0.11

    • code samples improved, new FAQ
    • Adds support for update open position v2
    • new function to calculate mid prices for historic data
    • Adds support for getting and updating account prefs
    • Adds support for /markets endpoint for getting details of multiple markets
    • new sample script to traverse navigation tree and get epics, new FAQ
    Source code(tar.gz)
    Source code(zip)
  • 0.0.10(Jul 10, 2021)

    0.0.10

    • simplified request headers: requests.Session now handles persistence
    • adds support for v3 session creation (#157)
    • implementation and test for fetch_working_orders() v2 (like PR #187)
    • adds support for fetch_historical_prices_by_epic_and_date_range() v2
    • adds support for fetch_open_positions() v2
    • dependency management with Python Poetry (#149)
    • more robust handling of IG API rate limits
    • support for all the /history/activity endpoints
    • better test coverage. now 80% for rest.py (#38)
    • documentation improvements
    Source code(tar.gz)
    Source code(zip)
  • 0.0.9(Mar 19, 2021)

    0.0.9

    • integration and unit tests improved
    • remove reference to adapter (#190)
    • pandas 1.2.0 (#184)
    • paged historical data can be captured with one request (#183)
    • paging fixed for historical data (#175)
    • error fixed when closing stream (#174)
    Source code(tar.gz)
    Source code(zip)
  • 0.0.8(Oct 23, 2020)

    • docs restructured and reintegrated with readthedocs.io
    • Fix for a bug in 'expand-columns()' that would cause an error if values were missing/null
    • unit tests for v3 historic prices method
    • Tidy up usage of "version" across the REST API to make it consistent
    • Marked methods that use an outdated version with TODOs
    • Fixed issues with switch_account(), delete_working_order() etc. which were not specifying a version correctly
    • unit tests for v1, v2 historic prices methods
    • allowing historic prices format to be defined at runtime
    • new optional flatter format for historic prices
    • release notes
    Source code(tar.gz)
    Source code(zip)
Owner
IG Python
A GitHub organization for Python developers who use IG Markets REST and Stream API. This organization is not related to IG Markets.
IG Python
Validate all your Customer IAM Policies against AWS Access Analyzer - Policy Validation

βœ… Access Analyzer - Batch Policy Validator This script will analyze using AWS Access Analyzer - Policy Validation all your account customer managed IA

Victor GRENU 41 Dec 12, 2022
πŸš€ An asynchronous python API wrapper meant to replace discord.py - Snappy discord api wrapper written with aiohttp & websockets

Pincer An asynchronous python API wrapper meant to replace discord.py ❗ The package is currently within the planning phase πŸ“Œ Links |Join the discord

Pincer 125 Dec 26, 2022
Huggingface transformers for discord

disformers Huggingface transformers for discord base source butyr/huggingface-transformer-chatbots install pip install -U disformers example see examp

SpaceDEVofficial 1 Nov 09, 2021
Ts-matterbridge - Integrate TeamSpeak Chat with MatterBridge

TeamSpeak-MatterBridge Bot You can use this bot to integrate TeamSpeak Chat with

4 Sep 25, 2022
SEP Finder Bot

SEP Finder Bot This is a Telegram bot that will help you find the correct SEP and Baseband files to use for your device with futurerestore. Usage A ho

6 Dec 03, 2022
Simple web-based hcaptcha bypass

Hcaptcha-Bypass !!! If you found this useful, please click the STAR button !!! Simple web-based hcaptcha bypass Just a demonstration right now, and yo

Kieronia 4 Oct 06, 2021
Throttle and debounce add-on for Pyrogram

pyrothrottle Throttle and debounce add-on for Pyrogram Quickstart implementation on decorators from pyrogram import Client, filters from pyrogram.type

7 Oct 01, 2022
A bot which is a ghost and you can make friends with it

This is a bot which is a ghost and you can make friends with it. It will haunt your friends. Explore and test the bot in replit !

Siwan SR 0 Oct 06, 2022
Discord Bot that can translate your text, count and reply to your messages with a personalised text

Discord Bot that can translate your text, count and reply to your messages with a personalised text

Grizz 2 Jan 26, 2022
Unofficial instagram API, give you access to ALL instagram features (like, follow, upload photo and video and etc)! Write on python.

Instagram-API-python Unofficial Instagram API to give you access to ALL Instagram features (like, follow, upload photo and video, etc)! Written in Pyt

Vladimir Bezrukov 1 Nov 19, 2021
Feedback-TelegramBot is a resemblance bot which can be deployed on server

Feedback-TelegramBot Feedback-TelegramBot is a resemblance bot which can be deployed on server This work is based on Telegram library, thanks to their

2 Jan 03, 2022
Discord Custom Playing Status Redirecting

Discord-Custom-Playing-Status-Redirecting THINGS TO DO :- - Create an application from https://discord.com/developers/applications give it ur desired

WarLorD oP 1 Oct 30, 2021
A Telegram bot to extracting text from images. All languages supported.

OCR Bot A Telegram bot to extracting text from images. All languages supported. Deploy to Heroku Local Deploying Clone the repo git clone https://gith

6 Oct 21, 2022
Gorrabot is a bot made to automate checks and processes in the development process.

Gorrabot is a Gitlab bot made to automate checks and processes in the Faraday development. Features Check that the CHANGELOG is modified By default, m

Faraday 7 Dec 14, 2022
Emo-Fun is a bot which emojifies the text you send it

About Emo-Fun is a bot which emojifies the text you send it. It is easier to understand by an example Input : Hey this is to show my working!! Output

Suvodeep Sinha 3 Sep 30, 2022
Python Client Library to interface with the Phoenix Realtime Server

supabase-realtime-client Python Client Library to interface with the Phoenix Realtime Server This is a fork of the supabase community realtime client

Anand 2 May 24, 2022
Translator based on Google API

Yakusu Toshiko Translator based on Google API. Instance of this bot is running as @yakusubot. Features Add a plus to a language's name to show an orig

Arisu W. 2 Sep 21, 2022
This is Source Code of PdiskUploaderBot

PdiskUploaderBot This is the source code of PdiskUploaderBot. And the developer of this bot is AJTimePyro, His Telegram Channel & Group. You can use t

Abhijeet 8 Oct 20, 2022
A updated and improved version from the original Discord-Netflix from Nirewen.

Discord-Netflix A updated version from the original Discord-Netflix from nirewen A Netflix wrapper that uses Discord RPC to show what you're watching

Void 42 Jan 02, 2023
✨ A Telegram mirror/leech bot By SparkXcloud Group ✨

SparkXcloud-Gdrive-MirrorBot SparkXcloud-Gdrive-MirrorBot is a multipurpose Telegram Bot writen in Python for mirroring files on the Internet to our b

119 Oct 23, 2022