Я пишу простой python script, который будет взаимодействовать с серверами AIM, используя протокол OSCAR. Он включает несколько сложных протоколов квитирования. Вам, по сути, нужно отправить запрос GET на определенный URL-адрес, получить XML или JSON-кодированный ответ, извлечь специальный токен сеанса и секретный ключ, а затем сгенерировать ответ с помощью токена и ключа.
Я попытался выполнить эти шаги в тройник, но процесс завершился неудачно в последнем. Вот мой код:
class simpleOSCAR:
def __init__(self, username, password):
self.username = username
self.password = password
self.open_aim_key = 'whatever'
self.client_name = 'blah blah blah'
self.client_version = 'yadda yadda yadda'
def authenticate(self):
# STEP 1
url = 'https://api.screenname.aol.com/auth/clientLogin?f=json'
data = urllib.urlencode( [
('k', self.open_aim_key),
('s', self.username),
('pwd', self.password),
('clientVersion', self.client_version),
('clientName', self.client_name)]
)
response = urllib2.urlopen(url, data)
json_response = simplejson.loads(urllib.unquote(response.read()))
session_secret = json_response['response']['data']['sessionSecret']
host_time = json_response['response']['data']['hostTime']
self.token = json_response['response']['data']['token']['a']
# STEP 2
self.session_key = base64.b64encode(hmac.new(self.password, session_secret, sha256).digest())
#STEP 3
uri = "http://api.oscar.aol.com/aim/startOSCARSession?"
data = urllib.urlencode([
('a', self.token),
('clientName', self.client_name),
('clientVersion', self.client_version),
('f', 'json'),
('k', self.open_aim_key),
('ts', host_time),
]
)
urldata = uri+data
hashdata = "GET&" + urllib.quote("http://api.oscar.aol.com/aim/startOSCARSession?") + data
digest = base64.b64encode(hmac.new(self.session_key, hashdata, sha256).digest())
urldata = urldata + "&sig_sha256=" + digest
print urldata + "\n"
response = urllib2.urlopen(urldata)
json_response = urllib.unquote(response.read())
print json_response
if __name__ == '__main__':
so = simpleOSCAR("aimscreenname", "somepassword")
so.authenticate()
Я получаю следующий ответ от сервера:
{ "response" : {
"statusCode":401,
"statusText":"Authentication Required. statusDetailCode 1014",
"statusDetailCode":1014,
"data":{
"ts":1235878395
}
}
}
Я попытался устранить его по-разному, но созданный мной URL-адрес выглядит так же, как те, которые показаны в примере потока подписей. И все же он терпит неудачу.
Любая идея, что я делаю неправильно здесь? Я неправильно хэширую эти значения? Я что-то кодирую неправильно? Выключен ли мой сеанс?
Попробуйте использовать Twisted OSCAR support вместо того, чтобы писать свой собственный? Он не видел много обслуживания, но я считаю, что он работает.
URI Кодировать ваш дайджест?
-moxford