Требуется аутентификация - проблемы с установкой сеанса AIM OSCAR с использованием Python

1

Я пишу простой 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-адрес выглядит так же, как те, которые показаны в примере потока подписей. И все же он терпит неудачу.

Любая идея, что я делаю неправильно здесь? Я неправильно хэширую эти значения? Я что-то кодирую неправильно? Выключен ли мой сеанс?

  • 0
    Вы когда-нибудь находили решение этой проблемы?
  • 0
    Нет, так и не понял Мне стало скучно, и я перешел к другим вещам.
Показать ещё 1 комментарий
Теги:
aim

2 ответа

1

Попробуйте использовать Twisted OSCAR support вместо того, чтобы писать свой собственный? Он не видел много обслуживания, но я считаю, что он работает.

0

URI Кодировать ваш дайджест?

-moxford

  • 0
    Попробовал это, и это не сработало. Плюс примеры в документах явно показывают, что вам не нужно кодировать URI. Хорошая попытка, хотя Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню