mobistar 0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ba5402da9aeb0a5b9ee2aeb4e85871fb2282be15
4
+ data.tar.gz: 4e37f7eaa9b8816e784e88b780b265966cce139e
5
+ SHA512:
6
+ metadata.gz: 808972f8e59b89ff818a46fea99240dc7b53e84d8ed90857358f548e35e51ad1f51cb0aa9568aaf710196f33b32faa3d126c5fb9d41d280d407886fc7667d8da
7
+ data.tar.gz: 8f8e2358d34b82a3ddd23e5bb1fd4ef6c6230e153096ace17fe0f1c4e650a06294282281050fcf0d53e1f3ce6cebac9ddbb7e5e73408e75dd08c1a15c714e895
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'rubygems/package_task'
3
+
4
+ spec = Gem::Specification.new do |s|
5
+ s.platform = Gem::Platform::RUBY
6
+ s.summary = "Mobistar web services"
7
+ s.description = 'A client for the web services of the belgian mobile operator Mobistar'
8
+ s.name = 'mobistar'
9
+ s.version = '0.1'
10
+ s.authors = ['Titouan Christophe']
11
+ s.email = 'titouanchristophe@gmail.com'
12
+ s.executables += ['mobistar-sms', 'mobistar-phonebook']
13
+ s.homepage = 'https://github.com/titouanc/mobistar'
14
+ s.bindir = 'bin'
15
+ s.require_path = 'lib'
16
+ s.add_runtime_dependency "mechanize"
17
+ s.add_runtime_dependency "highline"
18
+ s.files = FileList['lib/*', 'lib/mobistar/*', 'bin/*', 'Rakefile'].to_a
19
+ s.licenses = ['GPL']
20
+ end
21
+
22
+ package = Gem::PackageTask.new spec do |pkg|
23
+ pkg.need_zip = true
24
+ pkg.need_tar = true
25
+ end
26
+
27
+ task :default => :repackage
28
+
29
+ desc "Build and install gem"
30
+ task :install => ["pkg/#{package.name}.gem"] do |t|
31
+ sh "gem install #{t.prerequisites.first}"
32
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'mobistar'
4
+ require 'mobistar/config'
5
+
6
+ Mobistar.load_config!
7
+
8
+ Mobistar::Config[:phonebook] = {} unless Mobistar::Config.key? :phonebook
9
+
10
+ if ARGV.empty?
11
+ maxlen = Mobistar::Config[:phonebook].keys.inject 0 do |maxlen, name|
12
+ maxlen = (name.length > maxlen) ? name.length : maxlen
13
+ end
14
+
15
+ Mobistar::Config[:phonebook].each do |name, number|
16
+ puts "#{name.capitalize.rjust maxlen}: #{Mobistar::Number.new(number).human}"
17
+ end
18
+ else
19
+ Action = ARGV.shift
20
+ case Action.downcase
21
+ when 'add'
22
+ begin
23
+ number = Mobistar::Number.new(ARGV.pop).belgian
24
+ rescue Mobistar::InvalidGSMNumber
25
+ abort "Invalid phone number #{number}"
26
+ end
27
+ name = ARGV*' '
28
+ abort "Invalid name" if name.empty?
29
+ Mobistar::Config[:phonebook][name.downcase] = number
30
+ else
31
+ abort "Unknow action #{Action}"
32
+ end
33
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "mobistar"
4
+ require "mobistar/config"
5
+ require "highline/import"
6
+
7
+ #Load configuration
8
+ Mobistar.load_config!
9
+
10
+ if ARGV.length < 2
11
+ puts "Usage: #{File.basename $0} [@Username] RECIPIENT MESSAGE"
12
+ puts "RECIPIENT could be an entry from the phonebook"
13
+ puts "Default username: #{Mobistar::Config[:username]}" if Mobistar::Config.key? :username
14
+ exit
15
+ end
16
+
17
+ #Parse username, or retrieve it from config
18
+ if ARGV.first.start_with?('@')
19
+ Username = ARGV.shift[1..-1]
20
+ Mobistar::Config[:username] = Username
21
+ elsif Mobistar::Config.key? :username
22
+ Username = Mobistar::Config[:username]
23
+ else
24
+ abort "No username provided !!!"
25
+ end
26
+
27
+ #Parse phone number, or retrieve it from phonebook
28
+ dest = ARGV.shift.downcase
29
+ if Mobistar::Config.key?(:phonebook) && Mobistar::Config[:phonebook].key?(dest)
30
+ dest = Mobistar::Config[:phonebook][dest]
31
+ end
32
+ begin
33
+ Recipient = Mobistar::Number.new(dest)
34
+ rescue Mobistar::InvalidGSMNumber => err
35
+ abort "#{dest} isn't a valid belgian gsm number and isn't in the phonebook"
36
+ end
37
+
38
+ Message = ARGV*' '
39
+ abort "Empty message !!!" if Message.strip.empty?
40
+
41
+ Password = ask("Enter Mobistar client password for \033[1m#{Username}\033[0m"){|q|
42
+ q.echo = false
43
+ }
44
+ abort "No password given" if Password.empty?
45
+
46
+ print "Sending #{Message} to #{Recipient.human}... "
47
+ $stdout.flush
48
+
49
+ begin
50
+ Mobistar::Client.new Username, Password do |client|
51
+ puts "done !" if client.send_sms Recipient, Message
52
+ end
53
+ rescue Mobistar::AuthenticationError, Mobistar::MissingLink, Mobistar::CookieError
54
+ abort "Unable to connect to Mobistar web services"
55
+ end
@@ -0,0 +1,98 @@
1
+ require "mechanize"
2
+
3
+ module Mobistar
4
+ class CookieError < Exception; end
5
+ class AuthenticationError < Exception; end
6
+ class MissingLink < Exception; end
7
+ class InvalidGSMNumber < Exception; end
8
+ class NotLoggedIn < Exception; end
9
+
10
+ class Number
11
+ def initialize string
12
+ if string =~ /^(\+32|0)4([7-9]\d{7})$/
13
+ @num = $2
14
+ else
15
+ raise InvalidGSMNumber, "#{string} isn't a valid belgian gsm number !"
16
+ end
17
+ end
18
+
19
+ def international
20
+ "+324#{@num}"
21
+ end
22
+
23
+ def belgian
24
+ "04#{@num}"
25
+ end
26
+
27
+ def human group=2
28
+ "04#{@num[0..1]}/#{@num[2..-1].gsub(/(\d{#{group}})/, '\1.')[0...-1]}"
29
+ end
30
+ end
31
+
32
+ class Client
33
+ LOGIN_URL = "https://res.mobistar.be/imfrontend/dwr/call/plaincall/LoginDwr.checkLogin.dwr?callCount=1&page=%2Ffr%2Fe-services%2Flogin%3FTYPE%3D33554433%26REALMOID%3D06-38929314-8a51-1125-95a9-84e323580cb3%26GUID%3D%26SMAUTHREASON%3D0%26METHOD%3DGET%26SMAGENTNAME%3D%24SM%244T0F5sTwaomxEpeIVaniBrJhN3p12h%252fZ1tlR7msTW8vDiSUgQxpGjnQ5sd3em5iO%26TARGET%3D%24SM%24https%253a%252f%252fmy%252emobistar%252ebe%252fsecured%252fespace-client%252findex%252ehtml&httpSessionId=&scriptSessionId=A542EDD0B6E72E6CE3C3C3D8C3E8F464740&c0-scriptName=LoginDwr&c0-methodName=checkLogin&c0-id=0&c0-e1=string%3A%{USERNAME}&c0-e2=string%3A%{PASSWORD}&c0-e3=string%3Afr&c0-e4=string%3A%2524SM%2524https%25253a%25252f%25252fmy%25252emobistar%25252ebe%25252fsecured%25252fespace-client%25252findex%25252ehtml&c0-e5=string%3Amobistarresidential&c0-param0=Object_Object%3A%7Blogin%3Areference%3Ac0-e1%2C%20password%3Areference%3Ac0-e2%2C%20language%3Areference%3Ac0-e3%2C%20targetUrl%3Areference%3Ac0-e4%2C%20referrer%3Areference%3Ac0-e5%7D&batchId=0"
34
+
35
+ def initialize username, password
36
+ @loggedin = nil
37
+ @agent = Mechanize.new do |ag|
38
+ ag.follow_meta_refresh = true
39
+ end
40
+ if block_given?
41
+ loginDWR username, password
42
+ yield self
43
+ end
44
+ end
45
+
46
+ def send_sms number, message
47
+ number_parsed = number.kind_of?(Number) ? number : Number.new(number)
48
+ number = number_parsed.belgian #Ensure valid number
49
+
50
+ raise NotLoggedIn unless @loggedin
51
+ link = @loggedin.link_with :text => 'Envoyer un e-mail'
52
+ raise MissingLink unless link
53
+ send_email = @agent.click link
54
+ link = send_email.link_with :text => /crire un SMS$/
55
+ raise MissingLink unless link
56
+
57
+ #Go to SMS Page and use form
58
+ send_sms = @agent.click link
59
+ confirmation = send_sms.form_with(:name => "formulaire"){|form|
60
+ form['NUMTEL'] = number
61
+ form['listetel'] = ',,'+number
62
+ form['corpsms'] = form['msg'] = message
63
+ form['typesms'] = '2'
64
+ form['produit'] = '1000'
65
+ form['delai'] = 'now'
66
+ }.submit.form_with(:name=>'formulaire').submit
67
+ return true
68
+ end
69
+
70
+ protected
71
+ def loginDWR username, password
72
+ url = LOGIN_URL.gsub(/%\{USERNAME\}/, username).gsub(/%\{PASSWORD\}/, password)
73
+ loginDWR = @agent.get url
74
+
75
+ if loginDWR.body =~ /dwr.engine._remoteHandleCallback\('0','0',\{(.+)\}\);$/
76
+ response = {}
77
+ $1.split(/,/).each do |keyval|
78
+ key, val = keyval.split(/:/, 2)
79
+ val = val[1...-1] if val.start_with?('"') && val.end_with?('"')
80
+ val = nil if val == "null"
81
+ val = false if val == "false"
82
+ val = true if val == "true"
83
+ response[key] = val
84
+ end
85
+ else
86
+ raise AuthenticationError
87
+ end
88
+
89
+ auth_cookie = Mechanize::Cookie.new 'SMSESSION', response['cookieSMValue']
90
+ auth_cookie.domain = '.mobistar.be'
91
+ auth_cookie.path = '/'
92
+ cook = @agent.cookie_jar.add @agent.history.last.uri, auth_cookie
93
+ raise CookieError, "Cannot add auth cookie to session !!!" unless cook
94
+ @loggedin = @agent.get response['targetURL']
95
+ return true
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,17 @@
1
+ require 'yaml'
2
+
3
+ module Mobistar
4
+ ConfigFile = File.join(ENV['HOME'], '.mobistar.yml')
5
+ Config = {}
6
+
7
+ def self.load_config!
8
+ if File.exists? ConfigFile
9
+ Config.merge! YAML.load_file(ConfigFile)
10
+ end
11
+ at_exit do
12
+ File.open(ConfigFile, 'w') do |f|
13
+ f.puts YAML.dump(Config)
14
+ end
15
+ end
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mobistar
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Titouan Christophe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mechanize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: highline
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A client for the web services of the belgian mobile operator Mobistar
42
+ email: titouanchristophe@gmail.com
43
+ executables:
44
+ - mobistar-sms
45
+ - mobistar-phonebook
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/mobistar.rb
50
+ - lib/mobistar/config.rb
51
+ - bin/mobistar-phonebook
52
+ - bin/mobistar-sms
53
+ - Rakefile
54
+ homepage: https://github.com/titouanc/mobistar
55
+ licenses:
56
+ - GPL
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.0.2
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Mobistar web services
78
+ test_files: []