googlevoice47 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +17 -10
- data/lib/googlevoice47/version.rb +1 -1
- data/lib/googlevoice47.rb +14 -43
- metadata +9 -9
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
googlevoice47 (0.1.
|
4
|
+
googlevoice47 (0.1.9)
|
5
5
|
htmlentities
|
6
6
|
mechanize
|
7
7
|
|
@@ -9,15 +9,20 @@ GEM
|
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
11
|
diff-lcs (1.1.3)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
domain_name (0.5.2)
|
13
|
+
unf (~> 0.0.3)
|
14
|
+
htmlentities (4.3.1)
|
15
|
+
mechanize (2.1.1)
|
16
|
+
domain_name (~> 0.5, >= 0.5.1)
|
17
|
+
net-http-digest_auth (~> 1.1, >= 1.1.1)
|
18
|
+
net-http-persistent (~> 2.4, >= 2.4.1)
|
16
19
|
nokogiri (~> 1.4)
|
17
|
-
|
18
|
-
|
19
|
-
net-http-
|
20
|
+
ntlm-http (~> 0.1, >= 0.1.1)
|
21
|
+
webrobots (~> 0.0, >= 0.0.9)
|
22
|
+
net-http-digest_auth (1.2)
|
23
|
+
net-http-persistent (2.4.1)
|
20
24
|
nokogiri (1.5.0)
|
25
|
+
ntlm-http (0.1.1)
|
21
26
|
rake (0.9.2)
|
22
27
|
rspec (2.6.0)
|
23
28
|
rspec-core (~> 2.6.0)
|
@@ -27,8 +32,10 @@ GEM
|
|
27
32
|
rspec-expectations (2.6.0)
|
28
33
|
diff-lcs (~> 1.1.2)
|
29
34
|
rspec-mocks (2.6.0)
|
30
|
-
|
31
|
-
|
35
|
+
unf (0.0.4)
|
36
|
+
unf_ext
|
37
|
+
unf_ext (0.0.4)
|
38
|
+
webrobots (0.0.13)
|
32
39
|
|
33
40
|
PLATFORMS
|
34
41
|
ruby
|
data/lib/googlevoice47.rb
CHANGED
@@ -17,23 +17,16 @@ module GoogleVoice
|
|
17
17
|
|
18
18
|
class InvalidLoginException < Exception; end
|
19
19
|
class InvalidPhoneNumberException < Exception; end
|
20
|
-
|
21
|
-
# Create a basic Mechanize agent, initial our objects, and
|
22
|
-
# create our dynamic <function>_xml methods
|
20
|
+
|
23
21
|
def initialize(email, password)
|
24
22
|
@agent = Mechanize.new
|
25
23
|
@coder = HTMLEntities.new
|
26
24
|
@email = email if !email.nil?
|
27
25
|
@password = password if !password.nil?
|
28
|
-
|
29
|
-
# The methods created with this are used to fetch various
|
30
|
-
# XML data from Google for call-related history data.
|
26
|
+
|
31
27
|
init_xml_methods()
|
32
28
|
end
|
33
|
-
|
34
|
-
# Login to a Google Account to use the Google Voice services
|
35
|
-
# Most of the calls require a special authentication token called
|
36
|
-
# _rnr_se that can be scraped from the page once logged in.
|
29
|
+
|
37
30
|
def login()
|
38
31
|
login_page = @agent.get("https://www.google.com/accounts/ServiceLogin?service=grandcentral")
|
39
32
|
login_page.forms.first.field_with(:name=>"Email").value = @email
|
@@ -44,49 +37,35 @@ module GoogleVoice
|
|
44
37
|
raise InvalidLoginException, "Cannot login to Google Voice with #{@email}" unless dialing_form
|
45
38
|
@rnr_se = dialing_form.field_with(:name => '_rnr_se').value
|
46
39
|
end
|
47
|
-
|
48
|
-
# Make sure we have a valid Mechanize agent and we obtained the _rnr_se
|
49
|
-
# authentication token after logging in. Those are the two keys to
|
50
|
-
# determining if we are successfully logged in or not.
|
40
|
+
|
51
41
|
def logged_in?
|
52
42
|
(@agent !=nil) && (@rnr_se != nil)
|
53
43
|
end
|
54
44
|
|
55
|
-
# Send a text message to remote_number
|
56
45
|
def sms(remote_number, text_message)
|
57
46
|
login unless logged_in?
|
58
|
-
|
47
|
+
remote_number = validate_number(remote_number)
|
59
48
|
text_message = @coder.encode(text_message)
|
60
49
|
@agent.post('https://www.google.com/voice/sms/send/', :id => '', :phoneNumber => remote_number, :text => text_message, "_rnr_se" => @rnr_se)
|
61
50
|
end
|
62
|
-
|
63
|
-
# Place a call to remote_number, and ring back forwarding_number which
|
64
|
-
# should be set up on the currently logged in Google Voice account
|
51
|
+
|
65
52
|
def call(remote_number, forwarding_number)
|
66
53
|
login unless logged_in?
|
67
|
-
|
54
|
+
remote_number = validate_number(remote_number)
|
68
55
|
forwarding_number = validate_number(forwarding_number)
|
69
56
|
@agent.post('https://www.google.com/voice/call/connect/', :outgoingNumber => remote_number, :forwardingNumber => forwarding_number, :phoneType => 2, :subscriberNumber => 'undefined', :remember => '0', "_rnr_se" => @rnr_se)
|
70
57
|
end
|
71
58
|
|
72
|
-
# Cancel the call in progress for this account. It does NOT hang up
|
73
|
-
# a call that has been answered, only one that has been placed but
|
74
|
-
# not completed yet.
|
75
59
|
def cancel()
|
76
60
|
login unless logged_in?
|
77
61
|
@agent.post('https://www.google.com/voice/call/cancel/', :outgoingNumber => 'undefined', :forwardingNumber => 'undefined', :cancelType => 'C2C', "_rnr_se" => @rnr_se)
|
78
62
|
end
|
79
63
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
#def validate_number(phone_number)
|
86
|
-
# phone_number = phone_number.gsub(/\D/,'')
|
87
|
-
# raise InvalidPhoneNumberException, "Invalid Phone Number #{phone_number}" if phone_number.length < 4 || phone_number.length > 15
|
88
|
-
# return phone_number
|
89
|
-
#end
|
64
|
+
def validate_number(phone_number)
|
65
|
+
phone_number = phone_number.gsub(/\D/,'')
|
66
|
+
raise InvalidPhoneNumberException, "Invalid Phone Number #{phone_number}" if phone_number.length < 4 || phone_number.length > 15
|
67
|
+
return phone_number
|
68
|
+
end
|
90
69
|
|
91
70
|
private
|
92
71
|
|
@@ -95,12 +74,7 @@ module GoogleVoice
|
|
95
74
|
login unless logged_in?
|
96
75
|
return @agent.get(url).body
|
97
76
|
end
|
98
|
-
|
99
|
-
# Google provides XML data for various call histories all with the same
|
100
|
-
# URL pattern in a getful manner. So here we're just dynamically creating
|
101
|
-
# methods to fetch that data in a DRY-manner. Yes, define_method is slow,
|
102
|
-
# but we're already making web calls which drags performance down anyway
|
103
|
-
# so it shouldn't matter in the long run.
|
77
|
+
|
104
78
|
def init_xml_methods()
|
105
79
|
(class << self; self; end).class_eval do
|
106
80
|
%w{ unread inbox starred all spam trash voicemail sms trash recorded placed received missed }.each do |method|
|
@@ -108,7 +82,4 @@ module GoogleVoice
|
|
108
82
|
get_xml_document("https://www.google.com/voice/inbox/recent/#{method}")
|
109
83
|
end
|
110
84
|
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
85
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: googlevoice47
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &73845350 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *73845350
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &73844930 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *73844930
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: mechanize
|
38
|
-
requirement: &
|
38
|
+
requirement: &73844470 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *73844470
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: htmlentities
|
49
|
-
requirement: &
|
49
|
+
requirement: &73844150 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *73844150
|
58
58
|
description: Uses Mechanize to screen-scrape Google Voice since there is no public
|
59
59
|
API
|
60
60
|
email:
|