voys_api 0.1.1 → 0.2.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/README.md +2 -0
- data/lib/voys_api/client.rb +84 -7
- data/lib/voys_api/version.rb +1 -1
- data/voys_api.gemspec +1 -0
- metadata +19 -4
data/README.md
CHANGED
data/lib/voys_api/client.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
require 'csv'
|
2
2
|
require 'mechanize'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'active_support/core_ext/object/to_query'
|
5
|
+
require 'active_support/core_ext/object/to_param'
|
6
|
+
require 'active_support/core_ext/object/try'
|
3
7
|
# VoysApi exports voys.nl call list..
|
4
8
|
class VoysApi::Client
|
5
9
|
|
10
|
+
VOYS_HOST = 'mijn.voys.nl'
|
11
|
+
|
6
12
|
def initialize(username, password)
|
7
13
|
@username = username
|
8
14
|
@password = password
|
@@ -14,7 +20,7 @@ class VoysApi::Client
|
|
14
20
|
|
15
21
|
def login
|
16
22
|
return true if @logged_in
|
17
|
-
page = agent.get(
|
23
|
+
page = agent.get("https://#{VOYS_HOST}/user/login/")
|
18
24
|
login_form = page.form
|
19
25
|
login_form.fields.detect {|field| field.name == 'this_is_the_login_form'} || raise(VoysApi::AuthenticationError, "Could not find the login form!")
|
20
26
|
login_form.field_with(:name => "username").value = @username
|
@@ -41,19 +47,77 @@ class VoysApi::Client
|
|
41
47
|
def raw_export(options = {})
|
42
48
|
login if not logged_in?
|
43
49
|
|
44
|
-
|
45
|
-
options[:period_from] = options[:period_from].strftime("%Y-%m-%d") if options[:period_from].is_a?(Time)
|
46
|
-
options[:period_to] = options[:period_to].strftime("%Y-%m-%d") if options[:period_to].is_a?(Time)
|
50
|
+
options = covert_options(options)
|
47
51
|
|
48
52
|
result = agent.post('/cdr/export', options)
|
49
53
|
result.body
|
50
54
|
end
|
51
55
|
|
56
|
+
def html_export(options = {})
|
57
|
+
login if not logged_in?
|
58
|
+
|
59
|
+
options = {
|
60
|
+
period_from: nil,
|
61
|
+
period_to: nil,
|
62
|
+
inboundoutbound: 0,
|
63
|
+
totals: 0,
|
64
|
+
aggregation: 0,
|
65
|
+
recordings: 0,
|
66
|
+
page: 1
|
67
|
+
}.merge(options)
|
68
|
+
options = convert_options(options)
|
69
|
+
|
70
|
+
results = []
|
71
|
+
page_number = 1
|
72
|
+
begin
|
73
|
+
options[:page] = page_number
|
74
|
+
puts "Page #{page_number}"
|
75
|
+
|
76
|
+
page = agent.get("/cdr?#{options.to_param}")
|
77
|
+
rows = page.search('table tbody tr')
|
78
|
+
rows.each do |row|
|
79
|
+
cols = row.search('td')
|
80
|
+
|
81
|
+
result = {}
|
82
|
+
result[:date] = cols[2].inner_text.strip
|
83
|
+
result[:inbound__outbound] = cols[3].inner_text.strip
|
84
|
+
result[:duration] = cols[5].inner_text
|
85
|
+
source = result[:source] = cols[6].inner_text.strip
|
86
|
+
destination = result[:destination] = cols[7].inner_text.strip
|
87
|
+
recording = result[:recording] = cols[9].at('.jp-embedded').try(:[], 'data-source-wav')
|
88
|
+
puts result.inspect
|
89
|
+
|
90
|
+
# Download all recordings
|
91
|
+
if recording
|
92
|
+
time = Time.parse(result[:date])
|
93
|
+
recording_filename = "recordings/#{time.strftime("%Y%m%d_%H%M")}-#{source}-#{destination}.wav"
|
94
|
+
FileUtils.mkdir_p(File.dirname(recording_filename))
|
95
|
+
get_recording(recording, recording_filename)
|
96
|
+
end
|
97
|
+
|
98
|
+
results << result
|
99
|
+
end
|
100
|
+
page_number += 1
|
101
|
+
end until page.at('.pagination a.next').nil?
|
102
|
+
return results
|
103
|
+
end
|
104
|
+
|
105
|
+
def get_recording(recording_path, filename = nil)
|
106
|
+
login if not logged_in?
|
107
|
+
|
108
|
+
if recording_path =~ /(\d+)\/?$/
|
109
|
+
recording_id = $1
|
110
|
+
filename ||= "#{recording_id}.wav"
|
111
|
+
agent.get(recording_path).save(filename)
|
112
|
+
return filename
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns CSV::Table of calls.
|
52
117
|
# NOTE:
|
53
118
|
# Date and time values are in +0200 timezone but set to UTC
|
54
119
|
# To fix use row[:date].change(:offset => "+0200")
|
55
120
|
def export(options = {}, csv_options = {})
|
56
|
-
|
57
121
|
csv_options = {col_sep: ';', converters: [:date_time], headers: :first_row, header_converters: :symbol}.merge(csv_options)
|
58
122
|
export = CSV.parse(raw_export(options), csv_options)
|
59
123
|
return export
|
@@ -62,13 +126,26 @@ class VoysApi::Client
|
|
62
126
|
end
|
63
127
|
|
64
128
|
def logout
|
65
|
-
agent.get(
|
129
|
+
agent.get("https://#{VOYS_HOST}/user/logout/")
|
66
130
|
end
|
67
131
|
|
68
132
|
private
|
69
133
|
|
134
|
+
def convert_options(options)
|
135
|
+
converted_options = options.clone # deep clone?
|
136
|
+
|
137
|
+
# convert options
|
138
|
+
converted_options[:period_from] = options[:period_from].strftime("%Y-%m-%d") if not options[:period_from].is_a?(String)
|
139
|
+
converted_options[:period_to] = options[:period_to].strftime("%Y-%m-%d") if not options[:period_from].is_a?(String)
|
140
|
+
|
141
|
+
return converted_options
|
142
|
+
end
|
143
|
+
|
70
144
|
def agent
|
71
|
-
@agent
|
145
|
+
return @agent if not @agent.nil?
|
146
|
+
@agent = Mechanize.new
|
147
|
+
@agent.pluggable_parser.default = Mechanize::Download
|
148
|
+
return @agent
|
72
149
|
end
|
73
150
|
|
74
151
|
end
|
data/lib/voys_api/version.rb
CHANGED
data/voys_api.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voys_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-02-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: active_support
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
description: Export calls from http://www.voys.nl.
|
63
79
|
email:
|
64
80
|
- joost@joopp.com
|
@@ -97,9 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
113
|
version: '0'
|
98
114
|
requirements: []
|
99
115
|
rubyforge_project:
|
100
|
-
rubygems_version: 1.8.
|
116
|
+
rubygems_version: 1.8.23
|
101
117
|
signing_key:
|
102
118
|
specification_version: 3
|
103
119
|
summary: Export calls from http://www.voys.nl.
|
104
120
|
test_files: []
|
105
|
-
has_rdoc:
|