ruby网络编程调试

之前在写一个一键听课的ruby脚本 涉及到一些网络交互的 中间也是遇到了一些问题 在网上看到的资料都比较少 比较难找 所以就想把自己遇到的问题和解决的方法记录一下。 也是拖得比较久 一直在考试 到最近闲下来 放假了 可以做点自己的事情了。

Ox1
先来看一个get的 可以在headers里加入http头信息

require 'net/http'

headers = {   ##定义http请求头信息
  'Accept' => '*/*',
  'Referer' => 'http://sso.jincin.com/'
}

#要访问的网页host
uri = URI.parse("http://cuit.jincin.com")

#创建服务器对象
res = Net::HTTP::start(uri.host){|http|
   http.get(uri.path+'/student/my/welcome/welcome.htm', headers)
}

#返回响应头信息
res.each{|key, value| puts "#{key} = #{value}"}

#输出response的内容
puts res.body

核心的一句

res = Net::HTTP::start(uri.host){|http|
   http.get(url, headers)#第一个参数是 完整的url
   #第二个参数是一个hash的结构 存储着http头的信息
}

Ox02
再来看一下 post的类型 访问

require 'net/http'

headers = {   ##定义http请求头信息
  'Host' => 'sso.jincin.com'
}

#要访问的域名
uri = URI.parse("http://sso.jincin.com")

#创建服务器对象
res = Net::HTTP::start(uri.host){|http|
   http.post(uri.path+'/handleTrans.cdo?strServiceName=UserService&strTransName=SSOLogin', 
   'id=1&password=123456',
   headers)
}

#返回响应头信息
res.each{|key, value| puts "#{key} = #{value}"}

#输出response的内容
puts res.body

核心的一句话

res = Net::HTTP::start(uri.host){|http|
   http.post(url, #访问的完整url
   post内容, #post的内容
   headers)#http头
}

Ox03
在编程的时候 肯定会有调试的情况 而且也是重点
在遇到这种网络编程的时候 然后只是靠 puts 输出这样子来看信息的话 看到的信息不完整 可能会有遗漏
所以可以通过抓包的方式来查看发包收包的信息

一种方法是用代理 走代理 访问走8080端口 然后再用burp suite 抓包看一下完整的包
还有一种方法是 本地开一个抓包的工具 比如用fiddler 或者是用SmartSniff这种工具来抓取全局的包 然后 看那些TCP协议的包 就会有自己刚刚发出去的
下面介绍一下第一种方法 在ruby下用代理

require 'net/http'

headers = {   ##定义http请求头信息
  'Accept-Language' => 'zh-cn'
  }

proxy_addr = '127.0.0.1'
proxy_port = 8080

#要访问的网页地址
uri = URI.parse("http://www.rubyinside.com")

#创建代理服务器对象
res = Net::HTTP::Proxy(proxy_addr, proxy_port).start(uri.host){|http|
  http.post(uri.path+'/test.cgi', 'name=a&age=a', headers)
}

puts res.body

其实只是在原来的基础上加上了 Proxy(proxy_addr, proxy_port) 这样子 然后之前先确定一下要代理的ip和端口 自己调试的话 用127.0.0.1:8080就可以了 然后 再burp suite里设置监听8080端口就可以看到发包收包了

Ox04
调试中还遇到的一个大问题就是编码的问题 一直在纠结utf-8 unicode 什么的
其实 遇到了utf-8的页面还是比较好解决的 因为ruby下 就可以使用utf-8编码 问题不是很大

编程中间遇到的一个问题 让我纠结了一阵 就是 一个页面 过burp代理是正常的 然后 自己在最后整合所有文件 去除那些代理调试的时候 发现报错了
出了乱码 我去研究了一阵 以为是编码出了问题 后来通过全局抓包的方式才发现 是gzip压缩的问题
我读取乱码 前几个字节为:1F 8B 08 ,其中1F 8B表明为gzip压缩,而08表示为deflate压缩。 这个可以通过百度一下知道
那遇到了gzip压缩过的信息 就要这样子处理

require 'net/http'
require 'zlib'
require 'stringio'

headers = {   ##定义http请求头信息
  'Host' => 'cuit.jincin.com',
  'Accept-Encoding' => 'gzip, deflate',#进行了gzip的默认压缩  
   #所以对于返回的结果 就要先进行解压才能识别
  'Connection' => 'keep-alive' 
}


#要访问的网页地址
uri = URI.parse("http://cuit.jincin.com")

#创建服务器对象
res = Net::HTTP::start(uri.host){|http|
   http.get('/student/prese/teachplan/conciselist.htm?id=iframe_prese_teachplan&nServiceId=0', headers)
}

str = res.body #未解压的字符串

#解压gzip
body_io=StringIO.new(str)
unzipped_body=Zlib::GzipReader.new(body_io).read 

puts unzipped_body #输出解压后的body

Ox05
在处理一些 网页啊 或者是字符串的过程中 正则表达式都是个利器 所以也是要好好去研究一下正则表达式 最近也是在看正则表达式的书
在这个处理的过程中 也是 用到了 正则表达式来提取一下 网页信息

reg =  /(\S+)\s*=\s*(.*?);$/ #正则表达式    以=号分隔的 并且以;结尾的字符串 
arr = unzipped_body.force_encoding("UTF-8").split(" ") #将之前解压的body 用空格分隔成数组  
#因为是utf-8的编程 所以加上force_encoding("UTF-8")来忽视编码

arr.size.times  do |t|     
  arr[t].scan(reg)
  if 'arr["lSchoolId"]'== $1  #$1会储存分割后=号左边的信息 进行了if 匹配判断了一下
    $schoolid = $2 #$2会储存分割后=号右边的信息
  end
end

可以改写正则表达式 在达到各种处理文本的目的

最后就是 一个 GUI界面的问题 比较蛋疼 所以就以后再单独写吧 GUI也是虐了我好久的一个问题
tk gtk wxruby 各种乱虐我 T.T
这次就先这样子吧

发表评论

*