понеділок, 11 травня 2009 р.

Curb (Ruby + cURL) + вКонтакте. Частина 4



Сьогодні продовжимо копатися у тенетах...
На операційному столі і досі лежить пацієнт вКонтакте. Хтось запевняє, що він живіший за всіх живих Операцією керує доктор Ruby. Ця людина не потребує представлення. І сьогодні його асистентом є відомий у вузьких колах майстер ножа і скальпеля, хірург - cURL. Прошу любіть і жаловать! :) Бурні овації в залі.

cURL - це програма командного рядка для передачі файлів з синтаксом URL, яка підтримує FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, Файли: URL і LDAP. cURL підтримує сертифікати HTTPS, методи HTTP POST, HTTP PUT, завантаження на FTP, Kerberos, завантаження через форми HTTP, проксі, файли cookie, перевірку автентичності «ім'я користувача + пароль» (базову, дайджест, NTLM і Negotiate для HTTP, а також kerberos4 для FTP), поновлення передачі файлів, тунелювання через проксі HTTP та багато інших функцій. cURL - це вільне програмне забезпечення, що розповсюджується під ліцензією MIT.

Головна мета використання cURL полягає в тому, щоб автоматизувати передачу файлів або послідовність таких операцій. Наприклад, це хороший засіб для моделювання дій користувача у веб-оглядачі.

Libcurl - це API інтерфейс, який можна включити в свої програми; cURL діє як автономна обгортка для бібліотеки libcurl. libcurl використовується, щоб забезпечити можливість передачі URL численним додаткам (як відкритим, так і комерційних). Для libcurl є більше 30 різних прив'язок до мов програмування. В тому числі і для Ruby: Curb та curl-multi.

Сьогодні розглянемо роботу з libcurl на Ruby 1.8, за допомогою Curb. З сторінки проекту "Curb is a work-in-progress, and currently only supports libcurl‘s ‘easy’ mode". Вже по традиції, на прикладі сайту вКонтакте.
Але для початку потрібно встановити необхідні бібліотеки.
$ sudo apt-get install libcurl4-gnutls-dev
$ sudo gem1.8 install curb


Сьогодні наша задача полягатиме у написанні простого парсера на Рубі, який перевіряє нову інформацію з особистої сторінки вКонтакте: кількість повідомлень, запрошень у групи, нових фотографіях і відео, на яких вас відзначили, коментарі в замітках, запрошень на зустрічі, відповідей на пропозиції та питання, анонімних думок. Для того щоб скрипт працював у вас, достатньо змінити рядок
body = getdata(mid = '********', email = 'user@example.com', pass = '*********')

де mid - ваш числовий ID наприклад 12227146 (http://vkontakte.ru/id12227146), email - ваш логін, і pass - ваш пароль.
Наразі скрипт праює тільки з версією Ruby 1.8. Скомпілювати Curb для 1.9 мені не вдалось.

# -*- coding: utf-8 -*-

# ruby1.8
require 'rubygems'
require 'curb'
require 'md5'
require 'iconv'

def trymatch(str, regex)
if str.match(regex) == nil
return '0'
end
str.match(regex)[2]
end

def filter(data, label, tool)
# <li id='myfriends'><a href='/friend.php?24072'>My Friends</a></li>
# <li><a href='/mail.php?id=32576819&24072'>My Messages (<b>1</b>)</a></li>
regex = /<a href=\'\/#{tool}.php?([\w\d\s\?\'&=>]*)\'>[\w\s]*\(<b>(\d+)<\/b>\)<\/a>/m
rez = trymatch(data, regex)
label + ": " + rez
end

def getdata(mid, email, pass)
user = {'mid' => mid, 'email' => email, 'pass' => MD5.md5(pass)}
curl = Curl::Easy.new("http://vkontakte.ru/id#{mid}")
curl.headers = {"User-Agent" => "Opera/10.00 (X11; Linux i686; U; uk) Presto/2.2.1",
"Cookie" => "remixlang=3; remixchk=5; remixmid=#{user['mid']}; remixemail=#{user['email']}; remixpass=#{user['pass']}; remixautobookmark=8",
"Referer" => "http://vkontakte.ru/"}
curl.follow_location = true
curl.perform
#return '0'
body = curl.unescape curl.body_str
coder = Iconv.new("UTF-8","WINDOWS-1251")
body = coder.iconv(body)
return body
end

body = getdata(mid = '********', email = 'user@example.com', pass = '*********')

puts filter(body,'Friends','friend')
puts filter(body,'Photos','photos')
puts filter(body,'Videos','video')
puts filter(body,'Messages','mail')
puts filter(body,'Notes','notes')
puts filter(body,'Groups','groups')
puts filter(body,'Events','events')
puts filter(body,'Matches','matches')
puts filter(body,'Opinions','opinions')
puts filter(body,'Questions','questions')
puts filter(body,'Opinions','opinions')


Список посилань:

2 коментарі:

burgua сказав...

Давно не видел свой код.
Я думал этот бред никто не будет смотреть )

nextme сказав...

я посмотрел )))
концептуально это не руби )