欢迎转载,但请注意,除非特别声明,本站采用许可:署名,非商业。需要联系我可发邮件至
  • 1 
预览模式: 普通 | 列表

Ruby HTTP简单应用—下载Bitrac皮肤

关键词:ruby HTTP 下载页面

本文涉及
1.ruby iconv的使用
2.ruby http页面下载
3.新建目录
4.写文本文件和二进制文件
5.正则表达式
6.命令行参数传递

一、问题来源
找Loveyuki要皮肤未果,只有发扬自力更生精神,写一个获取皮肤的工具。
要知道什么是Bitrac,请看这里http://www.loveyuki.com/Article/Bitrac_Alpha_Update_List.aspx
二、安装ruby
下载http://rubyforge.org/frs/download.php/29263/ruby186-26.exe
想了解更多关于ruby的东西,看这里
三、下载皮肤的ruby源代码
  1. #Albert
  2. #www.albertsong.com
  3. #2008-6-9
  4. require 'net/http'
  5. require 'iconv'
  6.  
  7. #皮肤文件名及编码
  8. arr_file_name=[
  9. ["Archive.htm","UTF-16LE"],
  10. ["Artcomm.htm","ISO-8859-1"],
  11. ["Article.htm","ISO-8859-1"],
  12. ["Comment.htm","ISO-8859-1"],
  13. ["Counter.htm","ISO-8859-1"],
  14. ["Default.htm","UTF-8"],
  15. ["Folders.htm","UTF-16LE"],
  16. ["Footer.htm","UTF-8"],
  17. ["Header.htm","UTF-8"],
  18. ["Labels.htm","UTF-16LE"],
  19. ["Recomm.htm","UTF-16LE"],
  20. ["Search.htm","UTF-16LE"],
  21. ["Theme.css","UTF-8"],
  22. ["Theme.js","UTF-8"]
  23. ]
  24. #
  25. if ARGV.length<1 then
  26.   puts "USAGE: ruby get_bitrac_theme.rb www.yourdomain.com"
  27.   exit
  28. end
  29. #建立http连接
  30. h = Net::HTTP.new(ARGV[0], 80)
  31. resp, data = h.get("/", nil )
  32. if resp.code != "200" then
  33.     puts "Code = #{resp.code}"
  34.     puts "Message = #{resp.message}"
  35.     exit
  36. end
  37. #取得皮肤名称
  38. if data =~/Themes\/(.*)\/Theme.js/ then
  39.     puts "Theme is #{$1}"
  40.     theme_name=$1
  41.     if !FileTest.exist?(theme_name) then
  42.         Dir.mkdir theme_name
  43.     end
  44.     if !FileTest.exist?("#{theme_name}/Images") then
  45.         Dir.mkdir "#{theme_name}/Images"
  46.     end
  47. else
  48.     puts "This is not a Bitrac powered blog."
  49. end
  50. #取得模板文件
  51. arr_file_name.each{|file_name|
  52.     puts "get /Themes/#{theme_name}/#{file_name[0]}"
  53.     resp, data = h.get("/Themes/#{theme_name}/#{file_name[0]}", nil )
  54.     if resp.code == "200" then
  55.         data = Iconv.conv("UTF-8",file_name[1],data)
  56.         o_file = File.new("#{theme_name}/#{file_name[0]}", "w")
  57.         o_file.puts data
  58.         o_file.close
  59.     else
  60.         puts "/Themes/#{theme_name}/#{file_name[0]} not found."
  61.     end
  62. }
  63. #取得图像文件
  64. resp, data = h.get("/Themes/#{theme_name}/Theme.css", nil )
  65. data.gsub(/Images\/(.*)\.(gif|png|jpg)/){|match|
  66.     puts "get /Themes/#{theme_name}/#{match}"
  67.     resp, image_data = h.get("/Themes/#{theme_name}/#{match}", nil )
  68.     if resp.code == "200" then
  69.         File.open("#{theme_name}/#{match}", "wb"){|o_file|
  70.             o_file.print image_data
  71.         }
  72.     else
  73.         puts "/Themes/#{theme_name}/#{match} not found. "
  74.     end
  75. }

打包后的在这里下载下载文件get_bitrac_theme.zip (44.65 KB , 下载:150次)。
只要安装了ruby,就可以直接运行压缩包里的run.bat下载loveyuki.com的皮肤,如果要下载其它blog的,修改run.bat就可以了。
四、问题
1、没有找到好的判断获取的页面的文本编码的方法,现在是写死的,用起来不方便。
      使用时可以将get_bitrac_theme.rb中的
      data = Iconv.conv("UTF-8",file_name[1],data)前面加上#,注释掉,然后执行。
     下载的文件如有乱码,通过能识别编码的文本编辑器识别后再修改定义的数组,取消注释,再次执行。
2、没有对图片文件是不是已经下载过进行判断,所以有的文件会下载几次,对ruby不熟,不知道有什么好的方法存储不重复的文件名。
      并且只下载了.css中的图片,虽然目前这样做没有问题。
3、没有对异常进行处理,超时等会导致程序终止。这没什么,再执行一遍即可。
总之,不好用!明天用C#写一个好用的。
标签: Ruby HTTP Bitrac
  • 1