{ "info": { "author": "Antonio Sanchez", "author_email": "asanchez@koodous.com", "bugtrack_url": null, "classifiers": [], "description": "Koodous Python SDK\n##################\nThis is the Python SDK developed by our team to use Koodous easily.\n\nSHA-256\n=======\n\nKoodous works with many different hashing functions, but we prefer sha256 to \nmanage all samples in the better way.\n\nInstallation\n============\n\nLatest published release from PyPi:\n\n.. code-block:: bash\n\n $ pip install koodous\n\n\nDevelopment snapshot from Github:\n\n.. code-block:: bash\n\n $ pip install 'git+https://github.com/Koodous/python-sdk.git#egg=koodous'\n\n\nLibrary Usage\n=============\n\nThe only thing that you need is your API token that you can obtain after \nregistering to `koodous.com `_ for free!\n\nGo to your `profile `_ and there it is.\n\n.. code-block:: python\n\n import koodous\n koodous_obj = koodous.Koodous(token)\n\nUpload a file\n-------------\n\n.. code-block:: python\n\n koodous_obj.upload(filepath)\n\n\nSearch for APKs\n---------------\n\n.. code-block:: python\n\n apks = obj.search('whatsapp and package_name:\"com.whatsapp\" and size:2MB+ and rating:2+')\n\n\nThis returns contains a list object with the details of the found APKs.\n\n.. code-block:: json\n\n [\n ...,\n {\n \"size\": 16674795,\n \"rating\": 2,\n \"sha1\": \"8b0b907fb72d6284d22ccacb40df1b497a361ad1\",\n \"corrupted\": false,\n \"package_name\": \"com.whatsapp\",\n \"tags\": [\n \"googleplay\"\n ],\n \"image\": \"https://koodous.com/media/apk_images/tmpRdiC7v\",\n \"detected\": false,\n \"repo\": \"googleplay\",\n \"created_on\": 1426302935,\n \"stored\": true,\n \"displayed_version\": \"2.12.5\",\n \"analyzed\": true,\n \"sha256\": \"f149b135f86ce2dbaa6a0efb332fb0309d39dd692100172b4aff3f95ce5c43b4\",\n \"company\": \"WhatsApp Inc.\",\n \"app\": \"WhatsApp\",\n \"trusted\": false,\n \"md5\": \"3b7991ee09db22db6de8e1d5d58e2885\"\n },\n ...\n ]\n\n\nDownload an analysis\n--------------------\n\n.. code-block:: python\n\n analysis = koodous_obj.get_analysis(sha256)\n\nIf analysis raise an Exception this means that the analysis is not ready. You can require an analysis,\nwait 2 minutes approximately and request it again.\n\nIf something strange happends, this call returns ``None``.\n \n.. code-block:: python\n\n koodous_obj.analyze(apk) #Wait 2 minutes and retry get_analysis(sha256)\n\n\nAnd then you can access to analysis information (JSON format) using ``print(analysis)``:\n\n.. code-block:: json\n\n {\n \"androguard\": {\n \"app_name\": \"\u56fe\u8868\",\n \"package_name\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh\",\n \"providers\": [],\n \"new_permissions\": [],\n \"filters\": [\n \"android.app.action.DEVICE_ADMIN_ENABLED\",\n \"android.intent.action.MAIN\",\n \"android.provider.Telephony.SMS_RECEIVED\"\n ],\n \"max_sdk_version\": null,\n \"certificate\": {\n \"sha1\": \"7750A347F871CF2C9753A6958E87ABE2358AA9B0\",\n \"not_after\": \"Feb 23 07:41:48 2045 GMT\",\n \"issuerDN\": \"/C=US/O=Android/CN=Android Debug\",\n \"subjectDN\": \"/C=US/O=Android/CN=Android Debug\",\n \"serial\": \"54F565BC\",\n \"not_before\": \"Mar 3 07:41:48 2015 GMT\"\n },\n \"min_sdk_version\": \"8\",\n \"version_code\": \"2\",\n \"libraries\": [],\n \"target_sdk_version\": \"20\",\n \"cordova\": null,\n \"activities\": [\n \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.MainActivity\"\n ],\n \"main_activity\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.MainActivity\",\n \"receivers\": [\n \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.DevicesReceiver2\",\n \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.laixinxis\"\n ],\n \"signature_name\": \"META-INF/CERT.RSA\",\n \"dexes\": {\n \"classes\": {\n \"ssdeep\": \"384:lrmS/xLyL7zIQ9CIBLlCRWAodycJ2NWhWYORsynlvGO61EP4T:lSwxLInI3IBLntnhPOR2O6Y4T\",\n \"sha256\": \"17e213420ee4d5c78fb9fcd0e0af668922aaf7ff0c98d0ace3c21e58f19be8dd\"\n }\n },\n \"displayed_version\": \"2.0\",\n \"services\": [\n \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.MyServers1\"\n ],\n \"permissions\": [\n \"android.permission.SEND_SMS\",\n \"android.permission.KILL_BACKGROUND_PROCESSES\",\n \"android.permission.WRITE_SMS\",\n ...\n ],\n \"functionalities\": {\n \"dynamicbroadcastreceiver\": [\n {\n \"code\": \"invoke-virtual v7, v1, v0, v2, v6, Ldfkldsfdgjhdfg/fdgjndfkgirg/fghsdiuogh/MyServers1;->registerReceiver(Landroid/content/BroadcastReceiver; Landroid/content/IntentFilter; Ljava/lang/String; Landroid/os/Handler;)Landroid/content/Intent;\",\n \"class\": \"Ldfkldsfdgjhdfg/fdgjndfkgirg/fghsdiuogh/MyServers1;\",\n \"method\": \"onCreate\"\n },\n {\n \"code\": \"invoke-virtual v3, v1, Ldfkldsfdgjhdfg/fdgjndfkgirg/fghsdiuogh/MyServers1;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V\",\n \"class\": \"Ldfkldsfdgjhdfg/fdgjndfkgirg/fghsdiuogh/MyServers1;\",\n \"method\": \"onDestroy\"\n }\n ]\n },\n \"urls\": [\n \"http://60.8.229.158:8002/sj.asp\"\n ]\n },\n \"cuckoo\": {\n \"network\": {\n \"http\": [],\n \"smtp\": [],\n \"hosts\": [],\n \"dns\": [],\n \"domains\": [],\n \"irc\": []\n },\n \"target\": {\n \"category\": \"file\",\n \"file\": {\n \"size\": 54477,\n \"sha1\": \"4bac63842c26957190ae1722647c1f0fc6828f1d\",\n \"crc32\": \"4339AE28\",\n \"ssdeep\": \"768:XyDIt03WP8fPyKC4rCHkHu7rnQJ1KRPJEOdLt74Hz9DncM5WYxwiGM4ywEHfXl+5:ENzPKkO7rIKRPJFdxcBp5X8rEvMjy0r\",\n \"sha256\": \"88ddda0977d8af07d5b04979736e713a950767f7270658ead6781e6464631f8a\",\n \"sha512\": \"f6761c060b4bd80a9dd456f498a48d0dbd20056e33936fbb05e789cbea6f250c3debeafe2e1923df884b90aa793a5842814c7c30ea79f48666c4618f536a7db5\",\n \"md5\": \"4be0093ac136b39ec33021f7b55452a9\"\n }\n }\n },\n \"droidbox\": {\n \"fileswritten\": [],\n \"dns\": [],\n \"cryptousage\": [],\n \"filesread\": [\n {\n \"name\": \"/data/app/dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh-1.apk\",\n \"pid\": 846,\n \"processname\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh\",\n \"time\": 1.813291,\n \"tid\": 1073870640,\n \"data\": \"504b0506000000000b...\"\n }\n ],\n \"sendsms\": [],\n \"servicestart\": [\n {\n \"tid\": 1073870640,\n \"processname\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh\",\n \"pid\": 846,\n \"name\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh.MyServers1\",\n \"time\": 3.314782\n }\n ],\n \"sendnet\": [],\n \"libraries\": [],\n \"phonecalls\": [],\n \"recvnet\": [],\n \"dexclass\": [\n {\n \"tid\": 1073870640,\n \"processname\": \"dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh\",\n \"time\": 1.752926,\n \"pid\": 846,\n \"path\": \"/data/app/dfkldsfdgjhdfg.fdgjndfkgirg.fghsdiuogh-1.apk\"\n },\n ...\n ]\n }\n }\n\nDownloading a sample\n--------------------\nYou can use two methods, first download to a file directly:\n\n.. code-block:: python\n\n koodous_obj.download_to_file(sha256, \"/home/name/filename\")\n\n\nOr you can obtain the download URL to use as you want:\n\n.. code-block:: python\n\n url = koodous_obj.get_download_url(sha256)\n print(url)\n\n\nAnd then get the analysis:\n\n.. code-block:: python\n\n koodous_obj.analyze(sha256)\n #Wait 2 minutes and try:\n analysis = koodous_obj.get_analysis(sha256)\n\n\nRulesets\n========\n\nGet matches\n-----------\nIt must be used as iterator in python, for example:\n\n.. code-block:: python\n\n for val in koodous_obj.get_ruleset_matches(1337):\n print(val)\n\n\n``val`` will be a python dictionary with the following format:\n\n.. code-block:: json\n\n {\n \"count\": 3,\n \"results\": [{\n \"created_on\": 1498041142,\n \"rating\": 0,\n \"image\": \"https://cdn1.koodous.com/apk_images/2017/06/21/75d1a1e52070ff02e46dd9580c6ad96364a26d2714e802f8786bf285e390098a\",\n \"tags\": [],\n \"md5\": \"81b3f1c54330e3ca727b270f2a454354\",\n \"sha1\": \"d5d9f14f00c96b48acb8ac57960c6ca557cf5433\",\n \"sha256\": \"304202910418375c030472c31c8f588f9f6f6269a869d24e592b521d584031c4\",\n \"app\": \"\u641c\u72d7\u6d4f\u89c8\u5668\",\n \"package_name\": \"sogou.mobile.explorer\",\n \"company\": \"Sogou-inc\",\n \"displayed_version\": \"5.7.0\",\n \"size\": 11659573,\n \"stored\": true,\n \"analyzed\": true,\n \"is_apk\": true,\n \"trusted\": false,\n \"detected\": false,\n \"corrupted\": false,\n \"repo\": \"\",\n \"on_devices\": false\n },\n {...},\n {...}\n ]\n }\n\nComments\n========\n\nPosting a comment\n-----------------\n\n.. code-block:: python\n\n text_posted = koodous_obj.post_comment(sha256, comment_text)\n\nSee APK comments\n----------------\n\n.. code-block:: python\n\n koodous_obj.get_comments(sha256)\n [{\n 'author': {\n 'username': 'OpenAntivirus', 'total_public_rulesets': 1, 'first_name': '', 'last_name': '', 'total_comments': 669323, 'bio': None, 'following': [], 'twitter_user': None, 'is_superuser': True, 'avatar_url': 'https://cdn1.koodous.com/avatars/f743de5a3e28c8e0a513b73845dff589c7a3fab03eee46ed933a8ea8c7800540', 'last_login': 1440422421, 'total_following': 0, 'latest_24h_social_detections': 5, 'total_social_detections': 589, 'total_followers': 22, 'occupation': None, 'total_votes': 686908, 'date_joined': 1431507752\n }, 'text': '#sms-fraud This application sends SMS messages that costs you money', 'apk': 'b499cb515e5b6086c7b993c529e602b190b4a031534ec887d8dcaf7ec4d6a489', 'created_on': 1452908630, 'ruleset': None, 'modified_on': 1452908630, 'id': 637165\n }]\n\nDelete a comment\n----------------\n\n.. code-block:: python\n\n koodous_obj.delete_comment(comment_id)\n\n\nVotes\n=====\n\nVote a sample positive (goodware)\n---------------------------------\n\n.. code-block:: python\n\n koodous_obj.vote_apk(sha256, koodous.POSITIVE)\n {'kind': 'positive'}\n\n\nVote a sample negative (malware)\n--------------------------------\n\n.. code-block:: python\n\n koodous_obj.vote_apk(sha256, koodous.NEGATIVE)\n {'kind': 'negative'}\n\n\nGet votes for an APK\n--------------------\n\n.. code-block:: python\n\n koodous_obj.votes(sha256)\n {\n 'count': 3,\n 'previous': None,\n 'results': [{\n 'kind': 'negative',\n 'analyst': 'Incentoll'\n }, {\n 'kind': 'negative',\n 'analyst': 'OpenAntivirus'\n }, {\n 'kind': 'negative',\n 'analyst': 'Forits'\n }],\n 'next': None\n }\n\n\nCommand Line Interface (CLI)\n============================\nThe SDK comes with a basic CLI that gets installed automatically and linked\nas an executable script by setuptools.\n\n.. code-block::\n\n Usage: koocli [OPTIONS] COMMAND [ARGS]...\n\n A simple command line interface (CLI) to the Koodous API.\n\n In order to use this CLI, you need an account at koodous.com and you need\n to grab your API token at https://koodous.com/settings/profile\n\n You can pass the API token both as a command line option, or set it as an\n environment variable (TOKEN).\n\n To get help for each individual command, just type\n\n $ koocli --help\n\n Options:\n --quiet / --no-quiet Suppress output (logging is configured\n separately)\n --wdir PATH Working directory [required]\n --loglevel [info|warning|critical|error|debug|notset]\n --token TEXT Koodous API token [required]\n --help Show this message and exit.\n\n Commands:\n get_matches_public_ruleset Get the APKs that match a public ruleset by...\n get_public_ruleset Get a public ruleset by its RULESET_ID\n\n\nGet a public ruleset metadata and download the first three matches\n------------------------------------------------------------------\n\n.. code-block::\n\n $ TOKEN='' koocli --wdir /tmp/ \\\n get_matches_public_ruleset --download --save --limit 3 666\n \n 2015-12-08 13:29:42 yummy-ng.local koocli[19989] INFO Attempting to fetch ruleset 666\n 2015-12-08 13:29:42 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): koodous.com\n 2015-12-08 13:29:43 yummy-ng.local koocli[19989] INFO Saving ruleset to /tmp/ruleset-666.json\n 2015-12-08 13:29:43 yummy-ng.local koocli[19989] INFO Ruleset saved successfully\n 2015-12-08 13:29:43 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): koodous.com\n {\n \"analyzed\": true,\n \"app\": \"Lucky Patcher\",\n \"company\": \"pitorroman\",\n \"corrupted\": false,\n \"created_on\": 1448478971,\n \"detected\": true,\n \"displayed_version\": \"4.0\",\n \"image\": \"https://cdn1.koodous.com/apk_images/647cb4313025b161a15e36c3270889a4bb556639f5d7aed8e2193f6904915bc7\",\n \"is_apk\": true,\n \"md5\": \"036d66d86911ed1bfb75c19f55a4b435\",\n \"on_devices\": false,\n \"package_name\": \"com.forpda.lp\",\n \"rating\": 0,\n \"repo\": \"\",\n \"sha1\": \"e16af16b743bfb4ac3fc54b6f90f7995805b58a0\",\n \"sha256\": \"01739acdf16999cabf147e679419c9dd7d910663d51e9e9ad9be95526f5cc770\",\n \"size\": 789528,\n \"stored\": true,\n \"tags\": [],\n \"trusted\": false\n }\n\n 2015-12-08 13:29:44 yummy-ng.local koocli[19989] INFO Saving metadata of 01739acdf16999cabf147e679419c9dd7d910663d51e9e9ad9be95526f5cc770 to /tmp/01739acdf16999cabf147e679419c9dd7d910663d51e9e9ad9be95526f5cc770.json\n 2015-12-08 13:29:44 yummy-ng.local koocli[19989] INFO Downloading 01739acdf16999cabf147e679419c9dd7d910663d51e9e9ad9be95526f5cc770 to /tmp/01739acdf16999cabf147e679419c9dd7d910663d51e9e9ad9be95526f5cc770.apk\n 2015-12-08 13:29:44 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): koodous.com\n 2015-12-08 13:29:45 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): lmcn4.koodous.com\n 2015-12-08 13:29:47 yummy-ng.local koocli[19989] INFO APK downloaded successfully\n {\n \"analyzed\": true,\n \"app\": \"Lucky Patcher\",\n \"company\": \"tengyhman\",\n \"corrupted\": false,\n \"created_on\": 1448468963,\n \"detected\": true,\n \"displayed_version\": \"2.7\",\n \"image\": \"https://cdn1.koodous.com/apk_images/647cb4313025b161a15e36c3270889a4bb556639f5d7aed8e2193f6904915bc7\",\n \"is_apk\": true,\n \"md5\": \"ec92e27ba0dcaed9150bb711e13bc817\",\n \"on_devices\": false,\n \"package_name\": \"com.wLuckyPatcherFree\",\n \"rating\": 0,\n \"repo\": \"\",\n \"sha1\": \"e1d8a51197afd5b0149504be17ccc0a29328da87\",\n \"sha256\": \"04d0dffc667e0f68a619deaf580eaa63227c7dd7ba1d63f47a6b616d9a275970\",\n \"size\": 789362,\n \"stored\": true,\n \"tags\": [],\n \"trusted\": false\n }\n\n 2015-12-08 13:29:47 yummy-ng.local koocli[19989] INFO Saving metadata of 04d0dffc667e0f68a619deaf580eaa63227c7dd7ba1d63f47a6b616d9a275970 to /tmp/04d0dffc667e0f68a619deaf580eaa63227c7dd7ba1d63f47a6b616d9a275970.json\n 2015-12-08 13:29:47 yummy-ng.local koocli[19989] INFO Downloading 04d0dffc667e0f68a619deaf580eaa63227c7dd7ba1d63f47a6b616d9a275970 to /tmp/04d0dffc667e0f68a619deaf580eaa63227c7dd7ba1d63f47a6b616d9a275970.apk\n 2015-12-08 13:29:47 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): koodous.com\n 2015-12-08 13:29:48 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): lmcn4.koodous.com\n 2015-12-08 13:29:49 yummy-ng.local koocli[19989] INFO APK downloaded successfully\n {\n \"analyzed\": true,\n \"app\": \"Puffin Web Browser\",\n \"company\": \"tegyhmans\",\n \"corrupted\": false,\n \"created_on\": 1448466542,\n \"detected\": true,\n \"displayed_version\": \"3.8.1.0\",\n \"image\": \"https://cdn1.koodous.com/apk_images/ca1310bc1ae8dc8795588bf894b9c01c43f00d4ff7b48f6ad7cc5130f33e573e\",\n \"is_apk\": true,\n \"md5\": \"82c6684ba4478d99111dd7f5e4edc6b9\",\n \"on_devices\": false,\n \"package_name\": \"com.cloudmosa.puffin\",\n \"rating\": 0,\n \"repo\": \"\",\n \"sha1\": \"e22a7ed086b9008d86aa5801868b096af30bd087\",\n \"sha256\": \"4b004d99816a6c777319e9abfb1c4c9b259da68cd8de65558e2596ba18ed9e86\",\n \"size\": 761235,\n \"stored\": true,\n \"tags\": [],\n \"trusted\": false\n }\n\n 2015-12-08 13:29:49 yummy-ng.local koocli[19989] INFO Saving metadata of 4b004d99816a6c777319e9abfb1c4c9b259da68cd8de65558e2596ba18ed9e86 to /tmp/4b004d99816a6c777319e9abfb1c4c9b259da68cd8de65558e2596ba18ed9e86.json\n 2015-12-08 13:29:49 yummy-ng.local koocli[19989] INFO Downloading 4b004d99816a6c777319e9abfb1c4c9b259da68cd8de65558e2596ba18ed9e86 to /tmp/4b004d99816a6c777319e9abfb1c4c9b259da68cd8de65558e2596ba18ed9e86.apk\n 2015-12-08 13:29:49 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): koodous.com\n 2015-12-08 13:29:50 yummy-ng.local requests.packages.urllib3.connectionpool[19989] INFO Starting new HTTPS connection (1): lmcn4.koodous.com\n 2015-12-08 13:29:52 yummy-ng.local koocli[19989] INFO APK downloaded successfully\n 2015-12-08 13:29:52 yummy-ng.local koocli[19989] INFO Limit of 3 matches reached: stopping!\n\nIn this case 666 is the public ruleset identifier that you can get from the\nURL (e.g., ``https://koodous.com/rulesets/666``)\n\nYou can play with the options to suppress logging, verbosity and avoid saving\nthe metadata, if you're not interested in. Just saying.\n\n\nUtils\n=====\nWe implemented some tools to interact with APKs and not related explicitly with Koodous:\n \nSHA256 file\n-----------\n\n.. code-block:: python\n\n import koodous\n koodous.utils.sha256('/home/user/file.apk')\n '133ee989293f92736301280c6f14c89d521200c17dcdcecca30cd20705332d44'\n\n\nUnpack file\n-----------\n\nUnpack an APK and generate one file with all content uncompressed.\n\n.. code-block:: python\n\n import koodous\n koodous.utils.unpack('sample_test.apk', 'destination_file')\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/Koodous/python-sdk/archive/master.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://koodous.com/", "keywords": "koodous", "license": "Apache Version 2", "maintainer": "", "maintainer_email": "", "name": "koodous", "package_url": "https://pypi.org/project/koodous/", "platform": "", "project_url": "https://pypi.org/project/koodous/", "project_urls": { "Download": "https://github.com/Koodous/python-sdk/archive/master.zip", "Homepage": "https://koodous.com/" }, "release_url": "https://pypi.org/project/koodous/1.0.1/", "requires_dist": null, "requires_python": "", "summary": "Module to interact with Koodous API", "version": "1.0.1" }, "last_serial": 4659712, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "9997b361af3dd767ea08a31751bb667e", "sha256": "ab70a1e4d68eac267628dba00562d278c2bc59109c93f4a3c90e210dd88a0cea" }, "downloads": -1, "filename": "koodous-1.0.0.tar.gz", "has_sig": false, "md5_digest": "9997b361af3dd767ea08a31751bb667e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20453, "upload_time": "2018-12-10T08:58:48", "url": "https://files.pythonhosted.org/packages/cb/42/283843089e1cf7cf3de882901339754b1a26c1f7e9ebb057c7d03c216d6d/koodous-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "02b28b8481bfe35ff2360573b1e58e33", "sha256": "9f933015aad81e48f8f0b72f9e9bd4c94657aa59e9fd00e25d0f9b298075f5c7" }, "downloads": -1, "filename": "koodous-1.0.1.tar.gz", "has_sig": false, "md5_digest": "02b28b8481bfe35ff2360573b1e58e33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20500, "upload_time": "2019-01-04T10:23:52", "url": "https://files.pythonhosted.org/packages/f5/25/f7fff76defcb8465adc8fd122e35074e1821348fdf0d290101f9842df4e0/koodous-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "02b28b8481bfe35ff2360573b1e58e33", "sha256": "9f933015aad81e48f8f0b72f9e9bd4c94657aa59e9fd00e25d0f9b298075f5c7" }, "downloads": -1, "filename": "koodous-1.0.1.tar.gz", "has_sig": false, "md5_digest": "02b28b8481bfe35ff2360573b1e58e33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20500, "upload_time": "2019-01-04T10:23:52", "url": "https://files.pythonhosted.org/packages/f5/25/f7fff76defcb8465adc8fd122e35074e1821348fdf0d290101f9842df4e0/koodous-1.0.1.tar.gz" } ] }