Главная > Разное > Дружим API.SAPE.RU и Python xmlrpclib

Дружим 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']

 

Код для Python 2.7

 

Надеюсь, что этот пример сохранит немного вашего времени :)

Categories: Разное Tags:
  1. s
    25 Июнь 2012 в 19:23 | #1

    привет. У меня 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’

    Ничего дельного не нагуглилось по этому вопросу. Нашел только что вроде как встречается такой баг, но как его исправить — не понятно.

    ты не в курсе?

  2. admin
    26 Июнь 2012 в 16:09 | #2

    @s
    В 2.7 изменились библиотеки, вот рабочий пример

  1. Пока что нет уведомлений.