之前在写一个一键听课的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
这次就先这样子吧