class Contacts class Hotmail < Base URL = "http://login.live.com/login.srf?id=2" OLD_CONTACT_LIST_URL = "http://%s/cgi-bin/addresses" NEW_CONTACT_LIST_URL = "http://%s/mail/GetContacts.aspx" NEWEST_CONTACT_LIST_URL = "http://%s/mail/options.aspx?subsection=26" COMPOSE_URL = "http://%s/cgi-bin/compose?" PROTOCOL_ERROR = "Hotmail has changed its protocols, please upgrade this library first. If that does not work, report this error at http://rubyforge.org/forum/?group_id=2693" PWDPAD = "IfYouAreReadingThisYouHaveTooMuchFreeTime" MAX_HTTP_THREADS = 8 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) 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 old_url = form_url until forward.nil? data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward] end =begin if data =~ %r{action="(.*?)"} forward = $1 puts forward napexp = CGI.escape(data.to_s[/id="NAPExp" value="(.*?)"/][19...-1]) nap = CGI.escape(data.to_s[/id="NAP" value="(.*?)"/][16...-1]) anon = CGI.escape(data.to_s[/id="ANON" value="(.*?)"/][17...-1]) anonexp = CGI.escape(data.to_s[/id="ANONExp" value="(.*?)"/][20...-1]) t = CGI.escape(data.to_s[/id="t" value="(.*?)"/][14...-1]) postdata = "NAPExp=%s&NAP=%s&ANON=%s&ANONExp=%s&t=%s" % [ napexp, nap, anon, anonexp, t ] puts postdata data, resp, cookies, forward, old_url = post(forward, postdata, cookies, old_url) + [forward] end until forward.nil? data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward] end =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 # click on 'Contiune' if presented with the Hotmail Listened page # look for the Submit button with a "TakeMeToInbox" name (this should work for other languages) if (not old_url.grep(/MessageAtLogin.aspx/).first.nil?) viewState = data.split(/>\s*?\s*?\s*? m if @attempt == 1 retry else raise m end end def contacts(options = {}) return @contacts if @contacts 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 # we have to click on the Export Contacts button to get the csv: # Search the content for __VIEWSTATE or __EVENTVALIDATION viewState = data.split(/>\s*?\s*?\s*? "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0", "Accept-Encoding" => "gzip", "Cookie" => cookies, "Referer" => contact_list_url, "Content-Type" => 'application/x-www-form-urlencoded' ) data = uncompress(resp, data) parse(data, options) end end private def contact_list_url NEWEST_CONTACT_LIST_URL % @domain end def follow_email(data, id, contacts_slot) compose_url = COMPOSE_URL % @domain postdata = "HrsTest=&to=#{id}&mailto=1&ref=addresses" postdata += "&curmbox=00000000-0000-0000-0000-000000000001" a = data.split(/>\s*\s*