免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7723 | 回复: 14
打印 上一主题 下一主题

貌似用ruby写出的代码比perl还要短啊。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-08 13:09 |只看该作者 |倒序浏览
本帖最后由 kingwmj 于 2011-06-08 17:21 编辑

看了几个小程序,感觉比perl要短。
请高手用perl缩写如下代码,能更短一点吗?楼下的说原来那个太弱了,现在换了一个,据说是最小的飞信客户端,还能再小一点吗?
  1. #!/usr/bin/ruby
  2. # Using GPL v2
  3. # Author:: DongYuwei(mailto:newdongyuwei@gmail.com)
  4. # 更新部分内容应对2010年7月25日飞信升级

  5. require 'uri'
  6. require 'net/http'
  7. require 'net/https'
  8. require "socket"
  9. require 'rexml/document'
  10. require 'digest/md5'
  11. require 'digest/sha1'
  12. require "iconv"

  13. class Fetion
  14.         def initialize(phone_num , password)
  15.                 @phone_num = phone_num;
  16.                 @password = password;
  17.                 @domain = "fetion.com.cn";
  18.                 @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>';
  19.                 self.init
  20.         end
  21.        
  22.         def init
  23.                 doc = REXML::Document.new(self.get_system_config())
  24.                 sipc_proxy = ""
  25.                 doc.elements.each("//sipc-proxy") do |element|  # using regexp should be faster
  26.                         sipc_proxy = element.text
  27.                 end
  28.                 @SIPC = SIPC.new(sipc_proxy);
  29.                
  30.                 sipc_url = ""
  31.                 #ssi-app-sign-in
  32.                 doc.elements.each("//ssi-app-sign-in-v2") do |element|
  33.                         sipc_url = element.text
  34.                 end
  35.                 @fetion_num = self.get_fetion_num(self.SSIAppSignIn(sipc_url))
  36.         end
  37.        
  38.         def login()
  39.                 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)
  40.                 request1 = request1 + @login_xml
  41.                 server_response = @SIPC.request(request1)
  42.                 @nonce = server_response.scan(/nonce="(.*)"/)[0][0]
  43.                
  44.                 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)
  45.                 request2 = request2 + @login_xml
  46.                 @SIPC.request(request2)
  47.         end
  48.        
  49.         def send_sms(phone, sms_text)
  50.                 sms_text = Iconv.iconv("UTF-8","UTF-8",sms_text)[0]
  51.                 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)
  52.                 request = request + sms_text
  53.                 @SIPC.request(request)
  54.         end
  55.        
  56.         def send_sms_to_self(sms_text)
  57.                 sms_text = Iconv.iconv("UTF-8","UTF-8",sms_text)[0]
  58.                 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)
  59.                 request = request + sms_text
  60.                 @SIPC.request(request)
  61.         end

  62.         def logout()
  63.                 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)
  64.                 @SIPC.request(logout_request)
  65.         end
  66.        
  67.         def get_response()
  68.                 @cnonce = Digest::MD5.hexdigest(rand.to_s)
  69.                 key = Digest::MD5.digest(@fetion_num + ":" + @domain + ":" + @password)
  70.                 h1 = Digest::MD5.hexdigest(key + ":" + @nonce + ":" + @cnonce).upcase
  71.                 h2 = Digest::MD5.hexdigest("REGISTER:" + @fetion_num).upcase
  72.                 return Digest::MD5.hexdigest(h1+":" + @nonce + ":" + h2).upcase
  73.         end
  74.        
  75.         def get_system_config()
  76.                 uri = URI.parse("http://nav.fetion.com.cn/nav/getsystemconfig.aspx")
  77.                 http = Net::HTTP.new(uri.host, uri.port)
  78.                 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)
  79.                 headers = {
  80.                   'Content-Type' => 'application/x-www-form-urlencoded'
  81.                 }
  82.                 resp = http.post(uri.path, params, headers)
  83.                 return resp.body
  84.         end
  85.        
  86.         def SSIAppSignIn(url)
  87.                 uri = URI.parse(url)
  88.                 path = uri.path + "?mobileno=" + @phone_num + "&pwd=" + @password
  89.                 http = Net::HTTP.new(uri.host,uri.port)
  90.                 http.use_ssl = true
  91.                 http.verify_mode = OpenSSL::SSL::VERIFY_NONE # turn off SSL warning
  92.                 resp, xml = http.get(path, nil)
  93.                
  94.                 ok = "200"
  95.                 doc = REXML::Document.new(xml)
  96.                 doc.elements.each("//results") do|element|
  97.            ok = element.attribute("status-code").value
  98.        end
  99.        if ok != "200"#421 verification picture?
  100.             return self.SSIAppSignIn(url)
  101.        end
  102.                 return xml
  103.         end
  104.    
  105.         def get_fetion_num(xml)
  106.                 @uri = ""
  107.                 doc = REXML::Document.new(xml)
  108.                 doc.elements.each("//results/user") do |element|
  109.                   @uri = element.attribute("uri").value
  110.                 end       
  111.                 return @uri.scan(/sip:([0-9]+)@/)[0][0]
  112.         end
  113. end

  114. class SIPC
  115.         def initialize(sipc_addr)
  116.                 uri = sipc_addr.split(":")
  117.                 @socket = TCPSocket.new(uri[0], uri[1].to_i)
  118.         end

  119.         # send SIP request
  120.         def request(sip_request)
  121.                 puts sip_request
  122.                 @socket.write_nonblock(sip_request)
  123.                 #select read_nonblock and rescue is the key
  124.                 IO.select [@socket]
  125.                 res = ""
  126.                 begin
  127.                         while chunk = @socket.read_nonblock(4096)
  128.                                 res = res + chunk
  129.                         end
  130.                 rescue
  131.                         puts "Error: #{$!}"
  132.                 end
  133.                 puts res
  134.                 return res
  135.         end
  136. end

  137. #for test
  138. if __FILE__ == $0
  139.     fetion = Fetion.new("13651368727","password")
  140.     fetion.login()
  141.     fetion.send_sms_to_self("test-ruby-fetion")
  142.     #fetion.send_sms("mobileID","any sms")
  143. end
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-06-08 13:41 |只看该作者
看了几个小程序,感觉比perl要短。
kingwmj 发表于 2011-06-08 13:09



    越是过度封装的语言,越是短小。
ruby是天生为OO而写的高级语言,短小正常。

论坛徽章:
0
3 [报告]
发表于 2011-06-08 14:04 |只看该作者
那就让Perl高手来写个,看看哪个短?

论坛徽章:
0
4 [报告]
发表于 2011-06-08 16:29 |只看该作者
回复 3# 2gua


    找了一个比较短的ruby 端口扫描的,perl高手来缩写啊。

论坛徽章:
0
5 [报告]
发表于 2011-06-08 16:49 |只看该作者
回复  2gua


    找了一个比较短的ruby 端口扫描的,perl高手来缩写啊。
kingwmj 发表于 2011-06-08 16:29



    faint,这种代码用perl写一个更短的轻而易举。甚至想不比它短都难。

论坛徽章:
0
6 [报告]
发表于 2011-06-08 16:51 |只看该作者
本帖最后由 zuerrong 于 2011-06-08 16:52 编辑

发重复了。

论坛徽章:
0
7 [报告]
发表于 2011-06-08 16:51 |只看该作者
使用了诸如sinatra框架的ruby代码短小而强大,才是perl无法比拟的。

论坛徽章:
0
8 [报告]
发表于 2011-06-08 17:17 |只看该作者
使用了诸如sinatra框架的ruby代码短小而强大,才是perl无法比拟的。
zuerrong 发表于 2011-06-08 16:51


你把这个弄来,看一看啊。我水平太低,不懂啊。

论坛徽章:
0
9 [报告]
发表于 2011-06-08 17:20 |只看该作者
  1. require 'rubygems'
  2. require 'sinatra'

  3. def hello_world
  4.     "hello world"
  5. end

  6. get '/' do
  7.     hello_world
  8. end
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2011-06-08 17:20 |只看该作者
其实 Perler 看到这个问题第一个想法应该是:这么通用的功能应该有个模块吧?于是 goole cpan port scan
第一行就是。然后

cpan POE::Component::Client::TCP::Muti

然后就有了个  portscan.pl 还带命令行参数的

Ruby 强在抽象,这种小而精的事在 Perl
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP