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
Framework for creating and running trading strategies. Blatantly stolen copy of qtpylib to make it work for Indian markets.

>_• Kinetick Trade Bot Kinetick is a framework for creating and running trading strategies without worrying about integration with broker and data str

Vinay 41 Dec 31, 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
🚀 A fast, flexible and lightweight Discord API wrapper for Python.

Krema A fast, flexible and lightweight Discord API wrapper for Python. Installation Unikorn unikorn add kremayard krema -no-confirmation Pip pip insta

Krema 20 Sep 4, 2022
A Simple, LightWeight, Statically-Typed Python3 API wrapper for GogoAnime.

AniKimi API A Simple, LightWeight, Statically-Typed Python3 API wrapper for GogoAnime The v2 of gogoanimeapi (depreciated) Made with JavaScript and Py

null 17 Dec 9, 2022
Aws-lambda-requests-wrapper - Request/Response wrapper for AWS Lambda with API Gateway

AWS Lambda Requests Wrapper Request/Response wrapper for AWS Lambda with API Gat

null 1 May 20, 2022
Kevin L. 3 Jul 14, 2022
PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.

PRAW: The Python Reddit API Wrapper PRAW, an acronym for "Python Reddit API Wrapper", is a Python package that allows for simple access to Reddit's AP

Python Reddit API Wrapper Development 3k Dec 29, 2022
PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.

PRAW: The Python Reddit API Wrapper PRAW, an acronym for "Python Reddit API Wrapper", is a Python package that allows for simple access to Reddit's AP

Python Reddit API Wrapper Development 3k Dec 29, 2022
Python API wrapper around Trello's API

A wrapper around the Trello API written in Python. Each Trello object is represented by a corresponding Python object. The attributes of these objects

Richard Kolkovich 904 Jan 2, 2023
Async ready API wrapper for Revolt API written in Python.

Mutiny Async ready API wrapper for Revolt API written in Python. Installation Python 3.9 or higher is required To install the library, you can just ru

null 16 Mar 29, 2022
A Python API wrapper for the Twitter API!

PyTweet PyTweet is an api wrapper made for twitter using twitter's api version 2! Installation Windows py3 -m pip install PyTweet Linux python -m pip

TheFarGG 1 Nov 19, 2022
Python API wrapper library for Convex Value API

convex-value-python Python API wrapper library for Convex Value API. Further Links: Convex Value homepage @ConvexValue on Twitter JB on Twitter Authen

Aaron DeVera 2 May 11, 2022
This an API wrapper library for the OpenSea API written in Python 3.

OpenSea NFT API Python 3 wrapper This an API wrapper library for the OpenSea API written in Python 3. The library provides a simplified interface to f

Attila Tóth 159 Dec 26, 2022
YARSAW is an Async Python API Wrapper for the Random Stuff API.

Yet Another Random Stuff API Wrapper - YARSAW YARSAW is an Async Python API Wrapper for the Random Stuff API. This module makes it simpler for you to

Bruce 6 Mar 27, 2022
EpikCord.py - This is an API Wrapper for Discord's API for Python

EpikCord.py - This is an API Wrapper for Discord's API for Python! We've decided not to fork discord.py and start completely from scratch for a new, better structuring system!

EpikHost 28 Oct 10, 2022
A simple Python API wrapper for Cloudflare Stream's API.

python-cloudflare-stream A basic Python API wrapper for working with Cloudflare Stream. Arbington.com started off using Cloudflare Stream. We used the

Arbington 3 Sep 8, 2022
Discord-Wrapper - Discord Websocket Wrapper in python

This does not currently work and is in development Discord Websocket Wrapper in

null 3 Oct 25, 2022
An API wrapper around the pythonanywhere's API.

pyaww An API wrapper around the pythonanywhere's API. The name stands for pythonanywherewrapper. 100% api coverage most of the codebase is documented

null 7 Dec 11, 2022
An API Wrapper for Gofile API

Gofile2 from gofile2 import Gofile g_a = Gofile() print(g_a.upload(file="/home/itz-fork/photo.png")) An API Wrapper for Gofile API. About API Gofile

I'm Not A Bot #Left_TG 16 Dec 10, 2022