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
Send OpenWeatherMap alerts (One Call API) to telegram users.

OpenWeatherMap Telegram Alert Send OpenWeatherMap alerts (One Call API) to telegram users. Installation Requirements: $ apt install python3-yaml pytho

Michael Hacker 1 Jun 04, 2022
🎀 First and most powerfull open source clicktune botter

CTB 🖤 Follow me here: Discord | YouTube | Twitter | Github 🐺 Features: /* *- The first *- Fast *- Proxy support: http/s, socks4/5, premieum (w

Iтѕ_Ѵιcнч#1337 22 Aug 29, 2022
A Discord Bot for the Pygame Community Server

PygameCommunityBot The Pygame Community Discord bot The bot is capable of doing a lot of stuff, the command prefix is pg!. For help on all the bot com

PygameCommunityDiscord 23 Nov 30, 2022
MSE5050/7050 Materials Informatics course at the University of Utah

MaterialsInformatics MSE5050/7050 Materials Informatics course at the University of Utah This github repo contains coursework content such as class sl

41 Dec 30, 2022
OAN Music - Highly advanced User Music Bot

ཧᜰ꙰ꦿ➢𝐎𝐀𝐍༒☛ 🎧 Advanced 𝐎𝐀𝐍 Music bot. 🔗 𝐏𝐨𝐰𝐞𝐫𝐞𝐝 𝐛𝐲 : ➢𝐀ttitude

Attitude king 5 Feb 25, 2022
A Discord Token Spammer, multi webhooks compatibility, made in python +3.7. By Ezermoz

DiscordWebhookSpammer A Discord Token Spammer, multi webhooks compatibility, made in python +3.7. By Ezermoz Put you webhook in webhooks.txt if you wa

3 Nov 24, 2021
Info gathering | API hacketarget.com

InfoFetch Info gathering | API hackertarget.com set-up: apt-get install python3 pip3 install requests apt-get install git git clone https://github.com

Muhammed Rizad 4 Nov 22, 2021
Discord RPC for Notion written in Python

Discord RPC for Notion This is a program that allows you to add your Notion workspace activities to your Discord profile. This project is currently un

Thuliumitation 1 Feb 10, 2022
This is a Python bot, which automates logging in, purchasing and planting the seeds. Open source bot and completely free.

🌻 Sunflower Land Bot 🌻 ⚠️ Warning I am not responsible for any penalties incurred by those who use the bot, use it at your own risk. This BOT is com

Newerton 18 Aug 31, 2022
A simple, multipurpose Discord bot.

EpicBot 🏅 A simple, multipurpose Discord bot. • Info EpicBot is a multipurpose Discord bot that was designed to make your Discord life easier and coo

Nirlep_5252_ 130 Dec 29, 2022
Signs the target email up to over 1000 different mailing lists to get spammed each day.

Email Bomber Say goodbye to that email Features Signs up to over 1k different mailing lists Written in python so the program is lightweight Easy to us

Loxdr 1 Nov 30, 2021
Python bindings for LibreTranslate

Python bindings for LibreTranslate

Argos Open Tech 42 Jan 03, 2023
Generate Heroku-like random names to use in your python applications

HaikunatorPY Generate Heroku-like random names to use in your python applications. Installation pip install haikunator Usage Haikunator is pretty sim

Atrox 116 Nov 15, 2022
A collective list of free APIs for use in software and web development.

Public APIs A collective list of free APIs for use in software and web development. A public API for this project can be found here! For information o

222.5k Jan 02, 2023
OpenVisionAPI client

OpenVisionAPI Client 🚀 Getting Started Prerequisites Installing Install the dependencies $ make setup Usage $ source .venv/bin/activate $ ./ova_clie

Open Vision API 40 Nov 11, 2022
Bitstamp API wrapper for Python

NOTICE: THIS REPOSITORY IS NO LONGER ACTIVELY MAINTAINED It is highly unlikely that I will respond to PRs and questions about usage. This library was

Jack Preston 53 Mar 09, 2022
A discord bot providing notifications of player activity on a minecraft server.

tos-alert A discord bot providing notifications of player activity on a minecraft server. Setup By default the app does not launch and will crash with

1 Jul 22, 2022
yobot插件,Steam雷达,可自动播报玩家的Steam游戏状态和DOTA2图文战报

Steam_watcher 这是 prcbot/yobot 的自定义插件,可自动播报玩家的Steam游戏状态和DOTA2图文战报 都有些什么功能? 本插件可以在用户绑定后自动推送Steam游戏状态的更新和 Dota2 图文战报,以及提供一些手动查询功能 指令列表 atbot 表示需要@BOT ats

羽波 21 Jun 21, 2022
A twitter multi-tool for OSINT on twitter accounts.

TwitterCheckr A twitter multi-tool for OSINT on twitter accounts. Infomation TwitterCheckr also known as TCheckr is multi-tool for OSINT on twitter a

IRIS 16 Dec 23, 2022