Дружим API.SAPE.RU и Python xmlrpclib
По спецификации xml-rpc интерфейса sape.ru, при авторизации нужно сохранять cookie, а затем передавать их при всех последующих обращениях к api. Но проблема в том что питоновская xmlrpclib не имеет готовых механизмов для работы с куками. Поэтому следует унаследоваться от класса xmlrpc.Transport и немного подправить его.
import xmlrpclib
class CookieTransport(xmlrpclib.Transport):
def __init__(self, SESSION_ID_STRING='SAPE'):
xmlrpclib.Transport.__init__(self)
self.mycookies=None
self.mysessid=None
self.SESSION_ID_STRING = SESSION_ID_STRING
def parseCookies(self,s):
if s is None: return {self.SESSION_ID_STRING:None}
ret = {}
tmp = s.split(';')
for t in tmp:
coppia = t.split('=')
k = coppia[0].strip()
v = coppia[1].strip()
ret[k]=v
return ret
def request(self, host, handler, request_body, verbose=0):
h = self.make_connection(host)
if verbose:
h.set_debuglevel(1)
self.send_request(h, handler, request_body)
self.send_host(h, host)
if not self.mysessid is None:
h.putheader("Cookie", "%s=%s" % (self.SESSION_ID_STRING,self.mysessid) )
self.send_user_agent(h)
self.send_content(h, request_body)
errcode, errmsg, headers = h.getreply()
if self.mysessid is None:
self.mycookies = self.parseCookies( headers.getheader('set-cookie') )
if self.mycookies.has_key(self.SESSION_ID_STRING):
self.mysessid = self.mycookies[self.SESSION_ID_STRING]
if errcode != 200:
raise xmlrpclib.ProtocolError(
host + handler,
errcode, errmsg,
headers
)
self.verbose = verbose
try:
sock = h._conn.sock
except AttributeError:
sock = None
return self._parse_response(h.getfile(), sock)
Теперь все готово и можно обращаться к api:
server = xmlrpclib.ServerProxy('http://api.sape.ru/xmlrpc/v2/', transport=CookieTransport())
print server.sape.login('username', 'password')
print server.sape.get_user()['balance']
Надеюсь, что этот пример сохранит немного вашего времени
Categories: Разное
привет. У меня python2.7 и возникает ошибка:
File «C:/Python27/test_script/xmlrpc_test.py», line 30, in request
errcode, errmsg, headers = h.getreply()
AttributeError: HTTPConnection instance has no attribute ‘getreply’
Ничего дельного не нагуглилось по этому вопросу. Нашел только что вроде как встречается такой баг, но как его исправить — не понятно.
ты не в курсе?
@s
В 2.7 изменились библиотеки, вот рабочий пример