ispusage 0.2.0 → 0.3.0
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/Rakefile +4 -0
- data/VERSION +1 -1
- data/lib/ispusage/fetchers/au_optus.rb +48 -0
- data/lib/ispusage/fetchers/au_three.rb +34 -0
- data/lib/ispusage/fetchers/fetcher.rb +2 -2
- data/lib/ispusage/fetchers.rb +2 -0
- data/lib/ispusage.rb +7 -3
- data/spec/fetchers/au_optus_spec.rb +34 -0
- data/spec/fetchers/au_three_spec.rb +29 -0
- data/spec/fixtures/au_optus/my_account.html +1789 -0
- data/spec/fixtures/au_optus/my_usage.html +2028 -0
- data/spec/fixtures/au_optus/signon.html +464 -0
- data/spec/fixtures/au_three/pin.html +249 -0
- data/spec/fixtures/au_three/signon.html +312 -0
- data/spec/fixtures/au_three/usage.html +989 -0
- metadata +44 -2
data/Rakefile
CHANGED
@@ -11,6 +11,10 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/aussiegeek/ispusage"
|
12
12
|
gem.authors = ["Alan Harper"]
|
13
13
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
gem.add_dependency 'json'
|
15
|
+
gem.add_dependency 'nokogiri'
|
16
|
+
gem.add_dependency 'mechanize'
|
17
|
+
|
14
18
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
19
|
end
|
16
20
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mechanize'
|
3
|
+
|
4
|
+
class IspUsage
|
5
|
+
class Fetchers
|
6
|
+
class AUOptus < Fetcher
|
7
|
+
def initialize(options)
|
8
|
+
super(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch_usage
|
12
|
+
agent = Mechanize.new
|
13
|
+
|
14
|
+
page = agent.get('https://my.optus.com.au/web/oscportal.portal?site=personal')
|
15
|
+
form = page.form('Login')
|
16
|
+
form['USER'] = self.username
|
17
|
+
form['PASSWORD'] = self.password
|
18
|
+
|
19
|
+
page = agent.submit(form, form.buttons.first)
|
20
|
+
|
21
|
+
account_no = page.search('h2').text.match(/\d+/)
|
22
|
+
services = page.search('ol.service_list')
|
23
|
+
services.each do |service|
|
24
|
+
phone_no = service.search('div>a').text.strip
|
25
|
+
page = agent.get("https://my.optus.com.au/web/oscportal.portal?_nfpb=true&_pageLabel=redirectPage&redirectTo=deeplink_myusage_postpaid&site=personal&pageName=unbilledUsage&virAcctNum=#{phone_no}&accNum=#{account_no}&_activeBA=#{account_no}&_activeSI=#{phone_no}")
|
26
|
+
|
27
|
+
plan_text = page.search("html>body>div>div>div:nth-of-type(3)>div>div:nth-of-type(2)>div:nth-of-type(4)>div>table tr:nth-of-type(5)>td>table tr:nth-of-type(2)>td>div>table tr:nth-of-type(2)>td:nth-of-type(2)").text
|
28
|
+
|
29
|
+
|
30
|
+
downloads = UsagePeriod.new
|
31
|
+
self.usage_periods << downloads
|
32
|
+
|
33
|
+
downloads.label = phone_no
|
34
|
+
downloads.quota = plan_text.match(/(\d+)MB/)[1].to_i
|
35
|
+
|
36
|
+
usagesummary = page.search('table.usagesummary')
|
37
|
+
usagesummary.search('tr').each do |row|
|
38
|
+
row_name = row.search('td[1]').text
|
39
|
+
case row_name
|
40
|
+
when 'Data - Mobile Internet'
|
41
|
+
downloads.used = row.search('td[2]').text.match(/\d+\./)[0].to_i
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mechanize'
|
3
|
+
|
4
|
+
class IspUsage
|
5
|
+
class Fetchers
|
6
|
+
class AUThree < Fetcher
|
7
|
+
def initialize(options)
|
8
|
+
super(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch_usage
|
12
|
+
agent = Mechanize.new
|
13
|
+
page = agent.get('https://www.my.three.com.au/My3/jfn')
|
14
|
+
login_form = page.form('login')
|
15
|
+
login_form.login = self.username
|
16
|
+
login_form.password = self.password
|
17
|
+
page = agent.submit(login_form, login_form.buttons.first)
|
18
|
+
pin_form = page.form('myForm')
|
19
|
+
if pin_form.nil?
|
20
|
+
puts "Authentication failure"
|
21
|
+
exit(1)
|
22
|
+
end
|
23
|
+
pin_form.pin = options[:pin]
|
24
|
+
page = agent.submit(pin_form, pin_form.buttons.first)
|
25
|
+
|
26
|
+
downloads = UsagePeriod.new
|
27
|
+
self.usage_periods << downloads
|
28
|
+
|
29
|
+
downloads.quota = page.search("td[width='190px;']").text.strip.to_i
|
30
|
+
downloads.used = downloads.quota - page.search('br+strong.largeclass').text.strip.to_i
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -4,12 +4,12 @@ require 'json'
|
|
4
4
|
class IspUsage
|
5
5
|
class Fetchers
|
6
6
|
class Fetcher
|
7
|
-
attr_accessor :usage_periods, :username, :password
|
7
|
+
attr_accessor :usage_periods, :username, :password, :options
|
8
8
|
|
9
9
|
def initialize(options)
|
10
10
|
@username = options[:username]
|
11
11
|
@password = options[:password]
|
12
|
-
|
12
|
+
self.options = options
|
13
13
|
self.usage_periods = []
|
14
14
|
end
|
15
15
|
|
data/lib/ispusage/fetchers.rb
CHANGED
data/lib/ispusage.rb
CHANGED
@@ -7,9 +7,10 @@ require 'json'
|
|
7
7
|
class IspUsage
|
8
8
|
|
9
9
|
ISPS = [
|
10
|
-
'AUBigpond',
|
11
10
|
'AUIinet',
|
12
|
-
'AUInternode'
|
11
|
+
'AUInternode',
|
12
|
+
'AUOptus',
|
13
|
+
'AUThree'
|
13
14
|
]
|
14
15
|
|
15
16
|
class Cli
|
@@ -20,6 +21,7 @@ class IspUsage
|
|
20
21
|
opts.on('-i', '--isp isp', 'ISP') {|i| options[:isp] = i}
|
21
22
|
opts.on('-u', '--username username', 'Username') {|u| options[:username] = u}
|
22
23
|
opts.on('-p', '--password password', 'Password') {|p| options[:password] = p}
|
24
|
+
opts.on('-q', '--pin ', 'PIN') {|pin| options[:pin] = pin}
|
23
25
|
opts.on('-j', '--json', 'JSON Output') {|j| options[:output] = :json}
|
24
26
|
end
|
25
27
|
optparse.parse!
|
@@ -35,7 +37,9 @@ class IspUsage
|
|
35
37
|
fetcher.fetch_usage
|
36
38
|
case options[:output]
|
37
39
|
when :text
|
38
|
-
|
40
|
+
fetcher.usage_periods.each do |usage_period|
|
41
|
+
puts usage_period.label + ':' + usage_period.used.to_s + '/' + usage_period.quota.to_s
|
42
|
+
end
|
39
43
|
when :json
|
40
44
|
puts fetcher.to_json
|
41
45
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe IspUsage::Fetchers::AUOptus do
|
4
|
+
describe "single usage period" do
|
5
|
+
before do
|
6
|
+
signon = File.read(File.dirname(__FILE__) + '/../fixtures/au_optus/signon.html')
|
7
|
+
FakeWeb.register_uri(:get, 'https://my.optus.com.au/web/oscportal.portal?site=personal', :response => signon)
|
8
|
+
my_account = File.read(File.dirname(__FILE__) + '/../fixtures/au_optus/my_account.html')
|
9
|
+
FakeWeb.register_uri(:post, 'https://my.optus.com.au/signon/Optus/login_ext.sec', :response => my_account)
|
10
|
+
my_usage = File.read(File.dirname(__FILE__) + '/../fixtures/au_optus/my_usage.html')
|
11
|
+
FakeWeb.register_uri(:get, 'https://my.optus.com.au/web/oscportal.portal?_nfpb=true&_pageLabel=redirectPage&redirectTo=deeplink_myusage_postpaid&site=personal&pageName=unbilledUsage&virAcctNum=0123456789&accNum=01234567890123&_activeBA=01234567890123&_activeSI=0123456789', :response => my_usage)
|
12
|
+
|
13
|
+
options = {:username => 'user', :password => 'password'}
|
14
|
+
@usage = IspUsage::Fetchers::AUOptus.new(options)
|
15
|
+
@usage.fetch_usage
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return usage correctly" do
|
19
|
+
@usage.usage_periods.first.used.should == 151
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return quota correctly" do
|
23
|
+
@usage.usage_periods.first.quota.should == 500
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return total correctly" do
|
27
|
+
@usage.usage_periods.first.total.should == 500
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should set label to phone number" do
|
31
|
+
@usage.usage_periods.first.label.should == "0123456789"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe IspUsage::Fetchers::AUThree do
|
4
|
+
describe "single usage period" do
|
5
|
+
before do
|
6
|
+
signon = File.read(File.dirname(__FILE__) + '/../fixtures/au_three/signon.html')
|
7
|
+
FakeWeb.register_uri(:get, 'https://www.my.three.com.au/My3/jfn', :response => signon)
|
8
|
+
pin = File.read(File.dirname(__FILE__) + '/../fixtures/au_three/pin.html')
|
9
|
+
my_usage = File.read(File.dirname(__FILE__) + '/../fixtures/au_three/usage.html')
|
10
|
+
FakeWeb.register_uri(:post, 'https://www.my.three.com.au/My3/jfn', [{:response => pin, :times => 1}, {:response => my_usage}])
|
11
|
+
|
12
|
+
options = {:username => 'user', :password => 'password', :pin => '1234'}
|
13
|
+
@usage = IspUsage::Fetchers::AUThree.new(options)
|
14
|
+
@usage.fetch_usage
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return usage correctly" do
|
18
|
+
@usage.usage_periods.first.used.should == 61
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return quota correctly" do
|
22
|
+
@usage.usage_periods.first.quota.should == 500
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return total correctly" do
|
26
|
+
@usage.usage_periods.first.total.should == 500
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|