Skip to content

Instantly share code, notes, and snippets.

@Eunoia
Created October 5, 2013 21:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Eunoia/6846016 to your computer and use it in GitHub Desktop.
Save Eunoia/6846016 to your computer and use it in GitHub Desktop.
Just a little class to programmatically look up unclaimed property for californians.
require 'nokogiri'
require 'open-uri'
require 'pry'
require 'net/http'
require 'net/https'
class UnclaimedProperty
attr_accessor :lname, :fname, :middle, :city
attr_reader :results, :more_results_than_shown
def initialize(options)
@lname = options.delete :lname;
@fname = options.delete :fname;
@middle = options.delete :middle;
@city = options.delete :city;
@form_data = {}
@url = "https://scoweb.sco.ca.gov/UCP/Default.aspx"
@search_results_html = ""
@cookie = "";
@results = [];
@more_results_than_shown = false;
end
def getAntiCSRFTokens
url = "https://scoweb.sco.ca.gov/UCP/Default.aspx"
data = Nokogiri::HTML(open(url))
@form_data[:__VIEWSTATE] = data.at_css("#__VIEWSTATE").attr(:value)
@form_data[:__EVENTVALIDATION] = data.at_css("#__EVENTVALIDATION").attr(:value)
@form_data['__EVENTTARGET'] = ""
@form_data['__EVENTARGUMENT'] = ""
end
def getSeachResults
uri = URI.parse(@url)
https = Net::HTTP.new(uri.host,uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
@form_data['ctl00$ContentPlaceHolder1$txtFirstName'] = @fname
@form_data['ctl00$ContentPlaceHolder1$txtLastName'] = @lname
@form_data['ctl00$ContentPlaceHolder1$txtMiddleInitial'] = @middle
@form_data['ctl00$ContentPlaceHolder1$txtIndividualCity'] = @city
@form_data['ctl00$ContentPlaceHolder1$btnSearch'] = "Search"
request.set_form_data(@form_data)
@search_results_html = https.request(request)
#the results are hidden behind a redirect.
results_url = @search_results_html.response['location']
# binding.pry
results_url.gsub!(/(pagesize=)\d+/i,'\11000')
@cookie = @search_results_html.get_fields( 'Set-Cookie' )[0][/[^;]+/]
@search_results_html = Nokogiri::HTML(open(results_url,"Cookie" => @cookie))
self.doLoop()
end
def doLoop
@more_results_than_shown = !@search_results_html.css("#ctl00_ContentPlaceHolder1_pnlResultInfo").nil?
rows = @search_results_html.css("#ctl00_ContentPlaceHolder1_gvResults .gridViewRow")
rows.each_with_index do |row,index|
cells = row.css("td")
type = cells[4].css("img").attribute("src").content=="images/pIcon.gif" ? ":)" : ":|"
result = {}
result[:canBeRecovered] = cells[4].css("img").attribute("src").content=="images/pIcon.gif"
result[:name] = cells[0].content
result[:address] = cells[1].content
result[:line2] = cells[2].content.gsub(/\s+/," ")
result[:idNumber] = cells[3].content
result[:recNumber] = cells[3].at_css("a").attr(:href)[/\d+$/]
@results << result.merge(getPropertyDetails(cells[3].at_css("a").attr(:href)))
end
end
def getPropertyDetails(url)
result = {}
details_connection = open(url, "Cookie"=>@cookie)
if details_connection.meta['set-cookie']
@cookie = details_connection.meta['set-cookie'][/[^;]*/]
end
data = Nokogiri::HTML(details_connection.read)
result[:type] = data.at_css("#PropertyTypeData").content.strip
result[:value] = nil
result[:holder] = data.at_css("#HolderNameData")
result[:reporter] = data.at_css("#ReportedByData")
result[:holder] = result[:holder].content.strip if result[:holder]!=nil
result[:reporter] = result[:reporter].content.strip if result[:reporter]!=nil
type = data.at_css("#PropertyTypeData").content.strip
value = data.at_css("#ctl00_ContentPlaceHolder1_CashReportData")
if value
result[:value] = value.content.strip
end
return result
end
end
unclaimed = UnclaimedProperty.new(fname:"John",lname:"Smith")
unclaimed.getAntiCSRFTokens()
unclaimed.getSeachResults()
puts "Found #{unclaimed.results.length}#{unclaimed.more_results_than_shown ? "+":""} records for #{unclaimed.fname} #{unclaimed.lname}"
unclaimed.fname = "Jane"
unclaimed.getSeachResults()
puts "Found #{unclaimed.results.length}#{unclaimed.more_results_than_shown ? "+":""} records for #{unclaimed.fname} #{unclaimed.lname}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment