{ "metadata": { "name": "", "signature": "sha256:df62654408206ad5cee9e1183e4d0faf6aa9e5780a94792bde4d460d959be015" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from personal_info import userid, password, sid, progKey # setup your personal information, see personal_info.example.py" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 287 }, { "cell_type": "code", "collapsed": false, "input": [ "%%writefile AsusWebStorage.py\n", "import uuid\n", "import time\n", "import hashlib\n", "import hmac\n", "from urllib2 import quote\n", "from getpass import getpass\n", "import requests\n", "from lxml import etree\n", "from collections import OrderedDict\n", "SERVICE_PORTAL = \"https://sp.yostore.net/\"\n", "\n", "class odict(OrderedDict):\n", " def __str__(self): \n", " def _str(x):\n", " if isinstance(x,list):\n", " if len(x)==1:\n", " return _str(x[0])\n", " return \"\\n\"+\"\\n\".join(_str(y).replace(\"\\n\", \"\\n\\t\") for y in x)\n", " return str(x) \n", " return \"ODICT:\\n\" + \"\\n\".join(\"\\t%s: %s\"%(k,_str(v).replace(\"\\n\", \"\\n\\t\")) for k,v in self.iteritems())\n", " def _repr_html_(self):\n", " def _html(x):\n", " if isinstance(x,list):\n", " if len(x)==1:\n", " return _html(x[0])\n", " return \"
    LIST:\"+\"\\n\".join(\"
  1. \"+_html(y)+\"
  2. \" for y in x)+\"
\"\n", " elif hasattr(x, \"_repr_html_\"):\n", " return x._repr_html_()\n", " else:\n", " return str(x) \n", " return \"\"\n", " \n", "def recursive_dict(element):\n", " # return element.tag, odict(map(recursive_dict,element)) or element.text\n", " if len(element): \n", " rtn = odict()\n", " for e in element: \n", " tag, d = recursive_dict(e) \n", " rtn.setdefault(tag, []).append(d)\n", " else:\n", " rtn = element.text\n", " if rtn is None and 'name' in element.attrib and 'value' in element.attrib:\n", " return element.tag+\".\"+element.attrib['name'], element.attrib['value']\n", " return element.tag, rtn\n", "\n", "def xml_to_dict(xmlstr):\n", " try:\n", " return recursive_dict(etree.fromstring(xmlstr))\n", " except:\n", " print \"failed\", xmlstr\n", "\n", "def recursive_xml(d, dep=\" \"): \n", " return \"\\n\".join(\"%s<%s>%s\"%(dep, k, \n", " (\"\\n\"+recursive_xml(v, dep+\" \") if isinstance(v, dict) else v), \n", " k) for k,v in d.items())\n", " \n", "def dict_to_xml(d, roottag):\n", " return '\\n<%s>\\n%s\\n'%(roottag, recursive_xml(d), roottag)\n", "\n", "def time_stamp():\n", " return int(round(time.time() ))\n", "\n", "ERROR_MSG ={0:'Success', \n", " 2:'User Authentication Fail', \n", " 3: 'Payload is not validate', \n", " 5: 'Developer Authentication Fail', \n", " 225: 'Parameter Error',\n", " 504: 'OTP Auth Failed: USer ID/password/OTP incoreect or without OTP when required',\n", " 505: 'OTP Credential ID is locked',\n", " 508: \"CAPTCHA Failed\", \n", " 999:'General Error'}\n", "def arg_props(d, *keys):\n", " return [(k,d[k]) for k in keys if k in d and d[k] is not None]\n", "\n", "class AsusWebStorage(object): \n", " def __init__(self, sid, progkey, userid, password, language='zh_TW', service=1):\n", " self.__dict__.update(locals())\n", " self.session = requests.Session()\n", " \n", " def authString(self):\n", " method = \"HMAC-SHA1\"\n", " nonce = str(uuid.uuid1()).replace('-','')\n", " timestamp = time_stamp()\n", " plain = \"nonce=%s&signature_method=%s×tamp=%s\"%(nonce,method,timestamp)\n", " quoted = quote(plain) \n", " signature = quote(hmac.new(self.progkey, quoted, hashlib.sha1).digest().encode('base64').rstrip('\\n'))\n", " return 'signature_method=\"%s\",timestamp=\"%s\",nonce=\"%s\",signature=\"%s\"'%(method, timestamp, nonce, signature)\n", " \n", " def post(self, act, url, payload, oauth=False):\n", " print \"post\", act, url, payload\n", " headers = { \"Cookie\": \"sid=%s;\"%self.sid}\n", " if oauth:\n", " headers[\"Authorization\"] = self.authString()\n", " data = dict_to_xml(odict(payload), act)\n", " self.last_response = self.session.post(url, data=data, headers=headers) \n", " rootname, result = xml_to_dict(self.last_response.content) \n", " self.result = result\n", " status = int(result['status'][0]) \n", " if status != 0: \n", " print \"url=\"+url, \"act=\"+act, \"rootname=\"+rootname\n", " print \"DATA:\"\n", " print data\n", " if status in ERROR_MSG: \n", " print \"Error:\", ERROR_MSG[status]\n", " else:\n", " print \"Error: code=%d\"%status\n", " return status, None\n", " return status, result \n", "\n", " \n", " def props(self, *keys):\n", " return [(k, time_stamp() if k==\"time\" else getattr(self, k)) for k in keys]\n", " \n", " def requestservicegateway(self):\n", " act = \"requestservicegateway\"\n", " url = SERVICE_PORTAL + \"member/%s/\"%act\n", " payload = self.props('userid','password', 'language', 'service')\n", " status, result = self.post(act, url, payload)\n", " if not status:\n", " self.gateway = \"https://%s/\"%result['servicegateway'][0]\n", " return self.gateway \n", " \n", " def acquiretoken(self): \n", " act = \"aaa\"\n", " url = self.gateway + \"member/acquiretoken/\"\n", " payload = self.props ('userid', 'password', 'time')\n", " \n", " status, result = self.post(act, url, payload, oauth=True)\n", " if not status:\n", " self.token = result['token'][0]\n", " self.inforelay = \"https://%s/\"%result['inforelay'][0]\n", " self.webrelay = \"https://%s/\"%result['webrelay'][0]\n", " self.searchserver = \"https://%s/\"%result['searchserver'][0]\n", " self.package = result['package'][0]\n", " return self.token\n", " \n", " def connect(self):\n", " if self.requestservicegateway():\n", " for i in range(2): # acquiretoken sometimes fails for some reason\n", " if self.acquiretoken():\n", " return True\n", " \n", " def getinfo(self):\n", " act = \"getinfo\"\n", " url = self.gateway + \"member/%s/\"%act\n", " payload = self.props ('userid', 'token', 'time')\n", " status, result = self.post(act, url, payload)\n", " return result\n", " \n", " def browsefolder(self, folderid, type=None, pageno=None, pagesize=None, sortby=1, sortdirection=0):\n", " act = \"browse\"\n", " url = self.inforelay + \"inforelay/browsefolder/\"\n", " payload = self.props ('token', 'language', 'userid') \n", " payload += arg_props(locals(), \"folderid\", \"type\", \"pageno\", \"pagesize\", \"sortby\", \"sortdirection\")\n", " status, result = self.post(act, url, payload)\n", " return result\n", " \n", " def getpersonalsystemfolder(self, rawfoldername):\n", " act = \"getpersonalsystemfolder\"\n", " url = self.inforelay + \"folder/%s/\"%act\n", " payload = self.props(\"token\", \"userid\") + arg_props(locals(), \"rawfoldername\")\n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result['folderid'][0]\n", " \n", " def getlatestchangefiles(self, top=None, targetroot=\"-5\", sortdirection=0):\n", " act = \"getlatestchangefiles\"\n", " url = self.inforelay + \"file/%s/\"%act\n", " payload = self.props(\"token\", \"userid\") + arg_props(locals(), \"top\", \"targetroot\", \"sortdirection\")\n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result['entry', isdi]\n", " def getallchangeseq(self):\n", " \n", " act = \"getentryinfo\"\n", " url = self.inforelay + \"fsentry/%s/\"%act\n", " payload = self.props(\"token\") \n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result\n", " \n", " def getentryinfo(self, isfolder, entryid):\n", " act = \"getentryinfo\"\n", " url = self.inforelay + \"fsentry/%s/\"%act\n", " payload = self.props(\"token\") + arg_props(locals(), \"isfolder\", \"entryid\")\n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result\n", " \n", " def propfind(self, parent, find, type=\"system.unknown\", isshared=None):\n", " act = \"propfind\"\n", " url = self.inforelay + \"find/%s/\"%act\n", " find = find.encode(\"base64\").strip(\"\\n\")\n", " payload = self.props(\"token\", \"userid\") + arg_props(locals(), \"parent\", \"find\", \"type\", \"isshared\")\n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result\n", " \n", " def getmysyncfolder(self):\n", " act = \"getmysyncfolder\"\n", " url = self.inforelay + \"folder/%s/\"%act\n", " payload = self.props(\"userid\", \"token\")\n", " status, result = self.post(act, url, payload)\n", " if status is 0:\n", " return result[\"id\"][0]\n", " \n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overwriting AsusWebStorage.py\n" ] } ], "prompt_number": 288 }, { "cell_type": "code", "collapsed": false, "input": [ "%run AsusWebStorage.py" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 289 }, { "cell_type": "code", "collapsed": false, "input": [ "%%javascript\n", "IPython.notebook.execute_cells_above()\n", "IPython.notebook.get_cells()[1].code_mirror.setSize(null, 400)" ], "language": "python", "metadata": {}, "outputs": [ { "javascript": [ "IPython.notebook.execute_cells_above()\n", "IPython.notebook.get_cells()[1].code_mirror.setSize(null, 400)" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] }, { "javascript": [ "IPython.notebook.execute_cells_above()\n", "IPython.notebook.get_cells()[1].code_mirror.setSize(null, 400)" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 286 }, { "cell_type": "code", "collapsed": false, "input": [ "# TEST \n", "aws = AsusWebStorage(sid, progKey, userid, password) \n", "if aws.connect(): \n", " folderid = aws.getpersonalsystemfolder('MySyncFolder')\n", "aws.browsefolder(folderid)\n", " #86259931" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "post requestservicegateway https://sp.yostore.net/member/requestservicegateway/ [('userid', 'tzerjen@gmail.com'), ('password', '5e7c12ebc1d7f16679a75def8f81977b'), ('language', 'zh_TW'), ('service', 1)]\n", "post" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " aaa https://sg01.asuswebstorage.com/member/acquiretoken/ [('userid', 'tzerjen@gmail.com'), ('password', '5e7c12ebc1d7f16679a75def8f81977b'), ('time', 1408695874)]\n", "post" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " getpersonalsystemfolder https://ir01.asuswebstorage.com/folder/getpersonalsystemfolder/ [('token', 'es9qwgvsha9st'), ('userid', 'tzerjen@gmail.com'), ('rawfoldername', 'MySyncFolder')]\n", "post" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " browse https://ir01.asuswebstorage.com/inforelay/browsefolder/ [('token', 'es9qwgvsha9st'), ('language', 'zh_TW'), ('userid', 'tzerjen@gmail.com'), ('folderid', '86258859'), ('sortby', 1), ('sortdirection', 0)]\n" ] }, { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 290, "text": [ "odict([('status', ['0']), ('logmessage', [None]), ('scrip', ['1408695876906']), ('rawfoldername', ['MySyncFolder']), ('parent', ['-5']), ('rootfolderid', ['-5']), ('page', [odict([('pageno', ['1']), ('pagesize', ['3']), ('totalcount', ['3']), ('hasnextpage', ['0'])])]), ('folder', [odict([('id', ['86652770']), ('treesize', ['3932700026']), ('isgroupaware', ['0']), ('rawfoldername', ['Discrete Optimization']), ('isbackup', ['0']), ('isorigdeleted', ['0']), ('ispublic', ['1']), ('createdtime', ['2014-07-25 11:59:22.337']), ('contributor', ['tzerjen@gmail.com'])]), odict([('id', ['86436877']), ('treesize', ['4237994']), ('isgroupaware', ['0']), ('rawfoldername', ['Sample']), ('isbackup', ['0']), ('isorigdeleted', ['0']), ('ispublic', ['0']), ('createdtime', ['2014-07-22 21:46:20.763']), ('contributor', ['tzerjen@gmail.com'])]), odict([('id', ['86259931']), ('treesize', ['33404059246']), ('isgroupaware', ['0']), ('rawfoldername', ['test']), ('isbackup', ['0']), ('isorigdeleted', ['0']), ('ispublic', ['0']), ('createdtime', ['2014-07-20 16:11:45.103']), ('contributor', ['tzerjen@gmail.com'])])]), ('owner', ['tzerjen@gmail.com'])])" ] } ], "prompt_number": 290 }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"requestservicegateway\"\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid }\n", "header = { \"Cookie\": \"sid=%s;\"%sid }\n", "\n", "payload = odict([ (\"userid\", userid),\n", " (\"password\", password), \n", " (\"language\", \"zh_TW\"),\n", " (\"service\", 1)])\n", "print \"payload:\\n\", dict_to_xml(payload, ACT)\n", "URL = service_portal + \"member/%s/\"%ACT\n", "print \"URL=\", URL\n", "r = requests.post(URL, data=dict_to_xml(payload, ACT), headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "result = xml_to_dict(r.content)[1]\n", "print \"status=\", result['status']\n", "gateway = \"https://\"+result['servicegateway']+\"/\"\n", "print \"gateway=\", gateway" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"tocompactform\"\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid }\n", "payload = odict([ (\"userid\", userid),\n", " (\"password\", password), \n", " (\"sharecode\", \"fdasfadsfasd\"),\n", " ])\n", "print \"payload:\\n\", dict_to_xml(payload, ACT)\n", "URL = service_portal + \"sharecode/%s/\"%ACT\n", "print \"URL=\", URL\n", "r = requests.post(URL, data=dict_to_xml(payload, ACT), headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "print \"body:\\n\", r.content\n", "result = xml_to_dict(r.content)[1]\n", "print result\n", "print \"status=\", result['status']\n", "print result['compactsharecode']" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"acquiretoken\"\n", "x = authString(progKey)\n", "print x\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid, \"Authorization\": x }\n", "payload = odict([ (\"userid\", userid),\n", " (\"password\", password), \n", " (\"time\", int(time.time())),\n", " ])\n", "URL = gateway + \"member/%s/\"%ACT\n", "print \"URL=\", URL\n", "print dict_to_xml(payload, 'aaa')\n", "r = requests.post(URL, data=dict_to_xml(payload, 'aaa'), headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "result = xml_to_dict(r.content)[1]\n", "print \"status=\", result['status']\n", "token = result['token']\n", "inforelay = \"https://\"+result['inforelay']+\"/\"\n", "webrelay = \"https://\"+result['webrelay']+\"/\"\n", "searchserver = \"https://\"+result['searchserver']+\"/\"\n", "print inforelay, webrelay, searchserver, token" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"acquiretoken\"\n", "payload = odict([ (\"userid\", aws.userid),\n", " (\"password\", aws.password), \n", " (\"time\", time_stamp()),\n", " ])\n", "URL = gateway + \"member/%s/\"%ACT\n", "print \"URL=\", URL\n", "print dict_to_xml(payload, 'aaa')\n", "status, result = aws.xxx('aaa', URL, payload, oauth=True)\n", "print \"status=\", result['status']\n", "token = result['token']\n", "inforelay = \"https://\"+result['inforelay']+\"/\"\n", "webrelay = \"https://\"+result['webrelay']+\"/\"\n", "searchserver = \"https://\"+result['searchserver']+\"/\"\n", "print inforelay, webrelay, searchserver, token" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"getinfo\"\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid }\n", "payload = odict([ (\"userid\", userid),\n", " (\"token\", token), \n", " (\"time\", int(time.time())),\n", " ])\n", "URL = gateway + \"member/%s/\"%ACT\n", "print \"URL=\", URL\n", "data = dict_to_xml(payload, ACT)\n", "r = requests.post(URL, data=data, headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "result = xml_to_dict(r.content)[1]\n", "print \"status=\", result['status']\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = ROOT = \"getpersonalsystemfolder\"\n", "URL = inforelay + \"folder/%s/\"%ACT\n", "print \"URL=\", URL\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid }\n", "payload = odict([ (\"userid\", userid),\n", " (\"token\", token), \n", " (\"rawfoldername\", \"MySyncFolder\"),\n", " ])\n", "data = dict_to_xml(payload, ROOT)\n", "r = requests.post(URL, data=data, headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "result = xml_to_dict(r.content)[1]\n", "print \"status=\", result['status']\n", "\n", "for k,v in result.items():\n", " print \"%s:%s\"%(k,v)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "ACT = \"browsefolder\"\n", "ROOT = \"browse\"\n", "URL = inforelay + \"inforelay/%s/\"%ACT\n", "print \"URL=\", URL\n", "header = { \"Cookie\": \"sid=%s;ONE_VER=1_0; path=/\"%sid }\n", "payload = odict([ (\"userid\", userid),\n", " (\"token\", token), \n", " (\"language\", \"zh_TW\"),\n", " (\"type\", \"VIDEO\"),\n", " (\"folderid\", 86259931),\n", " (\"pageno\", 1),\n", " (\"pagesize\", 10),\n", " (\"sortby\", 1),\n", " (\"sortdirection\", 0),\n", " (\"time\", int(time.time())),\n", " ])\n", "data = dict_to_xml(payload, ROOT)\n", "r = requests.post(URL, data=data, headers=header)\n", "print \"content:\\n\", r.content\n", "print \"cookie:\\n\", r.cookies.items()\n", "print \"header\", r.headers\n", "result = xml_to_dict(r.content)[1]\n", "print \"status=\", result['status']\n", "\n", "for k,v in result.items():\n", " print \"%s:%s\"%(k,v)" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }