воскресенье, 27 февраля 2011 г.

Авторизация ВКонтакте через API на Python

В настоящее время ВКонтакте - ресурс, который не нуждается в представлении. Это вторая по величине соц.сеть в мире. ВКонтакте предоставляет нам возможность создавать desktop-приложения, которые могут иметь доступ к данным пользователей. Судя по сообщениям на различных форумах, чуть ли не каждый третий, а то и второй программист задавался целью создать приложение для соц.сети с использованием ее API.

Вот способ авторизации, который предлагают разработчики ВКонтакте: Документация

Предлагаемый ими способ хорош, однако реализовать его в Python проблематично, поскольку в Python нет компонента Webbrowser, который необходим для обработки javascript'ов на странице авторизации. В связи с этим я предлагаю свой способ авторизации, который требует лишь наличия библиотеки urllib.


#-----------------------------------------------------------
#Copyright Igor http://py-coding-secrets.blogspot.com   2011
#-----------------------------------------------------------
def login_vkontakte(login,passw,app_id,app_hash):
    import urllib
    resp = urllib.urlopen("http://login.vk.com/?act=login&app="+
                          app_id+"&app_hash="+app_hash+
                          "&vk=1&captcha_sid=&al_test=14&captcha_key=&email="+
                          login+"&pass="+passw+"&expire=0&permanent=1")
    page = resp.read()
    pos = page.find("name='s'")
    s = page[pos+16:pos+76]
    pos = page.find('name="app_hash"')
    app_hash_two = page[pos+23:pos+41]
    resp = urllib.urlopen("http://vk.com/login.php?s="+
                          s+"&act=auth_result&m=4&permanent=1&expire=&app="+
                          app_id+"&app_hash="+app_hash_two)
    page = resp.read()
    pos1 = page.find("(")+1
    pos2 = page.find(")")
    params = eval(page[pos1:pos2])
    return params


Функция login_vkontakte принимает четыре параметра:
  1.  login - ваш email
  2.  passw - пароль
  3.  app_id - id вашего приложения
  4.  app_hash - хэш, который генерирует Вконтакте при запросе страницы авторизации (см.Документация; для приложения, которое запрашивает определенные права доступа, хэш постоянен)
Возвращает функция словарь (тип dict) со значениями, которые необходимы для дальнейшей работы.

Пример использования:

data = login_vkontakte("igor@email.com","password","2169003","8de61ebd53afbed646")
print data['user_full_name']

В настоящий момент ВКонтакте возвращает следующие параметры:
['user_first_name', 'secret', 'expire', 'user_thumb', 
'sid', 'auth_hash', 'settings_hash', 'settings', 'mid', 'user_full_name']

Ну и напоследок об ограничениях:

Первое. Мой код реализует лишь базовый функционал авторизации. Код может не работать, если страница не привязана к телефону, так как в этом случае требуется ввод капчи, а работу с капчей в этом коде я не реализовал. Когда-нибудь, если потребуется, прикручу и капчу :)

Второе. Рано или поздно разработчики ВКонтакте изменят javascript авторизации и мой код тоже придется менять.

Пожалуй и все)
PS Если что-то непонятно, пишите, буду рад вашим вопросам в комментариях.

Ярлыки: , ,

Комментарии: 3:

В 2 марта 2011 г. в 22:04 , Blogger Игорь сказал(а)...

Примечание: код работает под windows, версия под symbian на отладке.

 
В 9 июня 2011 г. в 22:50 , Anonymous Анонимный сказал(а)...

Выдаёт ошибку:

Traceback (most recent call last):
File "./main.py", line 85, in
letsdothis = main()
File "./main.py", line 43, in main
print data['user_full_name']
TypeError: string indices must be integers, not str

 
В 17 января 2012 г. в 22:48 , Blogger Игорь сказал(а)...

К сожалению, Вконтакте слишком часто модифицирует систему авторизации. В моем случае нет необходимости следить за работоспособностью этого кода.

Есть один верный вариант. Для symbian появилось официальное приложение http://store.ovi.com/content/123537 Там нет капчи, и видимо, используется не документированный протокол авторизации Вконтакте. Если "проснифферить" трафик этого приложения можно узнать как реализован этот протокол и повторить его на питоне.

 

Отправить комментарий

Подпишитесь на каналы Комментарии к сообщению [Atom]

<< Главная страница