|
@@ -21,11 +21,12 @@ |
|
|
# SOFTWARE. |
|
|
# SOFTWARE. |
|
|
|
|
|
|
|
|
from cookielib import CookieJar |
|
|
from cookielib import CookieJar |
|
|
|
|
|
from json import dumps |
|
|
from logging import getLogger, NullHandler |
|
|
from logging import getLogger, NullHandler |
|
|
from os.path import expanduser |
|
|
from os.path import expanduser |
|
|
from threading import RLock |
|
|
from threading import RLock |
|
|
from time import sleep, time |
|
|
from time import sleep, time |
|
|
from urllib import quote_plus, unquote_plus |
|
|
|
|
|
|
|
|
from urllib import unquote_plus |
|
|
from urlparse import urlparse |
|
|
from urlparse import urlparse |
|
|
|
|
|
|
|
|
import requests |
|
|
import requests |
|
@@ -211,16 +212,6 @@ class Site(object): |
|
|
return value |
|
|
return value |
|
|
return unicode(value, encoding) |
|
|
return unicode(value, encoding) |
|
|
|
|
|
|
|
|
def _urlencode_utf8(self, params): |
|
|
|
|
|
"""Implement urllib.urlencode() with support for unicode input.""" |
|
|
|
|
|
enc = lambda s: s.encode("utf8") if isinstance(s, unicode) else str(s) |
|
|
|
|
|
args = [] |
|
|
|
|
|
for key, val in params.iteritems(): |
|
|
|
|
|
key = quote_plus(enc(key)) |
|
|
|
|
|
val = quote_plus(enc(val)) |
|
|
|
|
|
args.append(key + "=" + val) |
|
|
|
|
|
return "&".join(args) |
|
|
|
|
|
|
|
|
|
|
|
def _api_query(self, params, tries=0, wait=5, ignore_maxlag=False, |
|
|
def _api_query(self, params, tries=0, wait=5, ignore_maxlag=False, |
|
|
no_assert=False, ae_retry=True): |
|
|
no_assert=False, ae_retry=True): |
|
|
"""Do an API query with *params* as a dict of parameters. |
|
|
"""Do an API query with *params* as a dict of parameters. |
|
@@ -237,16 +228,18 @@ class Site(object): |
|
|
sleep(wait_time) |
|
|
sleep(wait_time) |
|
|
self._last_query_time = time() |
|
|
self._last_query_time = time() |
|
|
|
|
|
|
|
|
url, data = self._build_api_query(params, ignore_maxlag, no_assert) |
|
|
|
|
|
|
|
|
url, params = self._build_api_query(params, ignore_maxlag, no_assert) |
|
|
if "lgpassword" in params: |
|
|
if "lgpassword" in params: |
|
|
self._logger.debug("{0} -> <hidden>".format(url)) |
|
|
self._logger.debug("{0} -> <hidden>".format(url)) |
|
|
elif len(data) > 1000: |
|
|
|
|
|
self._logger.debug("{0} -> {1}...".format(url, data[:997])) |
|
|
|
|
|
else: |
|
|
else: |
|
|
self._logger.debug("{0} -> {1}".format(url, data)) |
|
|
|
|
|
|
|
|
data = dumps(params) |
|
|
|
|
|
if len(data) > 1000: |
|
|
|
|
|
self._logger.debug("{0} -> {1}...".format(url, data[:997])) |
|
|
|
|
|
else: |
|
|
|
|
|
self._logger.debug("{0} -> {1}".format(url, data)) |
|
|
|
|
|
|
|
|
try: |
|
|
try: |
|
|
response = self._session.post(url, data=data) |
|
|
|
|
|
|
|
|
response = self._session.post(url, data=params) |
|
|
response.raise_for_status() |
|
|
response.raise_for_status() |
|
|
except requests.RequestException as exc: |
|
|
except requests.RequestException as exc: |
|
|
raise exceptions.APIError("API query failed: {0}".format(exc)) |
|
|
raise exceptions.APIError("API query failed: {0}".format(exc)) |
|
@@ -282,9 +275,7 @@ class Site(object): |
|
|
if "csrf" not in self._tokens: |
|
|
if "csrf" not in self._tokens: |
|
|
# If we don't have a CSRF token, try to fetch one: |
|
|
# If we don't have a CSRF token, try to fetch one: |
|
|
self._request_csrf_token(params) |
|
|
self._request_csrf_token(params) |
|
|
|
|
|
|
|
|
data = self._urlencode_utf8(params) |
|
|
|
|
|
return url, data |
|
|
|
|
|
|
|
|
return url, params |
|
|
|
|
|
|
|
|
def _handle_api_result(self, response, params, tries, wait, ae_retry): |
|
|
def _handle_api_result(self, response, params, tries, wait, ae_retry): |
|
|
"""Given an API query response, attempt to return useful data.""" |
|
|
"""Given an API query response, attempt to return useful data.""" |
|
|