changeset 46:522ad91a230e

Add kemonopartydownloader.py committer: GitHub <noreply@github.com>
author Paper <37962225+mrpapersonic@users.noreply.github.com>
date Sat, 31 Jul 2021 01:38:03 -0400
parents ed1618304c9b
children 00403c09455c
files kemonopartydownloader.py
diffstat 1 files changed, 98 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kemonopartydownloader.py	Sat Jul 31 01:38:03 2021 -0400
@@ -0,0 +1,98 @@
+# example args.url: https://kemono.party/fanbox/user/5375435/post/2511461
+import json
+import urllib.request
+import os
+import requests  # pip install requests
+import argparse
+import http.cookiejar
+import time
+from urllib.error import HTTPError
+
+def downloadfile(i, x, count):
+    with req.get(f"https://data.kemono.party{x['path']}", stream=True) as r:
+        r.raise_for_status()
+        if not os.path.exists("{4}\\{0}_{1}p_{2}_{3}".format(i["id"], count, i["title"], os.path.basename(x["path"]), output)):
+            with open("{4}\\{0}_{1}p_{2}_{3}".format(i["id"], count, i["title"], os.path.basename(x["path"]), output), "wb") as f:
+                for chunk in r.iter_content(chunk_size=4096):
+                    f.write(chunk)
+                print("image {0} successfully downloaded!".format(count))
+        else:
+            print("image {0} already downloaded! skipping...".format(count))
+
+parser = argparse.ArgumentParser(description="Downloads (deleted) videos from YTPMV creators")
+parser.add_argument("-u", "--url", help="user URL", metavar='<url>', required=True)
+parser.add_argument("-c", "--cookies", help="", metavar='<url>', required=True)  # required because of DDoS-GUARD
+parser.add_argument("-p", "--proxy", help="proxy\n supported types: http, https, socks5 (requires pysocks)", metavar='<url>')  # SOCKS proxy support is through PySocks - pip install pysocks
+parser.add_argument("-o", "--output", help="output folder, defaults to user ID", metavar='<url>')
+args = parser.parse_args()
+
+req = requests.Session()
+
+if args.proxy:
+    if args.proxy[:6] == "socks5":
+        httpproxy = args.proxy
+        httpsproxy = args.proxy
+    elif args.proxy[0:5] == "https":
+        httpsproxy = args.proxy
+    elif args.proxy[0:4] == "http":
+        httpproxy = args.proxy
+    else:
+        print("unknown proxy format! defaulting to HTTP...")
+        httpproxy = args.proxy
+    if httpproxy:
+        req.proxies = {
+            "http": httpproxy,
+        }
+    if httpsproxy:
+        req.proxies["https"] = httpsproxy
+
+cj = http.cookiejar.MozillaCookieJar(args.cookies)
+cj.load(ignore_expires=True)
+req.cookies = cj
+
+try:
+    int(args.url)
+    print("do not input user IDs here! use a link instead")
+    exit()
+except Exception:
+    pass
+
+if args.url.split("/")[-2] == "post":
+    service = args.url.split("/")[-5]
+    user = args.url.split("/")[-3]
+    post = args.url.split("/")[-1]
+    userdata = req.get("https://kemono.party/api/{0}/user/{1}/post/{2}".format(service, user, post)).json()
+elif args.url.split("/")[-2] == "user":
+    service = args.url.split("/")[-3]
+    user = args.url.split("/")[-1]
+    userdata = req.get("https://kemono.party/api/{0}/user/{1}".format(service, user)).json()
+
+if not args.output:
+    output = user
+else:
+    output = args.output
+
+if not os.path.isdir(output):
+    if os.path.exists(output):
+        os.remove(output)
+    os.mkdir(output)
+
+for i in userdata:
+    print(i["id"])
+    post = i["id"]
+    count = 0
+    for x in i["attachments"]:
+        count += 1
+        if os.path.exists("{4}\\{0}_{1}p_{2}_{3}".format(int(i["id"]) - 1, count, i["title"], os.path.basename(x["path"]), output)):
+            print("image {0} already downloaded! skipping...".format(count))
+            continue
+        while not os.path.exists("{4}\\{0}_{1}p_{2}_{3}".format(int(i["id"]) - 1, count, i["title"], os.path.basename(x["path"]), output)):
+            try:
+                downloadfile(i, x, count)
+                break
+            except HTTPError:
+                time.sleep(10)
+                downloadfile(i, x, count)
+            except Exception as e:
+                print(e)
+            time.sleep(10)