|
1
|
|
|
#!ruby |
|
2
|
|
|
|
|
3
|
|
|
require 'multi_json' |
|
4
|
|
|
require 'ringcentral_sdk' |
|
5
|
|
|
require 'pp' |
|
6
|
|
|
|
|
7
|
|
|
# Set your credentials in the test credentials file |
|
8
|
|
|
|
|
9
|
|
|
class RingCentralSdkBootstrap |
|
10
|
|
|
attr_reader :credentials |
|
11
|
|
|
|
|
12
|
|
|
def load_credentials(credentials_filepath, usage_string=nil) |
|
13
|
|
|
unless credentials_filepath.to_s.length>0 |
|
14
|
|
|
raise usage_string.to_s |
|
15
|
|
|
end |
|
16
|
|
|
|
|
17
|
|
|
unless File.exists?(credentials_filepath.to_s) |
|
18
|
|
|
raise "Error: credentials file does not exist for: #{credentials_filepath}" |
|
19
|
|
|
end |
|
20
|
|
|
|
|
21
|
|
|
@credentials = MultiJson.decode(IO.read(credentials_filepath), :symbolize_keys=>true) |
|
22
|
|
|
end |
|
23
|
|
|
|
|
24
|
|
|
def get_sdk_with_token(env=:sandbox, app_index=0, resource_owner_index=0) |
|
25
|
|
|
credentials = @credentials |
|
26
|
|
|
|
|
27
|
|
|
app_index = 0 unless app_index |
|
28
|
|
|
resource_owner_index = 0 unless resource_owner_index |
|
29
|
|
|
|
|
30
|
|
|
if app_index.to_s =~ /^[0-9]+$/ |
|
31
|
|
|
app_index = app_index.to_i if app_index.is_a?(String) |
|
32
|
|
|
else |
|
33
|
|
|
app_index = 0 |
|
34
|
|
|
end |
|
35
|
|
|
|
|
36
|
|
|
if resource_owner_index.to_s =~ /^[0-9]+$/ |
|
37
|
|
|
resource_owner_index = resource_owner_index.to_i if resource_owner_index.is_a?(String) |
|
38
|
|
|
else |
|
39
|
|
|
resource_owner_index = 0 |
|
40
|
|
|
end |
|
41
|
|
|
|
|
42
|
|
|
rcsdk = RingCentralSdk.new( |
|
43
|
|
|
credentials[env][:applications][app_index][:app_key], |
|
44
|
|
|
credentials[env][:applications][app_index][:app_secret], |
|
45
|
|
|
credentials[env][:api][:server] |
|
46
|
|
|
) |
|
47
|
|
|
|
|
48
|
|
|
rcsdk.authorize( |
|
49
|
|
|
credentials[env][:resource_owners][resource_owner_index][:username], |
|
50
|
|
|
credentials[env][:resource_owners][resource_owner_index][:extension], |
|
51
|
|
|
credentials[env][:resource_owners][resource_owner_index][:password], |
|
52
|
|
|
) |
|
53
|
|
|
|
|
54
|
|
|
return rcsdk |
|
55
|
|
|
end |
|
56
|
|
|
|
|
57
|
|
|
end |
|
58
|
|
|
|
|
59
|
|
|
boot = RingCentralSdkBootstrap.new |
|
60
|
|
|
boot.load_credentials(ARGV.shift, 'Usage: call-recording_download.rb path/to/credentials.json') |
|
61
|
|
|
rcsdk = boot.get_sdk_with_token(:sandbox, ARGV.shift, ARGV.shift) |
|
62
|
|
|
|
|
63
|
|
|
module VoiceBase |
|
64
|
|
|
class Client |
|
65
|
|
|
def initialize(api_key, password, transcript_type='machine-best') |
|
66
|
|
|
@api_key = api_key |
|
67
|
|
|
@password = password |
|
68
|
|
|
@transcript_type = transcript_type |
|
69
|
|
|
@conn = Faraday.new(:url => 'https://api.voicebase.com/services') do |faraday| |
|
70
|
|
|
faraday.request :url_encoded # multipart/form-data |
|
71
|
|
|
faraday.response :json |
|
72
|
|
|
faraday.response :logger # log requests to STDOUT |
|
73
|
|
|
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP |
|
74
|
|
|
end |
|
75
|
|
|
end |
|
76
|
|
|
|
|
77
|
|
|
def upload_media(opts={}) |
|
78
|
|
|
params = { |
|
79
|
|
|
:version => '1.1', |
|
80
|
|
|
:apikey => @api_key, |
|
81
|
|
|
:password => @password, |
|
82
|
|
|
:action => 'uploadMedia', |
|
83
|
|
|
:title => DateTime.now.strftime('%Y-%m-%d %I:%M:%S %p'), |
|
84
|
|
|
:transcriptType => @transcript_type, |
|
85
|
|
|
:desc => 'file description', |
|
86
|
|
|
:recordedDate => DateTime.now.strftime('%Y-%m-%d %I:%M:%S'), |
|
87
|
|
|
:collection => '', |
|
88
|
|
|
:public => false, |
|
89
|
|
|
:sourceUrl => '', |
|
90
|
|
|
:lang => 'en', |
|
91
|
|
|
:imageUrl => '' |
|
92
|
|
|
} |
|
93
|
|
|
if opts.has_key?(:filepath) && opts.has_key?(:content_type) |
|
94
|
|
|
params[:file] = Faraday::UploadIO.new(filepath, content_type) |
|
95
|
|
|
elsif opts.has_key?(:mediaUrl) |
|
96
|
|
|
params[:mediaUrl] = opts[:mediaUrl] |
|
97
|
|
|
else |
|
98
|
|
|
raise "Neither file or mediaUrl have been set" |
|
99
|
|
|
end |
|
100
|
|
|
response = @conn.post '/services', params |
|
101
|
|
|
pp response |
|
102
|
|
|
puts response.body['fileUrl'] |
|
103
|
|
|
return response |
|
104
|
|
|
end |
|
105
|
|
|
end |
|
106
|
|
|
end |
|
107
|
|
|
|
|
108
|
|
|
|
|
109
|
|
|
def transcribe_recordings(rcsdk, vbsdk) |
|
110
|
|
|
# Retrieve voice call log records with recordings |
|
111
|
|
|
response = rcsdk.client.get do |req| |
|
112
|
|
|
params = {:type => 'Voice', :withRecording => 'True',:dateFrom=>'2015-01-01'} |
|
113
|
|
|
req.url 'account/~/extension/~/call-log', params |
|
114
|
|
|
end |
|
115
|
|
|
|
|
116
|
|
|
# Save recording and metadata for each call log record |
|
117
|
|
|
if response.body.has_key?('records') |
|
118
|
|
|
response.body['records'].each_with_index do |record,i| |
|
119
|
|
|
|
|
120
|
|
|
next unless record.has_key?('recording') && |
|
121
|
|
|
record['recording'].has_key?('contentUri') |
|
122
|
|
|
|
|
123
|
|
|
content_uri = record['recording']['contentUri'].to_s |
|
124
|
|
|
|
|
125
|
|
|
content_uri += '?access_token=' + rcsdk.token.token.to_s |
|
126
|
|
|
|
|
127
|
|
|
response_vb = vbsdk.upload_media({:mediaUrl => content_uri.to_s}) |
|
128
|
|
|
|
|
129
|
|
|
pp(response_vb.body) |
|
130
|
|
|
|
|
131
|
|
|
end |
|
132
|
|
|
end |
|
133
|
|
|
end |
|
134
|
|
|
|
|
135
|
|
|
vbsdk = VoiceBase::Client.new( |
|
136
|
|
|
boot.credentials[:voicebase][:api_key], |
|
137
|
|
|
boot.credentials[:voicebase][:password]) |
|
138
|
|
|
|
|
139
|
|
|
transcribe_recordings(rcsdk, vbsdk) |
|
140
|
|
|
|
|
141
|
|
|
puts "DONE" |