class Contacts::AolImporter

Constants

AOL_NUM
CONTACT_LIST_CSV_URL
CONTACT_LIST_URL
LOGIN_REFERER_PATH
LOGIN_REFERER_URL
LOGIN_URL
PROTOCOL_ERROR
URL

Public Instance Methods

contacts() click to toggle source
# File lib/contacts/aol_importer.rb, line 16
def contacts
  postdata = {
    "file" => 'contacts',
    "fileType" => 'csv'
  }

  return @contacts if @contacts
  if connected?
    data, resp, cookies, forward, old_url = get(CONTACT_LIST_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]

    until forward.nil?
      data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
    end

    if resp.code_type != Net::HTTPOK
      raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
    end

    # parse data and grab <input name="user" value="8QzMPIAKs2" type="hidden">
    doc = Hpricot(data)
    (doc/:input).each do |input|
      postdata["user"] = input.attributes["value"] if input.attributes["name"] == "user"
    end

    data, resp, cookies, forward, old_url = get(CONTACT_LIST_CSV_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]

    until forward.nil?
      data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
    end

    if data.include?("error.gif")
      raise AuthenticationError, "Account invalid"
    end

    parse data
  end
end
h_to_query_string(hash) click to toggle source
# File lib/contacts/aol_importer.rb, line 143
def h_to_query_string(hash)
  u = ERB::Util.method(:u)
  hash.map{ |k, v| u.call(k) + "=" + u.call(v) }.join("&")
end
parse(data, options={}) click to toggle source
# File lib/contacts/aol_importer.rb, line 135
def parse(data, options={})
  data = CSV.parse(data)
  col_names = data.shift
  @contacts = data.map do |person|
    ["#{person[0]} #{person[1]}", person[4]] if person[4] && !person[4].empty?
  end.compact
end
real_connect() click to toggle source
# File lib/contacts/aol_importer.rb, line 55
def real_connect

  postdata = {
    "loginId" => login,
    "password" => password,
    "rememberMe" => "on",
    "_sns_fg_color_" => "",
    "_sns_err_color_" => "",
    "_sns_link_color_" => "",
    "_sns_width_" => "",
    "_sns_height_" => "",
    "offerId" => "mail-second-en-us",
    "_sns_bg_color_" => "",
    "sitedomain" => "sns.webmail.aol.com",
    "regPromoCode" => "",
    "mcState" => "initialized",
    "uitype" => "std",
    "siteId" => "",
    "lang" => "en",
    "locale" => "us",
    "authLev" => "0",
    "siteState" => "",
    "isSiteStateEncoded" => "false",
    "use_aam" => "0",
    "seamless" => "novl",
    "aolsubmit" => CGI.escape("Sign In"),
    "idType" => "SN",
    "usrd" => "",
    "doSSL" => "",
    "redirType" => "",
    "xchk" => "false"
  }

  # Get this cookie and stick it in the form to confirm to Aol that your cookies work
  data, resp, cookies, forward = get(URL)
  postdata["stips"] = cookie_hash_from_string(cookies)["stips"]
  postdata["tst"] = cookie_hash_from_string(cookies)["tst"]

  data, resp, cookies, forward, old_url = get(LOGIN_REFERER_URL, cookies) + [URL]
  until forward.nil?
    data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  end

  data, resp, cookies, forward, old_url = get("#{LOGIN_URL}?#{LOGIN_REFERER_PATH}", cookies) + [LOGIN_REFERER_URL]
  until forward.nil?
    data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  end

  doc = Hpricot(data)
  (doc/:input).each do |input|
    postdata["usrd"] = input.attributes["value"] if input.attributes["name"] == "usrd"
  end
  # parse data for <input name="usrd" value="2726212" type="hidden"> and add it to the postdata

  postdata["SNS_SC"] = cookie_hash_from_string(cookies)["SNS_SC"]
  postdata["SNS_LDC"] = cookie_hash_from_string(cookies)["SNS_LDC"]
  postdata["LTState"] = cookie_hash_from_string(cookies)["LTState"]
  # raise data.inspect

  data, resp, cookies, forward, old_url = post(LOGIN_URL, h_to_query_string(postdata), cookies, LOGIN_REFERER_URL) + [LOGIN_REFERER_URL]

  until forward.nil?
    data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  end
  if data.index("Invalid Password, Username or Email")
    raise AuthenticationError, "Username and password do not match"
  elsif data.index("Required field must not be blank")
    raise AuthenticationError, "Login and password must not be blank"
  elsif data.index("errormsg_0_logincaptcha")
    raise AuthenticationError, "Captcha error"
  elsif data.index("Invalid request")
    raise ConnectionError, PROTOCOL_ERROR
  elsif cookies == ""
    raise ConnectionError, PROTOCOL_ERROR
  end

  @cookies = cookies
end