вівторок, 21 липня 2009 р.

Mechanize + Cookie + вКонтакте. Частина 6



Куки(від англ. Cookie - печиво) - фрагмент даних, який створюється веб-сервером і зберігається на комп'ютері користувача у вигляді файлу, який веб-клієнт(зазвичай веб-браузер) кожен раз пересилає веб-серверу у HTTP-запиті при спробі відкрити сторінку відповідного сайту. Застосовується для збереження даних на стороні користувача, на практиці зазвичай використовується для:

  • автентифікації користувача;

  • зберігання персональних даних і налаштувань користувача;

  • відслідковування стану сесії доступу користувача;

  • ведення статистики про користувачів.



Бібліотека WWW::Mechanize надає зручний інтерфей для роботи з куками - WWW::Mechanize::CookieJar. Цей клас використовується для керування куками, які були повернуті з якого-небудь конкретного сайту. Крім того дозволяє зберігати куки до файлу, з можливістю використовувати його пізніше(наприклад, для автентифікації користувача на сайті без необхідності вводу логіна і пароля). Доступні наступні формати для зберігання/завантаження куки: :yaml <- YAML структура і :cookiestxt <- Mozilla у форматі cookies.txt.


Повернемося до попередньої статті і додамо можливість авторизації за допомогою пересилання куки вебсерверу.
Авторизація здійснюється через надсилання куки 'remixpassword'. Значення 'remixpassword', встановлюється в результаті успішної авторизації, і може бути використане для продовження ідентифікатора сесії('sid').
Цей метод можна використати і у UserAPI при запиті до http://login.userapi.com/auth?login=auto&site=2.

Тут я не буду приводити повний лістинг. А лише доповню код з попередньої статті.
Для початку потрібно авторизуватися на сайті ВКонтакте і записати куки у файл на диску. Для цього створимо новий метод save_cookie().
def save_cookie(cookie_file)
@a.cookie_jar.save_as(cookie_file, format = :cookiestxt)
end

Якщо авторизація пройшла успішно, записуємо куки у файл cookie.txt

if login_force(id, email, pass)
puts "Successfully Authentication"
save_cookie('cookie.txt')
else
puts "Authentication Error"
end


Далі ми будемо авторизовуватись за допомогою цією куки. Створимо метод login_auto()

def login_auto(uid, cookie_file)
@a.cookie_jar.load(cookie_file, format = :cookiestxt)
login_page = @a.get('http://vkontakte.ru/')
return /http:\/\/vkontakte\.ru\/id(\d+)/ === login_page.uri.to_s ? ($1 == uid ? true : false) : false
end


Надалі у нас нема необхідності використовувати метод login_force(). Замість нього використовуємо login_auto()

if login_auto(id, 'cookie.txt')
puts "Successfully Authentication"
else
puts "Authentication Error"
end


Якщо комусь цікаво про плюси авторизації за допомогою куки(в т.ч. і на сайті ВКонтакте), залишайте коментарі.

3 коментарі:

burgua сказав...
Автор видалив цей коментар.
burgua сказав...

http://cs24.vkontakte.ru/u1178818/2263166/x_8623abc78c.jpg

Еще в тему картинка

Serg сказав...

У меня почему-то возникли проблемы с установкой кук. Не устанавливаются для разных доменов.