rfetion 0.3.14 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +15 -11
- data/VERSION +1 -1
- data/lib/rfetion.rb +1 -0
- data/lib/rfetion/command.rb +21 -15
- data/lib/rfetion/fetion.rb +71 -26
- data/rfetion.gemspec +2 -2
- metadata +2 -2
data/README.textile
CHANGED
@@ -21,14 +21,9 @@ gem install rfetion
|
|
21
21
|
|
22
22
|
h2. Usage
|
23
23
|
|
24
|
-
send sms to yourself
|
24
|
+
send sms to friends or yourself
|
25
25
|
<pre><code>
|
26
|
-
Fetion.
|
27
|
-
</code></pre>
|
28
|
-
|
29
|
-
send sms to friends
|
30
|
-
<pre><code>
|
31
|
-
Fetion.send_sms_to_friends(mobile_no, password, friends_mobile_or_fetion_number, content)
|
26
|
+
Fetion.send_sms(mobile_no, password, mobile_or_fetion_numbers, content)
|
32
27
|
</code></pre>
|
33
28
|
|
34
29
|
add friend with mobile
|
@@ -41,6 +36,13 @@ add friend with sip
|
|
41
36
|
Fetion.add_buddy_with_sip(mobile_no, password, friend_sip)
|
42
37
|
</code></pre>
|
43
38
|
|
39
|
+
send schedule sms to friends
|
40
|
+
<pre><code>
|
41
|
+
Fetion.schedule_sms(mobile_no, password, mobile_or_fetion_number, content, time)
|
42
|
+
</code></pre>
|
43
|
+
|
44
|
+
Time format is %Y-%m-%d %H:%M:%S
|
45
|
+
|
44
46
|
**************************************************************************
|
45
47
|
|
46
48
|
h2. Shell command
|
@@ -50,20 +52,22 @@ you can use it in shell command directly
|
|
50
52
|
<pre><code>
|
51
53
|
Usage: rfetion [options]
|
52
54
|
|
53
|
-
Example: rfetion -m mobile -p password -
|
54
|
-
|
55
|
+
Example: rfetion -m mobile -p password -c sms_content
|
56
|
+
rfetion -m mobile -p password -r mobile_or_fetion_numbers -c sms_content
|
57
|
+
rfetion -m mobile -p password -r mobile_or_fetion_numbers -c sms_content -t time
|
55
58
|
rfetion -m mobile -p password --add-buddy-with-mobile friend_mobile
|
56
|
-
|
57
59
|
rfetion -m mobile -p password --add-buddy-with-sip friend_sip
|
58
60
|
|
59
61
|
-m, --mobile MOBILE Fetion mobile number
|
60
62
|
-p, --password PASSWORD Fetion password
|
61
63
|
-c, --content CONTENT Fetion message content
|
62
|
-
-
|
64
|
+
-r, --receivers MOBILE,SIP (optional) Receivers' Fetion mobile numbers or fetion sip numbers, if no recievers, send sms to yourself
|
65
|
+
-t, --time TIME Schedule time to send sms, format is "2009-12-10 20:00:00"
|
63
66
|
--add-buddy-with-mobile MOBILE
|
64
67
|
Add friend mobile as fetion friend
|
65
68
|
--add-buddy-with-sip SIP Add friend fetion sip as fetion friend
|
66
69
|
|
70
|
+
|
67
71
|
different mode:
|
68
72
|
--debug debug mode
|
69
73
|
--silence silence mode
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/rfetion.rb
CHANGED
data/lib/rfetion/command.rb
CHANGED
@@ -8,34 +8,40 @@ OptionParser.new do |opts|
|
|
8
8
|
|
9
9
|
opts.separator ""
|
10
10
|
opts.separator <<-EOF
|
11
|
-
Example: rfetion -m mobile -p password -
|
11
|
+
Example: rfetion -m mobile -p password -c sms_content
|
12
|
+
rfetion -m mobile -p password -r mobile_or_fetion_numbers -c sms_content
|
13
|
+
rfetion -m mobile -p password -r mobile_or_fetion_numbers -c sms_content -t time
|
12
14
|
rfetion -m mobile -p password --add-buddy-with-mobile friend_mobile
|
13
15
|
rfetion -m mobile -p password --add-buddy-with-sip friend_sip
|
16
|
+
|
14
17
|
EOF
|
15
18
|
|
16
19
|
opts.on('-m', '--mobile MOBILE', 'Fetion mobile number') do |mobile|
|
17
20
|
options[:mobile_no] = mobile
|
18
21
|
end
|
19
22
|
|
20
|
-
opts.on('-p', '--password PASSWORD', 'Fetion password') do |
|
21
|
-
options[:password] =
|
23
|
+
opts.on('-p', '--password PASSWORD', 'Fetion password') do |password|
|
24
|
+
options[:password] = password
|
22
25
|
end
|
23
26
|
|
24
|
-
opts.on('-c', '--content CONTENT', 'Fetion message content') do |
|
25
|
-
options[:content] =
|
27
|
+
opts.on('-c', '--content CONTENT', 'Fetion message content') do |content|
|
28
|
+
options[:content] = content
|
26
29
|
end
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
options[:friends] = f
|
31
|
+
opts.on('-r', '--receivers MOBILE,SIP', Array, "(optional) Receivers' Fetion mobile numbers or fetion sip numbers, if no recievers, send sms to yourself") do |receivers|
|
32
|
+
options[:receivers] = receivers
|
31
33
|
end
|
32
34
|
|
33
|
-
opts.on('
|
34
|
-
options[:
|
35
|
+
opts.on('-t', '--time TIME', 'Schedule time to send sms, format is "2009-12-10 20:00:00"') do |time|
|
36
|
+
options[:time] = time
|
35
37
|
end
|
36
38
|
|
37
|
-
opts.on('--add-buddy-with-
|
38
|
-
options[:
|
39
|
+
opts.on('--add-buddy-with-mobile MOBILE', 'Add friend mobile as fetion friend') do |mobile|
|
40
|
+
options[:add_mobile] = mobile
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on('--add-buddy-with-sip SIP', 'Add friend fetion sip as fetion friend') do |sip|
|
44
|
+
options[:add_sip] = sip
|
39
45
|
end
|
40
46
|
|
41
47
|
opts.separator ""
|
@@ -80,10 +86,10 @@ begin
|
|
80
86
|
end
|
81
87
|
|
82
88
|
raise FetionException.new('You must input your mobile number, password and content') unless options[:mobile_no] and options[:password] and options[:content]
|
83
|
-
if options[:
|
84
|
-
Fetion.
|
89
|
+
if options[:time]
|
90
|
+
Fetion.schedule_sms(options[:mobile_no], options[:password], options[:receivers], options[:content], options[:time], level(options))
|
85
91
|
else
|
86
|
-
Fetion.
|
92
|
+
Fetion.send_sms(options[:mobile_no], options[:password], options[:receivers], options[:content], level(options))
|
87
93
|
end
|
88
94
|
rescue FetionException => e
|
89
95
|
puts e.message
|
data/lib/rfetion/fetion.rb
CHANGED
@@ -30,20 +30,31 @@ class Fetion
|
|
30
30
|
@cat = cat
|
31
31
|
end
|
32
32
|
|
33
|
-
def Fetion.
|
33
|
+
def Fetion.send_sms(mobile_no, password, receivers, content, level = Logger::INFO)
|
34
34
|
fetion = Fetion.new
|
35
35
|
fetion.logger_level = level
|
36
36
|
fetion.mobile_no = mobile_no
|
37
37
|
fetion.password = password
|
38
38
|
fetion.login
|
39
39
|
fetion.register
|
40
|
-
|
40
|
+
if receivers
|
41
|
+
receivers = Array(receivers)
|
42
|
+
receivers.collect! {|receiver| receiver.to_s}
|
43
|
+
fetion.get_buddy_list
|
44
|
+
fetion.get_contacts_info
|
45
|
+
fetion.contacts.each do |contact|
|
46
|
+
if receivers.include? contact.mobile_no.to_s or receivers.any? { |receiver| contact.uri.index(receiver) }
|
47
|
+
fetion.send_sms(contact.uri, content)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
fetion.send_sms(fetion.uri, content) if receivers.any? { |receiver| fetion.self? receiver }
|
51
|
+
else
|
52
|
+
fetion.send_sms(fetion.uri, content)
|
53
|
+
end
|
41
54
|
fetion.logout
|
42
55
|
end
|
43
56
|
|
44
|
-
def Fetion.
|
45
|
-
friends = Array(friends)
|
46
|
-
friends.collect! {|friend| friend.to_s}
|
57
|
+
def Fetion.schedule_sms(mobile_no, password, receivers, content, time, level = Logger::INFO)
|
47
58
|
fetion = Fetion.new
|
48
59
|
fetion.logger_level = level
|
49
60
|
fetion.mobile_no = mobile_no
|
@@ -52,10 +63,18 @@ class Fetion
|
|
52
63
|
fetion.register
|
53
64
|
fetion.get_buddy_list
|
54
65
|
fetion.get_contacts_info
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
66
|
+
if receivers
|
67
|
+
receivers = Array(receivers)
|
68
|
+
receivers.collect! {|receiver| receiver.to_s}
|
69
|
+
new_receivers = fetion.contacts.collect do |contact|
|
70
|
+
if receivers.include? contact.mobile_no.to_s or receivers.any? { |receiver| contact.uri.index(receiver) }
|
71
|
+
contact.uri
|
72
|
+
end
|
73
|
+
end.compact!
|
74
|
+
new_receivers << fetion.uri if receivers.any? { |receiver| fetion.self? receiver }
|
75
|
+
fetion.schedule_sms(new_receivers, content, time)
|
76
|
+
else
|
77
|
+
fetion.schedule_sms([fetion.uri], content, time)
|
59
78
|
end
|
60
79
|
fetion.logout
|
61
80
|
end
|
@@ -122,7 +141,7 @@ class Fetion
|
|
122
141
|
def register
|
123
142
|
@logger.info "fetion http register"
|
124
143
|
call = next_call
|
125
|
-
arg = '<args><device type="PC" version="
|
144
|
+
arg = '<args><device type="PC" version="284488270" client-version="3.2.0540" /><caps value="simple-im;im-session;temp-group;personal-group;im-relay;xeno-im;direct-sms;sms2fetion" /><events value="contact;permission;system-message;personal-group;compact" /><user-info attributes="all" /><presence><basic value="400" desc="" /></presence></args>'
|
126
145
|
|
127
146
|
register_first(call, arg)
|
128
147
|
|
@@ -172,14 +191,15 @@ class Fetion
|
|
172
191
|
|
173
192
|
def get_buddy_list
|
174
193
|
@logger.info "fetion get buddy list"
|
175
|
-
arg = '<args><contacts><buddy-lists /><buddies attributes="all" /><mobile-buddies attributes="all" /><chat-friends /><blacklist /></contacts></args>'
|
194
|
+
arg = '<args><contacts><buddy-lists /><buddies attributes="all" /><mobile-buddies attributes="all" /><chat-friends /><blacklist /><allow-list /></contacts></args>'
|
176
195
|
msg = sip_create('S fetion.com.cn SIP-C/2.0', {'F' => @sid, 'I' => next_call, 'Q' => '1 S', 'N' => 'GetContactList'}, arg) + FETION_SIPP
|
177
196
|
curl_exec(next_url, @ssic, msg)
|
178
197
|
response = curl_exec(next_url, @ssic, FETION_SIPP)
|
179
198
|
raise FetionException.new("Fetion Error: Get buddy list error") unless response.is_a? Net::HTTPSuccess
|
180
199
|
|
181
|
-
response.body.
|
182
|
-
|
200
|
+
doc = REXML::Document.new(response.body.chomp(FETION_SIPP))
|
201
|
+
doc.elements.each("results/contacts/allow-list/contact") do |contact|
|
202
|
+
@buddies << {:uri => contact.attributes["uri"]}
|
183
203
|
end
|
184
204
|
@logger.debug "buddies: #{@buddies.inspect}"
|
185
205
|
@logger.info "fetion get buddy list success"
|
@@ -187,7 +207,7 @@ class Fetion
|
|
187
207
|
|
188
208
|
def get_contacts_info
|
189
209
|
@logger.info "fetion get contacts info"
|
190
|
-
arg = '<args><contacts attributes="
|
210
|
+
arg = '<args><contacts attributes="provisioning;impresa;mobile-no;nickname;name;gender;portrait-crc;ivr-enabled" extended-attributes="score-level">'
|
191
211
|
@buddies.each do |buddy|
|
192
212
|
arg += "<contact uri=\"#{buddy[:uri]}\" />"
|
193
213
|
end
|
@@ -195,28 +215,49 @@ class Fetion
|
|
195
215
|
|
196
216
|
msg = sip_create('S fetion.com.cn SIP-C/2.0', {'F' => @sid, 'I' => next_call, 'Q' => '1 S', 'N' => 'GetContactsInfo'}, arg) + FETION_SIPP
|
197
217
|
curl_exec(next_url, @ssic, msg)
|
198
|
-
|
199
|
-
|
218
|
+
while true do
|
219
|
+
sleep 1
|
220
|
+
response = curl_exec(next_url, @ssic, FETION_SIPP)
|
221
|
+
raise FetionException.new("Fetion Error: Get contacts info error") unless response.is_a? Net::HTTPSuccess
|
222
|
+
break if response.body.size > FETION_SIPP.size
|
223
|
+
end
|
200
224
|
|
201
|
-
response.body.
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
@contacts << Contact.new(contact.attributes["uri"], attrs)
|
206
|
-
end
|
225
|
+
doc = REXML::Document.new(response.body.chomp(FETION_SIPP))
|
226
|
+
doc.elements.each("results/contacts/contact") do |contact|
|
227
|
+
attrs = contact.children.size == 0 ? {} : contact.children.first.attributes
|
228
|
+
@contacts << Contact.new(contact.attributes["uri"], attrs)
|
207
229
|
end
|
208
230
|
@logger.debug @contacts.inspect
|
209
231
|
@logger.info "fetion get contacts info success"
|
210
232
|
end
|
211
233
|
|
212
|
-
def send_sms(
|
213
|
-
@logger.info "fetion #{send_command} to #{
|
214
|
-
msg = sip_create('M fetion.com.cn SIP-C/2.0', {'F' => @sid, 'I' => next_call, 'Q' => '1 M', 'T' =>
|
234
|
+
def send_sms(receiver, content)
|
235
|
+
@logger.info "fetion #{send_command} to #{receiver}"
|
236
|
+
msg = sip_create('M fetion.com.cn SIP-C/2.0', {'F' => @sid, 'I' => next_call, 'Q' => '1 M', 'T' => receiver, 'N' => send_command}, content) + FETION_SIPP
|
215
237
|
curl_exec(next_url, @ssic, msg)
|
216
238
|
response = curl_exec(next_url, @ssic, FETION_SIPP)
|
217
239
|
|
218
240
|
raise FetionException.new("Fetion Error: Send sms error") unless response.is_a? Net::HTTPSuccess
|
219
|
-
@logger.info "fetion #{send_command} to #{
|
241
|
+
@logger.info "fetion #{send_command} to #{receiver} success"
|
242
|
+
end
|
243
|
+
|
244
|
+
def schedule_sms(receivers, content, time)
|
245
|
+
receivers = Array(receivers)
|
246
|
+
time = time.is_a?(Time) ? time : Time.parse(time)
|
247
|
+
now = Time.now
|
248
|
+
one_year = Time.local(now.year + 1, now.month, now.day, now.hour, now.min, now.sec)
|
249
|
+
raise FetionException.new("Can't schedule send sms to more than 32 receivers") if receivers.size > 32
|
250
|
+
raise FetionException.new("Schedule time must between #{(now + 600).strftime('%Y-%m-%d %H:%M:%S')} and #{one_year.strftime('%Y-%m-%d %H:%M:%S')}") if time < (now + 600) or time > one_year
|
251
|
+
@logger.info "fetion schedule send sms to #{receivers.join(', ')}"
|
252
|
+
|
253
|
+
receivers_str = receivers.collect { |receiver| %Q[<receiver uri="#{receiver}" />] }.join('')
|
254
|
+
arg = %Q{<args><schedule-sms send-time="#{time.getutc.strftime('%Y-%m-%d %H:%M:%S')}"><message>#{content}</message><receivers>#{receivers_str}</receivers></schedule-sms></args>}
|
255
|
+
msg = sip_create('S fetion.com.cn SIP-C/2.0', {'F' => @sid, 'I' => next_call, 'Q' => '1 S', 'N' => 'SSSetScheduleCatSms'}, arg) + FETION_SIPP
|
256
|
+
curl_exec(next_url, @ssic, msg)
|
257
|
+
response = curl_exec(next_url, @ssic, FETION_SIPP)
|
258
|
+
|
259
|
+
raise FetionException.new("Fetion Error: Schedule sms error") unless response.is_a? Net::HTTPSuccess
|
260
|
+
@logger.info "fetion schedule send sms to #{receivers.join(', ')} success"
|
220
261
|
end
|
221
262
|
|
222
263
|
def add_buddy_with_mobile(mobile, nickname = nil)
|
@@ -307,5 +348,9 @@ class Fetion
|
|
307
348
|
def send_command
|
308
349
|
@cat ? 'SendCatSMS' : 'SendSMS'
|
309
350
|
end
|
351
|
+
|
352
|
+
def self?(mobile_or_sid)
|
353
|
+
mobile_or_sid == @mobile_no or mobile_or_sid == @sid
|
354
|
+
end
|
310
355
|
end
|
311
356
|
|
data/rfetion.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rfetion}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Richard Huang"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-10}
|
13
13
|
s.description = %q{rfetion is a ruby gem for China Mobile fetion service that you can send SMS free.}
|
14
14
|
s.email = %q{flyerhzm@gmail.com}
|
15
15
|
s.executables = ["rfetion", "rfetion"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfetion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-10 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|