egduphsphonebookadapt 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/egduphsphonebookadapt.rb +162 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NDRhYWNiM2ZlMGNlMTliYTg1ZDY4OWM0NDUyMDUwNzhmYmIxZGZjNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzBkMTZhZWY5ZTNmYzQyZjY2M2Y0NWMzNmI3MDAzNWUyODk5ZWEwNw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZGYzZjJmNjUwNTQ1NzlmZWYwZTViMjk2NWY3OGRiZmQyNTdiYTMwNDc3OWFl
|
10
|
+
YWY1YTY1MGRiZjUzMDdiYzU3NGU3ZjZkMjg0NWE4MGQzMzJmZDgyNTI4MWJj
|
11
|
+
OGQ1NzNhNGU5ODZkOThjOTZjYzY0MDZjNjA1ZWU5MjY4Y2YzZmM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZjE1NTkxOGI0ZDI0M2YzYjk0YjcyNDBiMTFlYWY3ZTBiYWE2NmNkNjhkY2M4
|
14
|
+
YTA3NmI4MzE3MTJjODJkMDExZjc5MWEwMzMyMDE5MTUyNTc0ZGFkMDM3MTVm
|
15
|
+
Y2NlNGE2MTQ5ZGMxZTJkMmE1ZWE1YzhhNmVhZWU4NWRiZDI4ZDU=
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'json'
|
2
|
+
require "date"
|
3
|
+
#require 'mechanize'
|
4
|
+
require 'yaml'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
class Phonebook
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@agent = new_agent
|
11
|
+
end
|
12
|
+
|
13
|
+
def onVPN?
|
14
|
+
@VPN
|
15
|
+
end
|
16
|
+
|
17
|
+
def search_results(name_hash, options = nil)
|
18
|
+
page = search_result_page(name_hash)
|
19
|
+
results = create_hash_from_page(page)
|
20
|
+
results = results.flatten.to_json if options != nil && options[:format] =~ /json/i
|
21
|
+
results
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.search_results(name_hash, options = nil)
|
25
|
+
p = Phonebook.new
|
26
|
+
results = p.search_results(name_hash, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_entire_phonebook()
|
30
|
+
first_page = search_result_page(:first => '', :last => '')
|
31
|
+
results = []
|
32
|
+
current_page = first_page
|
33
|
+
#while (current_page.forms.first.buttons[-3].name == 'ctl00$CPHBody$GridView1$ctl14$ImgBtnNextPage') do
|
34
|
+
10.times do
|
35
|
+
results = results + create_hash_from_page(current_page)
|
36
|
+
next_page_button = current_page.forms.first.buttons[-3]
|
37
|
+
current_page = current_page.forms.first.submit(next_page_button)
|
38
|
+
end
|
39
|
+
results
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
EMAIL_REGEX = /[\w+\-.]+@[a-z\d\-.]+\.[a-z]+/i
|
44
|
+
def new_agent
|
45
|
+
begin
|
46
|
+
agent = Mechanize.new
|
47
|
+
agent.get('http://uphsxnet.uphs.upenn.edu/pb/main/search.aspx')
|
48
|
+
@VPN = true
|
49
|
+
rescue Mechanize::ResponseCodeError
|
50
|
+
@VPN = false
|
51
|
+
raise 'You Are Not On The Intranet'
|
52
|
+
end
|
53
|
+
agent
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_hash_from_page(page, options = nil)
|
57
|
+
array_of_raw_text_hashes = pull_result_text_strings(page)
|
58
|
+
result = []
|
59
|
+
array_of_raw_text_hashes.each do |person|
|
60
|
+
result << parse_person_hash(person)
|
61
|
+
end
|
62
|
+
result
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_source_code_from_page(page)
|
66
|
+
if page.class.to_s == 'String'
|
67
|
+
page[400...page.length]
|
68
|
+
else
|
69
|
+
page.body[400...page.body.length]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def pull_result_text_strings(page)
|
74
|
+
source_code = get_source_code_from_page(page)
|
75
|
+
result = []
|
76
|
+
|
77
|
+
Nokogiri::HTML(source_code).css('.record').each do |lines|
|
78
|
+
result.push(lines.inner_text)
|
79
|
+
end
|
80
|
+
num_of_results = result.length/3
|
81
|
+
array_of_results = []
|
82
|
+
(0...num_of_results).each do |person|
|
83
|
+
count = person * 3
|
84
|
+
array_of_results.push({:name_string => result[count], :location_string => result[count+1], :contact_info_string => result[count+2]})
|
85
|
+
end
|
86
|
+
array_of_results
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse_location_string(location)
|
90
|
+
location.scan(/\S*\b/).inject do |memo, word|
|
91
|
+
memo = "#{memo} #{word}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_person_hash(person)
|
96
|
+
return {
|
97
|
+
:name => parse_name_string(person[:name_string]),
|
98
|
+
:location => parse_location_string(person[:location_string]),
|
99
|
+
:contact_info => parse_contact_information(person[:contact_info_string])
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def parse_name_string(string)
|
104
|
+
string.strip.match(/\A.*/)[0].rstrip
|
105
|
+
end
|
106
|
+
|
107
|
+
def parse_contact_information(string)
|
108
|
+
numbers = string.scan(/\(\d\d\d\) \d\d\d-\d\d\d\d \(\D*\)/)
|
109
|
+
if numbers == nil
|
110
|
+
return "no matches found while searching the result string"
|
111
|
+
end
|
112
|
+
result = {}
|
113
|
+
numbers.each do |number|
|
114
|
+
key = number.match(/\(\D*\)/)
|
115
|
+
key = key[0]
|
116
|
+
key = key[1...(key.length-1)]
|
117
|
+
|
118
|
+
val = number.match(/\(\d\d\d\) \d\d\d-\d\d\d\d/)[0]
|
119
|
+
result[key] = val
|
120
|
+
end
|
121
|
+
result['email'] = string.match(EMAIL_REGEX)[0] if string =~ EMAIL_REGEX
|
122
|
+
result
|
123
|
+
end
|
124
|
+
|
125
|
+
def search_results_text_string(name_hash)
|
126
|
+
pull_result_text_strings search_result_page(name_hash)
|
127
|
+
end
|
128
|
+
|
129
|
+
def search_result_page(name_hash)
|
130
|
+
@agent.post(search_uri, full_search_form(name_hash))
|
131
|
+
end
|
132
|
+
|
133
|
+
def full_search_form(name_hash)
|
134
|
+
params = basic_params
|
135
|
+
params[first_name_key], params[last_name_key] = name_hash[:first], name_hash[:last]
|
136
|
+
params
|
137
|
+
end
|
138
|
+
def search_uri
|
139
|
+
uri = URI("http://uphsxnet.uphs.upenn.edu/pb/main/Results.aspx")
|
140
|
+
end
|
141
|
+
def last_name_key
|
142
|
+
'ctl00$CPHBody$TxtLastName'
|
143
|
+
end
|
144
|
+
def first_name_key
|
145
|
+
'ctl00$CPHBody$TxtFirstName'
|
146
|
+
end
|
147
|
+
def basic_params
|
148
|
+
params = {
|
149
|
+
'__EVENTTARGET' => '',
|
150
|
+
'__EVENTARGUMENT' => '',
|
151
|
+
'__LASTFOCUS' => '',
|
152
|
+
'__VIEWSTATE' => "/wEPDwUJODE4NDE2OTMxD2QWAmYPZBYKAgEPFCsAAmQQFgJmAgEWAhYCHgtOYXZpZ2F0ZVVybAUdaHR0cDovL3VwaHNuZXQudXBocy51cGVubi5lZHUWAh8ABTJodHRwOi8vdXBoc3huZXQudXBocy51cGVubi5lZHUvcGIvbWFpbi9TZWFyY2guYXNweBYCAgECAWQCAg8PFgIfAAUyaHR0cDovL3VwaHN4bmV0LnVwaHMudXBlbm4uZWR1L3BiL21haW4vU2VhcmNoLmFzcHhkZAIDDw8WAh8ABTRodHRwczovL3d3dy5wZW5ubWVkaWNpbmUub3JnL3BiL21haW4vQWRkUHJvZmlsZS5hc3B4ZGQCBA8PFgIfAAVHaHR0cDovL3VwaHN4bmV0LnVwaHMudXBlbm4uZWR1L3dhZ2Zvcm0vTWFpblBhZ2UuYXNweD9jb25maWc9UGhvbmVCS0RlcHRkZAIFD2QWAgIBD2QWAgIBD2QWAmYPZBYCAhEPZBYEAgUPEGRkFgBkAgkPEGRkFgFmZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUWY3RsMDAkQ1BIQm9keSRDaGtTb3VuZCO/QfmaJs0Nh7aMMG5a5fouPscW",
|
153
|
+
"__PREVIOUSPAGE" =>"LGvxaPcY7PZkrvDYFcvX-pr62ylAE4Y2Ygd52Jnh4xSGP8-Lpp6hYdYZYUwcmra0pcKk8cdIkCNrfp6LC-oGF67F8BeWSmaOW7d9mS_LzPUWNWRt0",
|
154
|
+
'__EVENTVALIDATION' => "/wEWDQL9sunMAQL1+8m8BALz3azcAgKm1KVQAuzb4JIJArCQl/MLAq25g7YOApncg6QMAoT1l+EJAtLMyJIJApDxvY0FAs+B3aUKApji1LEP2V0HX+LWQa+Ohm8tjlJWtmwvVs0=",
|
155
|
+
'ctl00$CPHBody$LbEntity' => 'ALL',
|
156
|
+
'ctl00$CPHBody$DdlDiv' => "ALL",
|
157
|
+
'ctl00$CPHBody$TxtNumber' => '',
|
158
|
+
'ctl00$CPHBody$HidSession' => '',
|
159
|
+
'ctl00$CPHBody$BtnSubmit' => "Search"}
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: egduphsphonebookadapt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eugene Gitelman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: ! "The class gives you a search function, which takes a hash in form
|
14
|
+
of {:first => first_name, :last => last_name} and returns an array of hashes corresponding
|
15
|
+
to results. you can send an options hash with :form => 'json' \n to
|
16
|
+
get the results as JSON \n\n example: Phonebook.new.search_results(:first
|
17
|
+
=> 'Bob', :last => 'Jones') will produce '[{:name=>Jones, Bob, :location=>HUP Medicine
|
18
|
+
\ Department of 3400 Spruce St, :contact_info=>{Office=>(215) 5555-5555, Cell=>(215)
|
19
|
+
555-5555, email=>Bob.jones@uphs.upenn.edu}}]' \n \n this is an
|
20
|
+
array, even if there is only one result. Can also call Phonebook.search_results(name_hash,
|
21
|
+
options)"
|
22
|
+
email:
|
23
|
+
- eugyev@gmail.com
|
24
|
+
executables: []
|
25
|
+
extensions: []
|
26
|
+
extra_rdoc_files: []
|
27
|
+
files:
|
28
|
+
- lib/egduphsphonebookadapt.rb
|
29
|
+
homepage:
|
30
|
+
licenses: []
|
31
|
+
metadata: {}
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.2.2
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: pulls data for UPHS phonebook. ONLY on VPN
|
52
|
+
test_files: []
|