McTrade is a bot exploiting Binance API, open source! built in python !

Overview

Size Linex Contributor Downloads Issues License Stars


Logo

Open Source Crypto Trading Bot using Binance API

Report Bug · Request Feature

Table of Contents
  1. About The Project
  2. Getting Started
  3. Usage
  4. Roadmap
  5. Contributing
  6. License
  7. Acknowledgments

About The Project

McTrade can run 24/7 on a server, laptop, anywhere.. his main purpose is to make smart trade. This Bot is not built for making 20 order/sec, McTrade will only trade when many parameters are combined. In fact, he is using 3 main financial indicators used by almost everyone trader on the market.

Here's why:

  • You will only need to give a configuration file to the bot, and that's it he won't need you anymore.
  • McTrade is free, so there is no fee, EXCEPT from Binance (0.1 %).
  • You can trade almost any crypto you want and at the same time !

Of course, we are in the real world, don't expect McTrade to make you billionaire in 2 weeks, the main idea of this bot is to give "passiv" revenue to anyone who wants to. Trading is not like roulette or black jack, so McTrade won't bet your money randomly and pray to gain money. Every decision he will make is mathematically correct.

(back to top)

Built With

The techs are really simple that's why he is really portable and has not a high memory usage !

Getting Started

Do not panic everything will be alright, really simple!

Prerequisites

You need of course python 3.6+ to launch everything, and pip3 to install package

  • apt-get
    $ sudo apt-get update
    $ sudo apt-get install python3.6
    $ sudo apt install python3-pip

Installation

  1. First get your account at Binance
  2. Put money on your wallet (50 USD or EUR ) is recommended but not mandatory you will see why.
  3. Clone the repo
    git clone https://github.com/nerap/McTrade.git
  4. Installing dependencies
    make setup
  5. Enter your API keys in .env
    api_key=SOME_API_KEY
    secret_api_key=SECRET_API_KEY
  6. Here we go you successfully installed McTrade !

Usage

McTrade works like any other script. The main argument that McTrade need is a configuration file

  python3 McTrady.py -f path/to/config/file

Default config files are in config_file/ directory

  python3 McTrady.py -f config_files/basic_config

The "tricky" part comes now, the configuration file. No extension needed but a really strict format is expected but unusual. The format is a json object, it's a json file.

   {
       "symbols": [
           {
               "symbol": "ETHUSDT"
           },
           {
               "symbol": "BTCUSDT",
               "quantity": 20,
               "risk": 7
           },
           {
               "symbol": "XRPUSDT",
               "quantity": 50
           }
       ]
   }

You have to respect that symbols is the key to yours symbols array, so whatever you are trying to do keep "symbols" as the main key to your array.

Like this

    {
        "symbols": [
            {
                "symbol": "ETHUSDT"
            }
        ]
    }

or like this

    {
        "symbols": [
            {
                "symbol": "ETHUSDT"
            },
            {
                "symbol": "BTCUSDT"
            },
            {
                "symbol": "DOGEUSDT"
            },
            {
                "symbol": "COMPUSDT"
            }
        ]
    }

Each element of symbols array in the configuration file, can take 3 parameters (5 in reality but I don't recommend to touch them unless you really know what you are doing).

    {
        "symbols": [
            {
                "symbol": "ETHUSDT",
                "quantity": 20,
                "risk": 4
            }
        ]
    }

Mandatory parameters

-The "symbol"

The only this to worry about is each element in your "symbols" array. You have to got at least 1 symbol (pair of coin and quote -> BTC + USDT , ETH + USDT, etc..) You can only trade crypto that end with USDT, because USDT is the only currency that McTrade can mange for now.

So if you want to trade, you need to make sure to have your wallet converted to USDT, because this is how McTrade will place his order. Each transaction is a minimum of 10 USDT (10 dollars), so you need at least 20 USDT to trade without being worried about the minimum about.

Optionnal parameters:

-The "quantity"

How many MAX % of your USDT wallet this McTrade will trade with, if you specify 20, 20 percent of your MAX % so if you 100 USDT, 20 will be dedicated to trade, (not more not less). McTrade won't run if the sum of your quantity is above 100 %

"quantity" must be between 10 and 100.

(If not quantity is present, the default value will be ( 100 / numbers of symbols)) so for instance if you want to trade 4 crypto simultaneously and none of them has precise their quantity each of them will use 25 % of your maximum wallet)

-The "risk"

Represent how greedy your bot will be, I don't recommend using this parameters neither, because the greater he is the more unpredictable the McTrade will be if you really want to use it, I suggest to put him between 3 and 7 MAXIMUM.

"risk" must be between 3 and 25

(Default value is 5)

WARNING THOSE 2 PARAMETERS ARE NOT RECOMMEND TO MODIFY

Nevertheless you still can, see this doc https://python-binance.readthedocs.io/en/latest/constants.html

-The "interval"

McTrade is fetching data from Binance API and the data have an interval for example, 1 minutes between each price of the BTC, or 30 minutes even 1 day between each data. That doesn't mean that when you fetch a data with 1 day interval that you won't have the actual current price of the BTC, you will have the each price from now with an "interval" with a certain "lookback".

(Default value is "5m")

-The "lookback"

Like interval, lookback has special format that you will need to stick to. Reprensent how far you will look for you data, example 100 minutes, 1 week, 1 year. McTrade will use data 1 year old with a certain "interval" between each of them.

(Default value is "7 day ago UTC")

Roadmap

  • [] Add another currency than USDT
  • [] Add Docker file
  • [] Make a prettier ReadMe
  • [] Configuration file should looks like nginx.conf
  • [] More UX friendly stats while the Bot is running See the open issues for a full list of proposed features (and known issues).

(back to top)

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

Distributed under the GNU License. See LICENSE.txt for more information.

Acknowledgments

Use this space to list resources you find helpful and would like to give credit to. I've included a few of my favorites to kick things off!

(back to top)

Comments
  • Config error

    Config error

    Hello,

    thanks for making this bot. I'm just curious and test this on my server for hobby purposes. But when running it give me the following output:

    already solved :)

    opened by SolosoftNL 11
  • conf file should be like nginx.conf format

    conf file should be like nginx.conf format

    I think this format might be someone interesting https://www.nginx.com/resources/wiki/start/topics/examples/full/ Find a way to implement something like this

    enhancement question 
    opened by nerap 0
  • Feature/buying selling order

    Feature/buying selling order

    Main loop, is based on thread.is_alive() instead of join(), (restarting thread next step) if the program stop on open position he will retrieve that last position

    opened by nerap 0
  • Need  a version where advanced paramters can be modified and with fake buying and selling order

    Need a version where advanced paramters can be modified and with fake buying and selling order

    Need to be able to look even futher on the K line (current 14 days) / same goes with the interval (current 1h) Need to benchmark how much step we need to look backward (current 5 day) (risk parameter) And possible more (D line ) (MACD line) (RSI line)

    enhancement 
    opened by nerap 0
  • Configure Renovate

    Configure Renovate

    Mend Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    🚦 To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • .github/workflows/codeql-analysis.yml (github-actions)
    • .github/workflows/python-package-conda.yml (github-actions)
    • requirements.txt (pip_requirements)

    Configuration Summary

    Based on the default config's presets, Renovate will:

    • Start dependency updates only once this onboarding PR is merged
    • Enable Renovate Dependency Dashboard creation.
    • If Renovate detects semantic commits, it will use semantic commit type fix for dependencies and chore for all others.
    • Ignore node_modules, bower_components, vendor and various test/tests directories.
    • Autodetect whether to pin dependencies or maintain ranges.
    • Rate limit PR creation to a maximum of two per hour.
    • Limit to maximum 10 open PRs at any time.
    • Group known monorepo packages together.
    • Use curated list of recommended non-monorepo package groupings.
    • A collection of workarounds for known problems with packages.

    🔡 Would you like to change the way Renovate is upgrading your dependencies? Simply edit the renovate.json in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.


    What to Expect

    With your current configuration, Renovate will create 41 Pull Requests:

    chore(deps): update dependency numpy to v1.22.0 [security]
    • Branch name: renovate/pypi-numpy-vulnerability
    • Merge into: master
    • Upgrade numpy to ==1.22.0
    chore(deps): update dependency pillow to v9 [security]
    • Branch name: renovate/pypi-Pillow-vulnerability
    • Merge into: master
    • Upgrade Pillow to ==9.0.1
    chore(deps): update dependency ujson to v5 [security]
    • Branch name: renovate/pypi-ujson-vulnerability
    • Merge into: master
    • Upgrade ujson to ==5.4.0
    chore(deps): pin dependency aiohttp to ==3.8.1
    • Schedule: ["at any time"]
    • Branch name: renovate/pin-dependencies
    • Merge into: master
    • Pin aiohttp to ==3.8.1
    chore(deps): update dependency dateparser to v1.1.1
    • Schedule: ["at any time"]
    • Branch name: renovate/dateparser-1.x
    • Merge into: master
    • Upgrade dateparser to ==1.1.1
    chore(deps): update dependency nginxparser_eb to v0.0.9
    • Schedule: ["at any time"]
    • Branch name: renovate/nginxparser_eb-0.x
    • Merge into: master
    • Upgrade nginxparser_eb to ==0.0.9
    chore(deps): update dependency python-binance to v1.0.16
    • Schedule: ["at any time"]
    • Branch name: renovate/python-binance-1.x
    • Merge into: master
    • Upgrade python-binance to ==1.0.16
    chore(deps): update dependency sqlalchemy to v1.4.39
    • Schedule: ["at any time"]
    • Branch name: renovate/sqlalchemy-1.x
    • Merge into: master
    • Upgrade SQLAlchemy to ==1.4.39
    chore(deps): update dependency urllib3 to v1.26.10
    • Schedule: ["at any time"]
    • Branch name: renovate/urllib3-1.x
    • Merge into: master
    • Upgrade urllib3 to ==1.26.10
    chore(deps): update dependency yarl to v1.7.2
    • Schedule: ["at any time"]
    • Branch name: renovate/yarl-1.x
    • Merge into: master
    • Upgrade yarl to ==1.7.2
    chore(deps): update dependency yfinance to v0.1.74
    • Schedule: ["at any time"]
    • Branch name: renovate/yfinance-0.x
    • Merge into: master
    • Upgrade yfinance to ==0.1.74
    chore(deps): update dependency attrs to v21.4.0
    • Schedule: ["at any time"]
    • Branch name: renovate/attrs-21.x
    • Merge into: master
    • Upgrade attrs to ==21.4.0
    chore(deps): update dependency blessed to v1.19.1
    • Schedule: ["at any time"]
    • Branch name: renovate/blessed-1.x
    • Merge into: master
    • Upgrade blessed to ==1.19.1
    chore(deps): update dependency charset-normalizer to v2.1.0
    • Schedule: ["at any time"]
    • Branch name: renovate/charset-normalizer-2.x
    • Merge into: master
    • Upgrade charset-normalizer to ==2.1.0
    chore(deps): update dependency cycler to v0.11.0
    • Schedule: ["at any time"]
    • Branch name: renovate/cycler-0.x
    • Merge into: master
    • Upgrade cycler to ==0.11.0
    chore(deps): update dependency importlib-metadata to v4.12.0
    • Schedule: ["at any time"]
    • Branch name: renovate/importlib-metadata-4.x
    • Merge into: master
    • Upgrade importlib-metadata to ==4.12.0
    chore(deps): update dependency kiwisolver to v1.4.4
    • Schedule: ["at any time"]
    • Branch name: renovate/kiwisolver-1.x
    • Merge into: master
    • Upgrade kiwisolver to ==1.4.4
    chore(deps): update dependency matplotlib to v3.5.2
    • Schedule: ["at any time"]
    • Branch name: renovate/matplotlib-3.x
    • Merge into: master
    • Upgrade matplotlib to ==3.5.2
    chore(deps): update dependency pandas to v1.4.3
    • Schedule: ["at any time"]
    • Branch name: renovate/pandas-1.x
    • Merge into: master
    • Upgrade pandas to ==1.4.3
    chore(deps): update dependency python-dotenv to v0.20.0
    • Schedule: ["at any time"]
    • Branch name: renovate/python-dotenv-0.x
    • Merge into: master
    • Upgrade python-dotenv to ==0.20.0
    chore(deps): update dependency regex to v2021.11.10
    • Schedule: ["at any time"]
    • Branch name: renovate/regex-2021.x
    • Merge into: master
    • Upgrade regex to ==2021.11.10
    chore(deps): update dependency requests to v2.28.1
    • Schedule: ["at any time"]
    • Branch name: renovate/requests-2.x
    • Merge into: master
    • Upgrade requests to ==2.28.1
    chore(deps): update dependency ta to v0.10.1
    • Schedule: ["at any time"]
    • Branch name: renovate/ta-0.x
    • Merge into: master
    • Upgrade ta to ==0.10.1
    chore(deps): update dependency tzdata to v2021.5
    • Schedule: ["at any time"]
    • Branch name: renovate/tzdata-2021.x
    • Merge into: master
    • Upgrade tzdata to ==2021.5
    chore(deps): update dependency zipp to v3.8.1
    • Schedule: ["at any time"]
    • Branch name: renovate/zipp-3.x
    • Merge into: master
    • Upgrade zipp to ==3.8.1
    chore(deps): update actions/checkout action to v3
    • Schedule: ["at any time"]
    • Branch name: renovate/actions-checkout-3.x
    • Merge into: master
    • Upgrade actions/checkout to v3
    chore(deps): update actions/setup-python action to v4
    • Schedule: ["at any time"]
    • Branch name: renovate/actions-setup-python-4.x
    • Merge into: master
    • Upgrade actions/setup-python to v4
    chore(deps): update dependency asn1crypto to v1
    • Schedule: ["at any time"]
    • Branch name: renovate/asn1crypto-1.x
    • Merge into: master
    • Upgrade asn1crypto to ==1.5.1
    chore(deps): update dependency async-timeout to v4
    • Schedule: ["at any time"]
    • Branch name: renovate/async-timeout-4.x
    • Merge into: master
    • Upgrade async-timeout to ==4.0.2
    chore(deps): update dependency certifi to v2022
    • Schedule: ["at any time"]
    • Branch name: renovate/certifi-2022.x
    • Merge into: master
    • Upgrade certifi to ==2022.6.15
    chore(deps): update dependency chardet to v5
    • Schedule: ["at any time"]
    • Branch name: renovate/chardet-5.x
    • Merge into: master
    • Upgrade chardet to ==5.0.0
    chore(deps): update dependency multidict to v6
    • Schedule: ["at any time"]
    • Branch name: renovate/multidict-6.x
    • Merge into: master
    • Upgrade multidict to ==6.0.2
    chore(deps): update dependency pyparsing to v3
    • Schedule: ["at any time"]
    • Branch name: renovate/pyparsing-3.x
    • Merge into: master
    • Upgrade pyparsing to ==3.0.9
    chore(deps): update dependency pytz to v2022
    • Schedule: ["at any time"]
    • Branch name: renovate/pytz-2022.x
    • Merge into: master
    • Upgrade pytz to ==2022.1
    chore(deps): update dependency readchar to v3
    • Schedule: ["at any time"]
    • Branch name: renovate/readchar-3.x
    • Merge into: master
    • Upgrade readchar to ==3.0.6
    chore(deps): update dependency regex to v2022
    • Schedule: ["at any time"]
    • Branch name: renovate/regex-2022.x
    • Merge into: master
    • Upgrade regex to ==2022.7.9
    chore(deps): update dependency typing-extensions to v4
    • Schedule: ["at any time"]
    • Branch name: renovate/typing-extensions-4.x
    • Merge into: master
    • Upgrade typing-extensions to ==4.3.0
    chore(deps): update dependency tzdata to v2022
    • Schedule: ["at any time"]
    • Branch name: renovate/tzdata-2022.x
    • Merge into: master
    • Upgrade tzdata to ==2022.1
    chore(deps): update dependency tzlocal to v4
    • Schedule: ["at any time"]
    • Branch name: renovate/tzlocal-4.x
    • Merge into: master
    • Upgrade tzlocal to ==4.2
    chore(deps): update dependency websockets to v10
    • Schedule: ["at any time"]
    • Branch name: renovate/websockets-10.x
    • Merge into: master
    • Upgrade websockets to ==10.3
    chore(deps): update github/codeql-action action to v2
    • Schedule: ["at any time"]
    • Branch name: renovate/github-codeql-action-2.x
    • Merge into: master
    • Upgrade github/codeql-action to v2

    🚸 Branch creation will be limited to maximum 2 per hour, so it doesn't swamp any CI resources or spam the project. See docs for prhourlylimit for details.


    ❓ Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 0
Releases(v1.0.0)
  • v1.0.0(Nov 10, 2021)

    McTrade is fully fonctinnal, and can trade day and night forever and ever. Report any issues you have.

    What's Changed

    • Feature/macd by @nerap in https://github.com/nerap/McTrade/pull/45
    • feat(Nginx): parsing now working with the nginx.conf format by @nerap in https://github.com/nerap/McTrade/pull/46

    Full Changelog: https://github.com/nerap/McTrade/commits/v1.0.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Oct 20, 2021)

    What's Changed

    • Feature/buying selling order by @nerap in https://github.com/nerap/McTrade/pull/35
    • Feature/buying selling order by @nerap in https://github.com/nerap/McTrade/pull/36
    • Feature/buying selling order by @nerap in https://github.com/nerap/McTrade/pull/37
    • Feature/buying selling order by @nerap in https://github.com/nerap/McTrade/pull/39
    • update(printing): new printing and configuration file by @nerap in https://github.com/nerap/McTrade/pull/40

    Full Changelog: https://github.com/nerap/McTrade/compare/v0.1.0...v0.1.1

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Oct 18, 2021)

    What's Changed

    • Features/buying order by @nerap in https://github.com/nerap/BinanceBot/pull/5
    • update(file): file structure is new, Makefile is improved and worflow… by @nerap in https://github.com/nerap/BinanceBot/pull/6
    • Feature/buying order by @nerap in https://github.com/nerap/BinanceBot/pull/19

    Full Changelog: https://github.com/nerap/BinanceBot/compare/v0.0.1-pre-alpha...v0.1.0

    Source code(tar.gz)
    Source code(zip)
  • v0.0.1.1-pre-alpha(Oct 15, 2021)

    What's Changed

    • Features/buying order by @nerap in https://github.com/nerap/BinanceBot/pull/5
    • update(file): file structure is new, Makefile is improved and worflow… by @nerap in https://github.com/nerap/BinanceBot/pull/6

    Full Changelog: https://github.com/nerap/BinanceBot/compare/v0.0.1-pre-alpha...v0.0.1.1-pre-alpha

    Source code(tar.gz)
    Source code(zip)
  • v0.0.1-pre-alpha(Oct 14, 2021)

    What's Changed

    • project is now working with configuration file and not with command line arguments by @nerap in https://github.com/nerap/BinanceBot/pull/1
    • feat(add): added githooks and make file by @nerap in https://github.com/nerap/BinanceBot/pull/2
    • update(test): Now all the test is working as expected by @nerap in https://github.com/nerap/BinanceBot/pull/3
    • feat(add): Binance can fetch N symbol from configuration file and store it with SQLite by @nerap in https://github.com/nerap/BinanceBot/pull/4

    New Contributors

    • @nerap made their first contribution in https://github.com/nerap/BinanceBot/pull/1

    Full Changelog: https://github.com/nerap/BinanceBot/commits/v0.0.1-pre-alpha

    Source code(tar.gz)
    Source code(zip)
Owner
Raphael Cohen
42 students
Raphael Cohen
A simple anti-ghostping python bot made using diskord.

Anti Ghostping A simple Anti-Ghostping python bot made with ❤ using Diskord Requirements No one will use this but, all you need for this bot is: Pytho

RyZe 2 Sep 12, 2022
Python wrapper for Xeno-canto API 2.0. Enables downloading bird data with one command line

Python wrapper for Xeno-canto API 2.0. Enables downloading bird data with one command line. Supports multithreading

_zza 9 Dec 10, 2022
an API to check if a url or IP address is safe or phishing

an API to check if a url or IP address is safe or phishing. Using a ML model. The API created using FastAPI.

Adel Dahani 1 Feb 16, 2022
A lightweight Python wrapper for the IG Markets API

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

IG Python 247 Dec 08, 2022
TON Miner from TON-Pool.com

TON-Pool Miner Miner from TON-Pool.com

21 Nov 18, 2022
Add members to unlimited telegram channels and groups

Program Features 📌 Coded with Python version 10. 📌 without the need for a proxy. 📌 without the need for a Telegram ID. 📌 Ability to add infinite p

hack4lx 10 Nov 25, 2022
Celestial - a Python regex Discord chatbot who can talk with you.

Celestial a Python regex Discord chat bot who can talk with you. Invite url: https://discord.com/api/oauth2/authorize?client_id=927573556961869825&per

Jirayu Kaewsing 3 Jan 01, 2023
A generative art library for NFT avatar and collectible projects.

Generative NFT Art Introduction The generative-art-nft repository is a library for creating generative art. It was developed for the purpose of creati

Rounak Banik 657 Jan 02, 2023
Just another Shiny and Greninja-ash killing preventor for Myuu

Myuu-Anti-Shiny-Discord-Bot Why I made it? Since, I was legit fed up of NebbyBot's lag (not criticising it), I decided to make my own but in python an

5 Nov 12, 2022
OpenZeppelin Contracts written in Cairo for StarkNet, a decentralized ZK Rollup

OpenZeppelin Cairo Contracts A library for secure smart contract development written in Cairo for StarkNet, a decentralized ZK Rollup. ⚠️ WARNING! ⚠️

OpenZeppelin 592 Jan 04, 2023
Collaboration with Microsoft, AWS, Google, and ETHZürich Analytics Club (2022 Datathon Project)

DATATHON_ Collaboration with Microsoft, AWS, Google, and ETHZürich Analytics Club (2022 Datathon Project) Datathon Original Challenge SAV DataDays Rei

esthi 34 Nov 10, 2022
This is a Anti Channel Ban Robots

AntiChannelBan This is a Anti Channel Ban Robots delete and ban message sent by channels Heroku Deployment 💜 Heroku is the best way to host ur Projec

BᵣₐyDₑₙ 25 Dec 10, 2021
Collection of script to manage WLED devices

Collection of script to manage WLED devices

Daniel Poelzleithner 4 Sep 26, 2022
The worst but simplest webhook bot for GitHub and Matrix.

gh-bot gh-bot is maybe the worst (but simplest) Matrix webhook bot for Github. Example of commits: Example of workflow finished: Setting up Server You

Jae Lo Presti 4 Aug 18, 2022
A simple object model for the Notion SDK.

A simplified object model for the Notion SDK. This is loosely modeled after concepts found in SQLAlchemy.

Jason Heddings 54 Jan 02, 2023
A simple Discord bot written in Python

Acolyte A small and simple little Discord bot written in Python that utilizes the discord.py library. Dependencies The bot depends on Python 3.9 and u

0 Jul 17, 2021
Unofficial GoPro API Library for Python - connect to GoPro via WiFi.

GoPro API for Python Unofficial GoPro API Library for Python - connect to GoPro cameras via WiFi. Compatibility: HERO3 HERO3+ HERO4 (including HERO Se

Konrad Iturbe 1.3k Jan 01, 2023
Lazy airdrop based on private temporary ids

LobsterDAO This uses a modified MerkleDistributor, which allows to issue a lazy airdrop using temporary IDs. In this example it uses Telegram chat_id

41 Sep 10, 2022
Python written Rule34 API

Python written Rule34 API

1 Nov 11, 2021
A Python wrapper for the QQ Channel API

A Python wrapper for the QQ Channel API

Fox_white 55 Dec 07, 2022