Skip to content

Instantly share code, notes, and snippets.

@phorward
Created October 19, 2022 15:03
Show Gist options
  • Save phorward/30a81754d338dad827cd38b177c17bd2 to your computer and use it in GitHub Desktop.
Save phorward/30a81754d338dad827cd38b177c17bd2 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import requests, sys, os, urllib
def getOrCreateDir(sess, host, parent, name):
folder = sess.get(host + "/vi/file/list/node",
params={
"node": parent,
"name": name.decode("utf-8")
}).json()
if folder["skellist"]:
folder = folder["skellist"][0]["key"]
print("Folder %r exists as %r under %r" % (name, folder, parent))
else:
folder = sess.post(host + "/vi/file/add/node",
data={
"node": parent,
"name": name.decode("utf-8"),
"skey": sess.get(host + "/vi/skey").json()
}).json()["values"]["key"]
print("Folder %r created as %r under %r" % (name, folder, parent))
return folder
def getOrUploadFile(sess, host, parent, name, filepath):
print(name)
file = sess.get(host + "/vi/file/list/leaf",
params={
"node": parent,
"name": name.decode("utf-8")
}).json()
if file["skellist"]:
file = file["skellist"][0]["key"]
print("File %r exists as %r under %r" % (name, file, parent))
else:
url = sess.get(host + "/vi/file/getUploadURL", params={"skey": sess.get(host + "/vi/skey").json()}).text
file = sess.post(url,
data={
"node": parent,
"name": name.decode("utf-8"),
"skey": sess.get(host + "/vi/skey").json()
},
files=[
(name.decode("utf-8"), open(filepath, "r").read())
]).json()["values"][0]["key"]
print("File %r created as %r under %r" % (name, file, parent))
return file
if __name__ == "__main__":
host = "https://xxx-viur.appspot.com"
user = "xxx@xxx.de"
pw = "xxx"
folder = "CD-ROM"
sess = requests.Session()
ret = sess.post(
host + "/vi/user/auth_userpassword/login",
data={
"name": user,
"password": pw,
"skey": sess.get(host + "/vi/skey").json()
}
)
if not ret.ok:
print("Unable to logon")
sys.exit(1)
# get root folder
root = sess.get(host + "/vi/file/listRootNodes").json()[0]["key"]
dirs = {"": root}
for (dirpath, dirnames, filenames) in os.walk(folder):
parent = os.path.join(os.path.split(dirpath)[:-1])[0]
folder = os.path.split(dirpath)[-1]
dirs[dirpath] = getOrCreateDir(sess, host, dirs[parent], folder)
for filename in filenames:
getOrUploadFile(sess, host, dirs[dirpath], filename, os.path.join(dirpath, filename))
ret = sess.post(
host + "/vi/user/logout",
data={
"skey": sess.get(host + "/vi/skey").json()
}
)
if not ret.ok:
print("Can't logout")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment