class Contacts::Hotmail
Constants
- COMPOSE_URL
- CONTACT_LIST_URL
- MAX_HTTP_THREADS
- NEW_CONTACT_LIST_URL
- OLD_CONTACT_LIST_URL
- PROTOCOL_ERROR
- PWDPAD
- URL
Public Instance Methods
contacts(options = {})
click to toggle source
# File lib/contacts/hotmail.rb, line 58 def contacts(options = {}) if connected? url = URI.parse(contact_list_url) data, resp, cookies, forward = get( contact_list_url, @cookies ) if resp.code_type != Net::HTTPOK raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR) end @contacts = [] build_contacts = [] go = true index = 0 while(go) do go = false url = URI.parse(get_contact_list_url(index)) http = open_http(url) resp, data = http.get(get_contact_list_url(index), "Cookie" => @cookies) email_match_text_beginning = Regexp.escape("http://m.mail.live.com/?rru=compose&to=") email_match_text_end = Regexp.escape("&") raw_html = resp.body.split("\n").grep(/(?:e|dn)lk[0-9]+/) raw_html.delete_at 0 raw_html.inject('') do |memo, row| c_info = row.match(/(e|dn)lk([0-9])+/) # Same contact, or different? build_contacts << [] if memo != c_info[2] # Grab info case c_info[1] when "e" # Email build_contacts.last[1] = row.match(/#{email_match_text_beginning}(.*)#{email_match_text_end}/)[1] when "dn" # Name build_contacts.last[0] = row.match(/<a[^>]*>(.+)<\/a>/)[1] end # Set memo to contact id c_info[2] end go = resp.body.include?("ContactList_next") index += 1 end build_contacts.each do |contact| unless contact[1].nil? # Only return contacts with email addresses contact[1] = CGI::unescape(contact[1]) contact[1] = contact[1].gsub(/&ru.*/, '').gsub(/%40/, '@') @contacts << contact end end return @contacts end end
get_contact_list_url(index)
click to toggle source
# File lib/contacts/hotmail.rb, line 117 def get_contact_list_url(index) "http://mpeople.live.com/default.aspx?pg=#{index}" end
real_connect()
click to toggle source
# File lib/contacts/hotmail.rb, line 12 def real_connect data, resp, cookies, forward = get(URL) old_url = URL until forward.nil? data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward] end postdata = "PPSX=%s&PwdPad=%s&login=%s&passwd=%s&LoginOptions=2&PPFT=%s" % [ CGI.escape(data.split("><").grep(/PPSX/).first[/=\S+$/][2..-3]), PWDPAD[0...(PWDPAD.length-@password.length)], CGI.escape(login), CGI.escape(password), CGI.escape(data.split("><").grep(/PPFT/).first[/=\S+$/][2..-3]) ] form_url = data.split("><").grep(/form/).first.split[5][8..-2] data, resp, cookies, forward = post(form_url, postdata, cookies) old_url = form_url until cookies =~ /; PPAuth=/ || forward.nil? data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward] end if data.index("The e-mail address or password is incorrect") raise AuthenticationError, "Username and password do not match" elsif data != "" raise AuthenticationError, "Required field must not be blank" elsif cookies == "" raise ConnectionError, PROTOCOL_ERROR end data, resp, cookies, forward = get("http://mail.live.com/mail", cookies) until forward.nil? data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward] end @domain = URI.parse(old_url).host @cookies = cookies rescue AuthenticationError => m if @attempt == 1 retry else raise m end end