├── .gitattributes ├── .gitignore ├── LICENSE ├── c99api ├── __init__.py ├── api_handler.py └── methods.py ├── example_usage.py ├── install.bat ├── readme.md ├── requirements.txt └── setup.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Haste171 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /c99api/__init__.py: -------------------------------------------------------------------------------- 1 | from c99api.api_handler import EndpointClient 2 | -------------------------------------------------------------------------------- /c99api/api_handler.py: -------------------------------------------------------------------------------- 1 | # Client for handling responses from API and outputting in desired format 2 | 3 | import requests 4 | from .methods import register_methods 5 | 6 | @register_methods 7 | 8 | class EndpointClient: 9 | 10 | key = None 11 | base_url = 'https://api.c99.nl' 12 | 13 | @classmethod 14 | def fetch_endpoint(cls, endpoint_name, json=True, **kwargs): 15 | if not cls.key: 16 | raise ValueError("API key not set. Use c99_api.key = 'your_api_key'") 17 | 18 | json_query = '&json' if json else '' 19 | 20 | endpoint_list = { 21 | 'phonelookup': cls.base_url + f'/phonelookup?key={cls.key}&number={kwargs.get("number")}{json_query}', 22 | 'emailvalidator': cls.base_url + f'/emailvalidator?key={cls.key}&email={kwargs.get("email")}{json_query}', 23 | 'disposablemailchecker': cls.base_url + f'/disposablemailchecker?key={cls.key}&email={kwargs.get("email")}{json_query}', 24 | 'portscanner': cls.base_url + f'/portscanner?key={cls.key}&host={kwargs.get("host")}{json_query}', 25 | 'portscanner_port': cls.base_url + f'/portscanner?key={cls.key}&host={kwargs.get("host")}&port={kwargs.get("port")}{json_query}', 26 | 'ping': cls.base_url + f'/ping?key={cls.key}&host={kwargs.get("host")}{json_query}', 27 | 'gethostname': cls.base_url + f'/gethostname?key={cls.key}&host={kwargs.get("host")}{json_query}', 28 | 'dnschecker': cls.base_url + f'/dnschecker?key={cls.key}&url={kwargs.get("url")}&type={kwargs.get("type")}{json_query}', 29 | 'dnsresolver': cls.base_url + f'/dnsresolver?key={cls.key}&host={kwargs.get("host")}&server={kwargs.get("server")}{json_query}', 30 | 'ipvalidator': cls.base_url + f'/ipvalidator?key={cls.key}&ip={kwargs.get("ip")}{json_query}', 31 | 'torchecker': cls.base_url + f'/torchecker?key={cls.key}&ip={kwargs.get("ip")}{json_query}', 32 | 'iplogger': cls.base_url + f'/iplogger?key={cls.key}&action={kwargs.get("action")}{json_query}', 33 | 'proxydetector': cls.base_url + f'/proxydetector?key={cls.key}&ip={kwargs.get("ip")}{json_query}', 34 | 'subdomainfinder': cls.base_url + f'/subdomainfinder?key={cls.key}&domain={kwargs.get("domain")}{json_query}', 35 | 'firewalldetector': cls.base_url + f'/firewalldetector?key={cls.key}&url={kwargs.get("url")}{json_query}', 36 | 'ip2domains': cls.base_url + f'/ip2domains?key={cls.key}&ip={kwargs.get("ip")}{json_query}', 37 | 'alexarank': cls.base_url + f'/alexarank?key={cls.key}&url={kwargs.get("url")}{json_query}', 38 | 'whois': cls.base_url + f'/whois?key={cls.key}&domain={kwargs.get("domain")}{json_query}', 39 | 'createscreenshot': cls.base_url + f'/createscreenshot?key={cls.key}&url={kwargs.get("url")}{json_query}', 40 | 'geoip': cls.base_url + f'/geoip?key={cls.key}&host={kwargs.get("host")}{json_query}', 41 | 'upordown': cls.base_url + f'/upordown?key={cls.key}&host={kwargs.get("host")}{json_query}', 42 | 'reputationchecker': cls.base_url + f'/reputationchecker?key={cls.key}&url={kwargs.get("url")}{json_query}', 43 | 'getheaders': cls.base_url + f'/getheaders?key={cls.key}&host={kwargs.get("host")}{json_query}', 44 | 'linkbackup': cls.base_url + f'/linkbackup?key={cls.key}&url={kwargs.get("url")}{json_query}', 45 | 'urlshortener': cls.base_url + f'/urlshortener?key={cls.key}&url={kwargs.get("url")}{json_query}', 46 | 'bitcoinbalance': cls.base_url + f'/bitcoinbalance?key={cls.key}&address={kwargs.get("address")}{json_query}', 47 | 'ethereumbalance': cls.base_url + f'/ethereumbalance?key={cls.key}&address={kwargs.get("address")}{json_query}', 48 | 'currency': cls.base_url + f'/currency?key={cls.key}&amount={kwargs.get("amount")}&from={kwargs.get("from")}&to={kwargs.get("to")}{json_query}', 49 | 'currencyrates': cls.base_url + f'/currencyrates?key={cls.key}&source={kwargs.get("source")}{json_query}', 50 | 'randomstringpicker': cls.base_url + f'/randomstringpicker?key={cls.key}&textfile={kwargs.get("textfile")}{json_query}', 51 | 'dictionary': cls.base_url + f'/dictionary?key={cls.key}&word={kwargs.get("word")}{json_query}', 52 | 'definepicture': cls.base_url + f'/definepicture?key={cls.key}&url={kwargs.get("url")}{json_query}', 53 | 'synonym': cls.base_url + f'/synonym?key={cls.key}&word={kwargs.get("word")}{json_query}', 54 | 'translate': cls.base_url + f'/translate?key={cls.key}&text={kwargs.get("text")}&tolanguage={kwargs.get("tolanguage")}{json_query}', 55 | 'randomperson': cls.base_url + f'/randomperson?key={cls.key}&gender={kwargs.get("gender")}{json_query}', 56 | 'youtubedetails': cls.base_url + f'/youtubedetails?key={cls.key}&videoid={kwargs.get("videoid")}{json_query}', 57 | 'youtubemp3': cls.base_url + f'/youtubemp3?key={cls.key}&videoid={kwargs.get("videoid")}{json_query}', 58 | 'weather': cls.base_url + f'/weather?key={cls.key}&location={kwargs.get("location")}{json_query}', 59 | 'qrgenerator': cls.base_url + f'/qrgenerator?key={cls.key}&string={kwargs.get("string")}&size={kwargs.get("size")}{json_query}', 60 | 'textparser': cls.base_url + f'/textparser?key={cls.key}&url={kwargs.get("url")}{json_query}', 61 | 'passwordgenerator': cls.base_url + f'/passwordgenerator?key={cls.key}&length={kwargs.get("length")}&include={kwargs.get("include")}&customlist={kwargs.get("customlist")}{json_query}', 62 | 'randomnumber': cls.base_url + f'/randomnumber?key={cls.key}&length={kwargs.get("length")}&between={kwargs.get("between")}{json_query}', 63 | 'licensekeygenerator': cls.base_url + f'/licensekeygenerator?key={cls.key}&template={kwargs.get("template")}&amount={kwargs.get("amount")}{json_query}', 64 | 'eitheror': cls.base_url + f'/eitheror?key={cls.key}{json_query}', 65 | 'gif': cls.base_url + f'/gif?key={cls.key}&keyword={kwargs.get("keyword")}{json_query}' 66 | } 67 | 68 | url_template = endpoint_list[endpoint_name] 69 | result_endpoint = url_template.format(**kwargs) 70 | return result_endpoint 71 | 72 | @classmethod 73 | def perform_request(cls, endpoint_name, json=True, **kwargs): 74 | url = cls.fetch_endpoint(endpoint_name=endpoint_name, json=json, **kwargs) 75 | response = requests.get(url) 76 | return response.json() if json else response.text 77 | 78 | @classmethod 79 | def list_methods(cls): 80 | 81 | methods_list = [ 82 | 'phonelookup', 83 | 'emailvalidator', 84 | 'disposablemailchecker', 85 | 'portscanner', 86 | 'portscanner_port', 87 | 'ping', 88 | 'gethostname', 89 | 'dnschecker', 90 | 'dnsresolver', 91 | 'ipvalidator', 92 | 'torchecker', 93 | 'iplogger', 94 | 'proxydetector', 95 | 'subdomainfinder', 96 | 'firewalldetector', 97 | 'ip2domains', 98 | 'alexarank', 99 | 'whois', 100 | 'createscreenshot', 101 | 'geoip', 102 | 'upordown', 103 | 'reputationchecker', 104 | 'getheaders', 105 | 'linkbackup', 106 | 'urlshortener', 107 | 'bitcoinbalance', 108 | 'ethereumbalance', 109 | 'currency', 110 | 'currencyrates', 111 | 'randomstringpicker', 112 | 'dictionary', 113 | 'definepicture', 114 | 'synonym', 115 | 'translate', 116 | 'randomperson', 117 | 'youtubedetails', 118 | 'youtubemp3', 119 | 'weather', 120 | 'qrgenerator', 121 | 'textparser', 122 | 'passwordgenerator', 123 | 'randomnumber', 124 | 'licensekeygenerator', 125 | 'eitheror', 126 | 'gif' 127 | ] 128 | 129 | return methods_list 130 | 131 | -------------------------------------------------------------------------------- /c99api/methods.py: -------------------------------------------------------------------------------- 1 | def register_methods(cls): 2 | method_names = [func.__name__ for func in globals().values() if callable(func) and func.__name__ != 'register_methods'] 3 | for method_name in method_names: 4 | method_func = globals()[method_name] 5 | setattr(cls, method_name, classmethod(method_func)) 6 | return cls 7 | 8 | """ 9 | Communication Tools 10 | """ 11 | def phonelookup(cls, number, json=True): 12 | return cls.perform_request(endpoint_name='phonelookup', number=number, json=json) 13 | 14 | def emailvalidator(cls, email, json=True): 15 | return cls.perform_request(endpoint_name='emailvalidator', email=email, json=json) 16 | 17 | def disposablemailchecker(cls, email, json=True): 18 | return cls.perform_request(endpoint_name='disposablemailchecker', email=email, json=json) 19 | 20 | 21 | """ 22 | Network Tools 23 | """ 24 | def portscanner(cls, host, json=True): 25 | return cls.perform_request(endpoint_name='portscanner', host=host, json=json) 26 | 27 | def portscanner_port(cls, host, port, json=True): 28 | return cls.perform_request(endpoint_name='portscanner_port', host=host, port=port, json=json) 29 | 30 | def ping(cls, host, json=True): 31 | return cls.perform_request(endpoint_name='ping', host=host, json=json) 32 | 33 | def gethostname(cls, host, json=True): 34 | return cls.perform_request(endpoint_name='gethostname', host=host, json=json) 35 | 36 | def dnschecker(cls, url, type, json=True): 37 | return cls.perform_request(endpoint_name='dnschecker', url=url, type=type, json=json) 38 | 39 | def dnsresolver(cls, host, server, json=True): 40 | return cls.perform_request(endpoint_name='dnsresolver', host=host, server=server, json=json) 41 | 42 | def ipvalidator(cls, ip, json=True): 43 | return cls.perform_request(endpoint_name='ipvalidator', ip=ip, json=json) 44 | 45 | def torchecker(cls, ip, json=True): 46 | return cls.perform_request(endpoint_name='torchecker', ip=ip, json=json) 47 | 48 | def iplogger(cls, action, json=True): 49 | return cls.perform_request(endpoint_name='iplogger', action=action, json=json) 50 | 51 | def proxydetector(cls, ip, json=True): 52 | return cls.perform_request(endpoint_name='proxydetector', ip=ip, json=json) 53 | 54 | 55 | """ 56 | Web Tools 57 | """ 58 | def subdomainfinder(cls, domain, json=True): 59 | return cls.perform_request(endpoint_name='subdomainfinder', domain=domain, json=json) 60 | 61 | def firewalldetector(cls, url, json=True): 62 | return cls.perform_request(endpoint_name='firewalldetector', url=url, json=json) 63 | 64 | def ip2domains(cls, ip, json=True): 65 | return cls.perform_request(endpoint_name='ip2domains', ip=ip, json=json) 66 | 67 | def alexarank(cls, url, json=True): 68 | return cls.perform_request(endpoint_name='alexarank', url=url, json=json) 69 | 70 | def whois(cls, domain, json=True): 71 | return cls.perform_request(endpoint_name='whois', domain=domain, json=json) 72 | 73 | def createscreenshot(cls, url, json=True): 74 | return cls.perform_request(endpoint_name='createscreenshot', url=url, json=json) 75 | 76 | def geoip(cls, host, json=True): 77 | return cls.perform_request(endpoint_name='geoip', host=host, json=json) 78 | 79 | def upordown(cls, host, json=True): 80 | return cls.perform_request(endpoint_name='upordown', host=host, json=json) 81 | 82 | def reputationchecker(cls, url, json=True): 83 | return cls.perform_request(endpoint_name='reputationchecker', url=url, json=json) 84 | 85 | def getheaders(cls, host, json=True): 86 | return cls.perform_request(endpoint_name='getheaders', host=host, json=json) 87 | 88 | def linkbackup(cls, url, json=True): 89 | return cls.perform_request(endpoint_name='linkbackup', url=url, json=json) 90 | 91 | def urlshortener(cls, url, json=True): 92 | return cls.perform_request(endpoint_name='urlshortener', url=url, json=json) 93 | 94 | 95 | """ 96 | Finance Tools 97 | """ 98 | def bitcoinbalance(cls, address, json=True): 99 | return cls.perform_request(endpoint_name='bitcoinbalance', address=address, json=json) 100 | 101 | def ethereumbalance(cls, address, json=True): 102 | return cls.perform_request(endpoint_name='ethereumbalance', address=address, json=json) 103 | 104 | def currency(cls, amount, from_currency, to_currency, json=True): 105 | return cls.perform_request(endpoint_name='currency', amount=amount, from_currency=from_currency, to_currency=to_currency, json=json) 106 | 107 | def currencyrates(cls, source, json=True): 108 | return cls.perform_request(endpoint_name='currencyrates', source=source, json=json) 109 | 110 | 111 | """ 112 | Miscellaneous 113 | """ 114 | def randomstringpicker(cls, textfile, json=True): 115 | return cls.perform_request(endpoint_name='randomstringpicker', textfile=textfile, json=json) 116 | 117 | def dictionary(cls, word, json=True): 118 | return cls.perform_request(endpoint_name='dictionary', word=word, json=json) 119 | 120 | def definepicture(cls, url, json=True): 121 | return cls.perform_request(endpoint_name='definepicture', url=url, json=json) 122 | 123 | def synonym(cls, word, json=True): 124 | return cls.perform_request(endpoint_name='synonym', word=word, json=json) 125 | 126 | def translate(cls, text, tolanguage, json=True): 127 | return cls.perform_request(endpoint_name='translate', text=text, tolanguage=tolanguage, json=json) 128 | 129 | def randomperson(cls, gender, json=True): 130 | return cls.perform_request(endpoint_name='randomperson', gender=gender, json=json) 131 | 132 | def youtubedetails(cls, videoid, json=True): 133 | return cls.perform_request(endpoint_name='youtubedetails', videoid=videoid, json=json) 134 | 135 | def youtubemp3(cls, videoid, json=True): 136 | return cls.perform_request(endpoint_name='youtubemp3', videoid=videoid, json=json) 137 | 138 | def weather(cls, location, json=True): 139 | return cls.perform_request(endpoint_name='weather', location=location, json=json) 140 | 141 | def qrgenerator(cls, string, size, json=True): 142 | return cls.perform_request(endpoint_name='qrgenerator', string=string, size=size, json=json) 143 | 144 | def textparser(cls, url, json=True): 145 | return cls.perform_request(endpoint_name='textparser', url=url, json=json) 146 | 147 | def passwordgenerator(cls, length, include, customlist, json=True): 148 | return cls.perform_request(endpoint_name='passwordgenerator', length=length, include=include, customlist=customlist, json=json) 149 | 150 | def randomnumber(cls, length, between, json=True): 151 | return cls.perform_request(endpoint_name='randomnumber', length=length, between=between, json=json) 152 | 153 | def licensekeygenerator(cls, template, amount, json=True): 154 | return cls.perform_request(endpoint_name='licensekeygenerator', template=template, amount=amount, json=json) 155 | 156 | 157 | """ 158 | Fun and Games 159 | """ 160 | def eitheror(cls, json=True): 161 | return cls.perform_request(endpoint_name='eitheror', json=json) 162 | 163 | def gif(cls, keyword, json=True): 164 | return cls.perform_request(endpoint_name='gif', keyword=keyword, json=json) 165 | 166 | -------------------------------------------------------------------------------- /example_usage.py: -------------------------------------------------------------------------------- 1 | from c99api import EndpointClient 2 | 3 | api = EndpointClient 4 | 5 | api.key = 'your_api_key' 6 | 7 | response = api.emailvalidator(email='test@c99.nl', json=False) 8 | print(response) -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | pip install -r requirements.txt 4 | 5 | pause 6 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

2 |


3 | 4 |


5 |

6 | 7 |

8 | Seamlessly integrate the c99.nl API into your Python projects 9 |

10 | 11 |

12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | # Installation 21 | 22 | ``` 23 | pip install c99api 24 | ``` 25 | 26 | **Initiator** 27 | ```python 28 | # Import the package 29 | from c99api import EndpointClient 30 | 31 | api = EndpointClient 32 | 33 | # Define your API key 34 | api.key = 'your_key' 35 | ``` 36 | 37 | # Usage 38 | 39 | ```python 40 | # Access list of different methods available 41 | response = api.list_methods() 42 | print(response) 43 | ``` 44 | ```python 45 | [ 46 | 'phonelookup', 47 | 'emailvalidator', 48 | 'disposablemailchecker', 49 | 'portscanner', 50 | 'portscanner_port', 51 | 'ping', 52 | 'gethostname', 53 | 'dnschecker', 54 | 'dnsresolver', 55 | 'ipvalidator', 56 | 'torchecker', 57 | 'iplogger', 58 | 'proxydetector', 59 | 'subdomainfinder', 60 | 'firewalldetector', 61 | 'ip2domains', 62 | 'alexarank', 63 | 'whois', 64 | 'createscreenshot', 65 | 'geoip', 66 | 'upordown', 67 | 'reputationchecker', 68 | 'getheaders', 69 | 'linkbackup', 70 | 'urlshortener', 71 | 'bitcoinbalance', 72 | 'ethereumbalance', 73 | 'currency', 74 | 'currencyrates', 75 | 'randomstringpicker', 76 | 'dictionary', 77 | 'definepicture', 78 | 'synonym', 79 | 'translate', 80 | 'randomperson', 81 | 'youtubedetails', 82 | 'youtubemp3', 83 | 'weather', 84 | 'qrgenerator', 85 | 'textparser', 86 | 'passwordgenerator', 87 | 'randomnumber', 88 | 'licensekeygenerator', 89 | 'eitheror', 90 | 'gif' 91 | ] 92 | ``` 93 | 94 | ## Use Cases 95 | ```python 96 | # With JSON 97 | response = api.emailvalidator(email='example@example.com', json=True) 98 | print(response) 99 | ``` 100 | ```json 101 | { 102 | "success": True, 103 | "exists": False, 104 | "error": "E-mail doesn't exist." 105 | } 106 | ``` 107 | 108 | 109 | ```python 110 | # Without JSON 111 | response = api.emailvalidator(email='example@example.com', json=False) 112 | print(response) 113 | ``` 114 | ```md 115 | Email doesn't exist 116 | ``` 117 | 118 | # Other 119 | 120 | ## To-Do 121 | Add dynamic parser for JSON responses 122 | 123 | 124 | ## Docs 125 | 126 | [API Overview](https://api.c99.nl/dashboard/api_overview) 127 | 128 | ## Warning 129 | 130 | **To use the c99.nl API you need to [purchase](https://api.c99.nl/dashboard/shop) an API key** 131 | 132 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | # Setting up 4 | setup( 5 | name="c99api", 6 | version='1.0', 7 | license='MIT', 8 | description='A Python wrapper and handler for the c99.nl API', 9 | author="David Peterson", 10 | author_email="dapanon@proton.me", 11 | url='https://github.com/Haste171/c99-api', 12 | packages=find_packages(), 13 | install_requires=['requests'], 14 | classifiers=[ 15 | 'Development Status :: 3 - Alpha', 16 | 'Intended Audience :: Developers', 17 | 'License :: OSI Approved :: MIT License', 18 | 'Programming Language :: Python :: 3', 19 | 'Programming Language :: Python :: 3.6', 20 | 'Programming Language :: Python :: 3.7', 21 | 'Programming Language :: Python :: 3.8', 22 | 'Programming Language :: Python :: 3.9', 23 | 'Programming Language :: Python :: 3.10', 24 | ], 25 | long_description=open('README.md').read(), 26 | long_description_content_type='text/markdown', 27 | ) --------------------------------------------------------------------------------