середу, 14 жовтня 2009 р.

vk.com. Частина 7

У цьому дописі мова знову піде про ВКонтакте і WWW::Mechanize. Хоч він і йде під номером сім, він не є продовженням попередніх частинами, хоча для повного розуміння про далі буде йти мова, бажано ознайомитися з ними. З них ви можете дізнатися, як робити наступні речі ВКонтакте:

  • Отримання новин профілю (кількості нових повідомлень, фотографій, відео, друзів, груп).

  • Отримання списку друзів

  • Отримання приватних повідомлень

  • Написання приватних повідомлень



Я вже писав про те, що домен VK.COM перейшов під контроль соціальної мережі ВКонтакте. Майже з тих самих пір авторизація користувачів на сайті vkontakte.ru відбувається через редірект login.vk.com. Це викликає незручність при авторизації за допомогою WWW::Mechanize.

require 'mechanize'
require 'json'

class Vkontakte
def initialize
@ua = WWW::Mechanize.new{|agent|
agent.user_agent_alias = 'Linux Mozilla'
agent.follow_meta_refresh = true
}
end

# Authorisation by submitting email and password (Login)
#
def login_force(uid, email, pass)
url = "http://login.vk.com/?act=login"
page = @ua.post(url, {'email' => email, 'pass' => pass, 'expire' => '1', 'vk' => 1})
s = page.body.match(/'s' value='(.+?)'/)[1]
@ua.post('http://vkontakte.ru/login.php?op=slogin&redirect=1', {'s' => s})
user_page = @ua.get('http://vkontakte.ru/profile.php')
end

end

if __FILE__ == $0
id = "xxxxxxxx"
email = "user@example.com"
pass = "your_password"

vkontakte_agent = Vkontakte.new
vkontakte_agent.login_force(id, email, pass)

end


Далі можна продовжувати роботу з ВКонтакте як звичайно.



Давайте напишемо скрипт, який буде авторизуватись і працювати з vk.com:

require 'mechanize'
require 'json'

class Vkontakte
def initialize
@ua = WWW::Mechanize.new{|agent|
agent.user_agent_alias = 'Linux Mozilla'
agent.follow_meta_refresh = true
}
end

# Authorisation by submitting email and password (Login)
#
def login_force(uid, email, pass)
url = "http://vk.com"
login_page = @ua.get(url)
login_form = login_page.form_with(:name => 'login')
login_form.email = email
login_form.pass = pass
user_page = login_form.submit # У разі успішної авторизації відбувається перехід на http://login.vk.com.
if user_page.uri.to_s == 'http://login.vk.com/?act=login'
user_page =user_page.forms.first.submit
return true
else
return false
end
end

end

if __FILE__ == $0
id = "xxxxxxxx"
email = "user@example.com"
pass = "your_password"

vkontakte_agent = Vkontakte.new
vkontakte_agent.login_force(id, email, pass)

end


Як ви бачите, авторизація на сайті vk.com відбувається більш прозоро і зрозуміло.
Якщо порівняти сайти vkontakte.ru і vk.com, можна помітити, що крім відмінностей у назві домену вони практично ідентичні.
Для прикладу продемонструю метод для зміни статусу ВКонтакте:

class Vkontakte
# Set status message for current user
#
def set_status(message)
url = 'http://vk.com/profile.php'
page = @ua.get(url)
hash = page.body.match(/id='activityhash' value='(.+?)'/)[1]
query = {"activityhash" => hash, "setactivity" => message}
sleep(1) # http://vk.com/blank.php - Ви намагались завантажити бiльше однiєї однотипної сторiнки за секунду. Повернiться назад i спробуйте ще раз.
page = @ua.post(url, query)
end
end


Ддя того щою цей метод працював з сайтом vkontakte.ru достатньо у змінній url змінити vk.com на vkontakte.ru.

2 коментарі:

burgua сказав...

Почитал. Пиши еще!

118326 сказав...

привiт, гарно написано! а можеш навести приклад авторизацii тiльки з використанням бiблiотеки WATIR =) буду дуже вдячний.