[转]Ruby上使用飞信的例子
由于我一直想学习下ruby,但又苦于没有时间和精力,以致到现在也没能真正的上手.
今天狂论坛时发现了个ruby使用Fetion的例子,感觉蛮简练的,更想不到的是,
试了下,直接运行就可以了,会向自己的号码发送一条测试短信!
注意要把最后的账户密码改成自己正确的才能用
#!/usr/bin/ruby
# Using GPL v2
# Author:: DongYuwei(mailto:newdongyuwei@gmail.com)
# 更新部分内容应对2010年7月25日飞信升级
require 'uri'
require 'net/http'
require 'net/https'
require "socket"
require 'rexml/document'
require 'digest/md5'
require 'digest/sha1'
require "iconv"
class Fetion
def initialize(phone_num , password)
@phone_num = phone_num;
@password = password;
@domain = "fetion.com.cn";
@login_xml = '<args><device type="PC" version="0" client-version="3.5.2540" /><caps value="simple-im;im-session;temp-group;personal-group" /><events value="contact;permission;system-message;personal-group" /><user-info attributes="all" /><presence><basic value="400" desc="" /></presence></args>';
self.init
end
def init
doc = REXML::Document.new(self.get_system_config())
sipc_proxy = ""
doc.elements.each("//sipc-proxy") do |element| # using regexp should be faster
sipc_proxy = element.text
end
@SIPC = SIPC.new(sipc_proxy);
sipc_url = ""
#ssi-app-sign-in
doc.elements.each("//ssi-app-sign-in-v2") do |element|
sipc_url = element.text
end
@fetion_num = self.get_fetion_num(self.SSIAppSignIn(sipc_url))
end
def login()
request1 = sprintf("R %s SIP-C/2.0\r\nF: %s\r\nI: 1\r\nQ: 1 R\r\nL: %s\r\n\r\n",@domain, @fetion_num, @login_xml.length)
request1 = request1 + @login_xml
server_response = @SIPC.request(request1)
@nonce = server_response.scan(/nonce="(.*)"/)[0][0]
request2 = sprintf("R %s SIP-C/2.0\r\nF: %s\r\nI: 1\r\nQ: 2 R\r\nA: Digest response=\"%s\",cnonce=\"%s\"\r\nL: %s\r\n\r\n", @domain, @fetion_num, self.get_response(), @cnonce, @login_xml.length)
request2 = request2 + @login_xml
@SIPC.request(request2)
end
def send_sms(phone, sms_text)
sms_text = Iconv.iconv("UTF-8","UTF-8",sms_text)[0]
request = sprintf("M %s SIP-C/2.0\r\nF: %s\r\nI: 2\r\nQ: 1 M\r\nT: tel:%s\r\nN: SendSMS\r\nL: %s\r\n\r\n",@domain, @fetion_num, phone, sms_text.length)
request = request + sms_text
@SIPC.request(request)
end
def send_sms_to_self(sms_text)
sms_text = Iconv.iconv("UTF-8","UTF-8",sms_text)[0]
request = sprintf("M %s SIP-C/2.0\r\nF: %s\r\nI: 2\r\nQ: 1 M\r\nT: %s\r\nN: SendCatSMS\r\nL: %s\r\n\r\n",@domain, @fetion_num, @uri, sms_text.length)
request = request + sms_text
@SIPC.request(request)
end
def logout()
logout_request = sprintf("R %s SIP-C/2.0\r\nF: %s\r\nI: 1 \r\nQ: 3 R\r\nX: 0\r\n\r\n", @domain, @fetion_num)
@SIPC.request(logout_request)
end
def get_response()
@cnonce = Digest::MD5.hexdigest(rand.to_s)
key = Digest::MD5.digest(@fetion_num + ":" + @domain + ":" + @password)
h1 = Digest::MD5.hexdigest(key + ":" + @nonce + ":" + @cnonce).upcase
h2 = Digest::MD5.hexdigest("REGISTER:" + @fetion_num).upcase
return Digest::MD5.hexdigest(h1+":" + @nonce + ":" + h2).upcase
end
def get_system_config()
uri = URI.parse("http://nav.fetion.com.cn/nav/getsystemconfig.aspx")
http = Net::HTTP.new(uri.host, uri.port)
params = sprintf('<config><user mobile-no="%s" /><client type="PC" version="3.5.2540" platform="W5.1" /><servers version="0" /><service-no version="0" /><parameters version="0" /><hints version="0" /><http-applications version="0" /><client-config version="0" /></config>',@phone_num)
headers = {
'Content-Type' => 'application/x-www-form-urlencoded'
}
resp = http.post(uri.path, params, headers)
return resp.body
end
def SSIAppSignIn(url)
uri = URI.parse(url)
path = uri.path + "?mobileno=" + @phone_num + "&pwd=" + @password
http = Net::HTTP.new(uri.host,uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # turn off SSL warning
resp, xml = http.get(path, nil)
ok = "200"
doc = REXML::Document.new(xml)
doc.elements.each("//results") do|element|
ok = element.attribute("status-code").value
end
if ok != "200"#421 verification picture?
return self.SSIAppSignIn(url)
end
return xml
end
def get_fetion_num(xml)
@uri = ""
doc = REXML::Document.new(xml)
doc.elements.each("//results/user") do |element|
@uri = element.attribute("uri").value
end
return @uri.scan(/sip:([0-9]+)@/)[0][0]
end
end
class SIPC
def initialize(sipc_addr)
uri = sipc_addr.split(":")
@socket = TCPSocket.new(uri[0], uri[1].to_i)
end
# send SIP request
def request(sip_request)
puts sip_request
@socket.write_nonblock(sip_request)
#select read_nonblock and rescue is the key
IO.select [@socket]
res = ""
begin
while chunk = @socket.read_nonblock(4096)
res = res + chunk
end
rescue
puts "Error: #{$!}"
end
puts res
return res
end
end
#for test
if __FILE__ == $0
fetion = Fetion.new("136********","password")
fetion.login()
fetion.send_sms_to_self("test-ruby-fetion")
#fetion.send_sms("mobileID","any sms")
end
出处的网页不小心关掉了,因为打开了一堆,印象中好像是CSDN的ruby版块.
Fri, 10 Nov 2017 20:33:40 -1100
Thanks for your sharing. Hope you can contribute more quality posts to this page. Thank you!
Tue, 27 Sep 2022 07:10:47 -1100
Every year the BSEB is provided the latest updated model question paper for intermediate Hindi Medium and English Medium students from past years old examination set wise question paper with expert answers to theory and objective type questions for all subjects of Hindi, English, Mathematics, Physics, Chemistry, Biology, Computer Science, Bihar Board 10th Hindi Question Paper Multimedia & Web Technology for BSEB Inter science stream students.