Project1

标题: 如何用Get_Http_Info读取的数据.... [打印本页]

作者: end55rpg    时间: 2013-8-2 19:50
标题: 如何用Get_Http_Info读取的数据....
本帖最后由 end55rpg 于 2013-8-2 20:29 编辑

求保存为文件并能正确查看(如png图片)的办法
试了好一会儿,估计俺不行了。。。
怎么保存这些下载的 为PNG0.0
作者: end55rpg    时间: 2013-8-2 21:53
本帖最后由 end55rpg 于 2013-8-2 21:55 编辑

@猪排 @羊排 @鸡排 @人排
@认真的学 @弗雷德 @satgo1546  
嗯,就这些人了吧,快来帮我哇哦嗷嗷!
如果你不帮。。。。难道乃们不会0.0  
作者: 弗雷德    时间: 2013-8-2 21:56
俺不会
另外Get_Http_Info不默认的方法吧……
反正网络,算法、外部文件神马的俺都不会,你能拿俺肿么样
@亿万星辰
召唤前辈解决。
作者: end55rpg    时间: 2013-8-2 21:58
本帖最后由 end55rpg 于 2013-8-2 22:18 编辑
弗雷德 发表于 2013-8-2 21:56
俺不会
另外Get_Http_Info不默认的方法吧……
反正网络,算法、外部文件神马的俺都不会,你能拿俺 ...


熊叔被干掉了,那位勇士来等死?
再召唤@Sion @feizhaodan @.....记不得了

再来4头,召唤P爷考场前四名四大高手帮我救世(拯救世界
@490832999@救世小树@ProfesstionR@Password   
作者: 亿万星辰    时间: 2013-8-2 22:23
试试直接用File.open打开一个文件,然后直接用write把整个数据写入,我曾经写过抓取blog网页中图片和文字的,就是用这样的方式。

另外你这只写个Get_Http_Info,不知道里面干了啥啊,要用猜的??
作者: Sion    时间: 2013-8-2 22:26
保存为PNG有现成的脚本吧。
作者: end55rpg    时间: 2013-8-2 22:27
亿万星辰 发表于 2013-8-2 22:23
试试直接用File.open打开一个文件,然后直接用write把整个数据写入,我曾经写过抓取blog网页中图片和文字的 ...

这位大神好快
= =俺就是File。open(x,x)。wirte的,html那些纯文字到可以,图音乐啥的 不行诶、
gethttpinfo里面没干啥就是防止10s而已。。。。


作者: 亿万星辰    时间: 2013-8-2 22:28
end55rpg 发表于 2013-8-2 22:27
这位大神好快
= =俺就是File。open(x,x)。wirte的,html那些纯文字到可以,图音乐啥的 不行诶、
getht ...

那你数据就没有取回来还谈何保存一说呢……{:2_270:}
作者: end55rpg    时间: 2013-8-2 22:31
亿万星辰 发表于 2013-8-2 22:28
那你数据就没有取回来还谈何保存一说呢……

两位大神夹击我。。
我取得了呀,主楼那里就是数据- -
作者: 490832999    时间: 2013-8-2 22:36
end55rpg 发表于 2013-8-2 21:58
熊叔被干掉了,那位勇士来等死?
再召唤@Sion @feizhaodan @.....记不得了

这东西不会呢...可能要用到gdi32

AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作
AngleArc 用一个连接弧画一条线
Arc 画一个圆弧
BeginPath 启动一个路径分支
CancelDC 取消另一个线程里的长时间绘图操作
Chord 画一个弦
CloseEnhMetaFile 关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄
CloseFigure 描绘到一个路径时,关闭当前打开的图形
CloseMetaFile 关闭指定的图元文件设备场景,并向新建的图元文件返回一个句柄
CopyEnhMetaFile 制作指定增强型图元文件的一个副本(拷贝)
CopyMetaFile 制作指定(标准)图元文件的一个副本
CreateBrushIndirect 在一个LOGBRUSH数据结构的基础上创建一个刷子
CreateDIBPatternBrush 用一幅与设备无关的位图创建一个刷子,以便指定刷子样式(图案)
CreateEnhMetaFile 创建一个增强型的图元文件设备场景
CreateHatchBrush 创建带有阴影图案的一个刷子
CreateMetaFile 创建一个图元文件设备场景

CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子
CreatePen 用指定的样式、宽度和颜色创建一个画笔
CreatePenIndirect 根据指定的LOGPEN结构创建一个画笔
CreateSolidBrush 用纯色创建一个刷子
DeleteEnhMetaFile 删除指定的增强型图元文件
DeleteMetaFile 删除指定的图元文件
DeleteObject 删除GDI对象,对象使用的所有系统资源都会被释放
DrawEdge 用指定的样式描绘一个矩形的边框
DrawEscape 换码(Escape)函数将数据直接发至显示设备驱动程序
DrawFocusRect 画一个焦点矩形
DrawFrameControl 描绘一个标准控件
DrawState 为一幅图象或绘图操作应用各式各样的效果
Ellipse 描绘一个椭圆,由指定的矩形围绕
EndPath 停止定义一个路径
EnumEnhMetaFile 针对一个增强型图元文件,列举其中单独的图元文件记录
EnumMetaFile 为一个标准的windows图元文件枚举单独的图元文件记录

EnumObjects 枚举可随同指定设备场景使用的画笔和刷子
ExtCreatePen 创建一个扩展画笔(装饰或几何)
ExtFloodFill 在指定的设备场景里,用当前选择的刷子填充一个区域
FillPath 关闭路径中任何打开的图形,并用当前刷子填充
FillRect 用指定的刷子填充一个矩形
FlattenPath 将一个路径中的所有曲线都转换成线段
FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域
FrameRect 用指定的刷子围绕一个矩形画一个边框
GdiComment 为指定的增强型图元文件设备场景添加一条注释信息
GdiFlush 执行任何未决的绘图操作
GdiGetBatchLimit 判断有多少个GDI绘图命令位于队列中
GdiSetBatchLimit 指定有多少个GDI绘图命令能够进入队列
GetArcDirection 画圆弧的时候,判断当前采用的绘图方向
GetBkColor 取得指定设备场景当前的背景颜色
GetBkMode 针对指定的设备场景,取得当前的背景填充模式
GetBrushOrgEx 判断指定设备场景中当前选定刷子起点

GetCurrentObject 获得指定类型的当前选定对象
GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置
GetEnhMetaFile 取得磁盘文件中包含的一个增强型图元文件的图元文件句柄
GetEnhMetaFileBits 将指定的增强型图元文件复制到一个内存缓冲区里
GetEnhMetaFileDescription 返回对一个增强型图元文件的说明
GetEnhMetaFileHeader 取得增强型图元文件的图元文件头
GetEnhMetaFilePaletteEntries 取得增强型图元文件的全部或部分调色板
GetMetaFile 取得包含在一个磁盘文件中的图元文件的图元文件句柄
GetMetaFileBitsEx 将指定的图元文件复制到一个内存缓冲区
GetMiterLimit 取得设备场景的斜率限制(Miter)设置
GetNearestColor 根据设备的显示能力,取得与指定颜色最接近的一种纯色
GetObjectAPI 取得对指定对象进行说明的一个结构
GetObjectType 判断由指定句柄引用的GDI对象的类型
GetPath 取得对当前路径进行定义的一系列数据
GetPixel 在指定的设备场景中取得一个像素的RGB值
GetPolyFillMode 针对指定的设备场景,获得多边形填充模式

GetROP2 针对指定的设备场景,取得当前的绘图模式
GetStockObject 取得一个固有对象(Stock)
GetSysColorBrush 为任何一种标准系统颜色取得一个刷子
GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据,将一个增强型图元文件转换成标准windows图元文件
InvertRect 通过反转每个像素的值,从而反转一个设备场景中指定的矩形
LineDDA 枚举指定线段中的所有点
LineTo 用当前画笔画一条线,从当前位置连到一个指定的点
MoveToEx 为指定的设备场景指定一个新的当前画笔位置
PaintDesktop 在指定的设备场景中描绘桌面墙纸图案
PathToRegion 将当前选定的路径转换到一个区域里
Pie 画一个饼图
PlayEnhMetaFile 在指定的设备场景中画一个增强型图元文件
PlayEnhMetaFileRecord 回放单独一条增强型图元文件记录
PlayMetaFile 在指定的设备场景中回放一个图元文件
PlayMetaFileRecord 回放来自图元文件的单条记录
PolyBezier 描绘一条或多条贝塞尔(Bezier)曲线

PolyDraw 描绘一条复杂的曲线,由线段及贝塞尔曲线组成
Polygon 描绘一个多边形
Polyline 用当前画笔描绘一系列线段
PolyPolygon 用当前选定画笔描绘两个或多个多边形
PolyPolyline 用当前选定画笔描绘两个或多个多边形
Rectangle 用当前选定的画笔描绘矩形,并用当前选定的刷子填充
RoundRect 用当前选定的画笔画一个圆角矩形,并用当前选定的刷子在其中填充
SelectClipPath 将设备场景当前的路径合并到剪切区域里
SelectObject 为当前设备场景选择图形对象
SetArcDirection 设置圆弧的描绘方向
SetBkColor 为指定的设备场景设置背景颜色
SetBkMode 指定阴影刷子、虚线画笔以及字符中的空隙的填充方式
SetBrushOrgEx 为指定的设备场景设置当前选定刷子的起点
SetEnhMetaFileBits 用指定内存缓冲区内包含的数据创建一个增强型图元文件
SetMetaFileBitsEx 用包含在指定内存缓冲区内的数据结构创建一个图元文件
SetMiterLimit 设置设备场景当前的斜率限制

SetPixel 在指定的设备场景中设置一个像素的RGB值
SetPixelV 在指定的设备场景中设置一个像素的RGB值
SetPolyFillMode 设置多边形的填充模式
SetROP2 设置指定设备场景的绘图模式。与vb的DrawMode属性完全一致
SetWinMetaFileBits 将一个标准Windows图元文件转换成增强型图元文件
StrokeAndFillPath 针对指定的设备场景,关闭路径上打开的所有区域
StrokePath 用当前画笔描绘一个路径的轮廓。打开的图形不会被这个函数关闭
UnrealizeObject 将一个刷子对象选入设备场景之前,如刷子的起点准备用SetBrushOrgEx修改,则必须先调用本函数
WidenPath 根据选定画笔的宽度,重新定义当前选定的路径

作者: end55rpg    时间: 2013-8-2 22:39
490832999 发表于 2013-8-2 22:36
这东西不会呢...可能要用到gdi32

AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任 ...

…………难道要这等麻烦。。。API秒杀了我。。。。。
gdi是啥。。。好吧我慢慢翻,。。。。。貌似绘图
作者: 490832999    时间: 2013-8-2 22:43
end55rpg 发表于 2013-8-2 22:39
…………难道要这等麻烦。。。API秒杀了我。。。。。
gdi是啥。。。好吧我慢慢翻,。。。。。貌 ...

Get_Http_Info也肯定是用API了啊
作者: 救世小树    时间: 2013-8-2 22:44
好吧,我也不会。
【其实我也就会点RGSS,这个好像是牵扯到png文件结构什么的吧(不知道是不是),完全不懂,看来帮不了你
作者: end55rpg    时间: 2013-8-2 22:56
亿万星辰 发表于 2013-8-2 22:23
试试直接用File.open打开一个文件,然后直接用write把整个数据写入,我曾经写过抓取blog网页中图片和文字的 ...
  1. p=Get_Http_Info.get_html('http://www.baidu.com/img/bdlog)

  2. o.gif'
  3. p p
  4. File.open("bd.gif","w+").write(p)
复制代码
然后p出来的就差不多乱码啦。。然后保存的bd.gif也就是绘图失败。。。
作者: 亿万星辰    时间: 2013-8-2 23:06
本帖最后由 亿万星辰 于 2013-8-2 23:16 编辑

那说了半天Get_Http_Info.get_html是什么内容啊,你还是不说……

用 wb 来写
  1. bitmap = Get_Version_Info.get_version("http://uc.66rpg.com/data/avatar/000/24/98/90_avatar_middle.jpg")
  2. f = File.open("temp.jpg", "wb")
  3. f.write(bitmap)
  4. f.close
复制代码

作者: end55rpg    时间: 2013-8-2 23:32
亿万星辰 发表于 2013-8-2 23:06
那说了半天Get_Http_Info.get_html是什么内容啊,你还是不说……

用 wb 来写

好吧明天我试试然后html..那个就是几百年前你updateonline的产物啊。。睡咯注意休息。。。。
我记得我是用wb不行才改用w+的,,
作者: end55rpg    时间: 2013-8-3 07:49
本帖最后由 end55rpg 于 2013-8-3 07:52 编辑
亿万星辰 发表于 2013-8-2 23:06
那说了半天Get_Http_Info.get_html是什么内容啊,你还是不说……

用 wb 来写


bitmap = Get_Version_Info.get_version("http://uc.66rpg.com/data/avatar/000/24/98/90_avatar_middle.jpg")
f = File.open("temp.jpg", "wb")
f.write(bitmap)
f.close


= =我试了下运行这个怎么不管用额,下载的temp.jpg还是无法显示。。。你测试能显示?

gethtml如下↓。。

RUBY 代码复制
  1. #==================================================
  2. # 本脚本来自 [url]www.66rpg.com[/url] 使用和转载请保留此信息
  3. #==================================================
  4. class Get_Http_Info
  5.   AGENT = "RGSS PLAYER"
  6.   INTERNET_OPEN_TYPE_PRECONFIG = 0 # IEの設定を仕様
  7.   INTERNET_OPEN_TYPE_DIRECT = 1 # プロキシを使用しない
  8.  
  9.   def Get_Http_Info.InternetOpen()
  10.     io = Win32API.new('wininet', 'InternetOpen', %(p, l, p, p, l), 'l')
  11.     hInternet = io.call(AGENT, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0)
  12.     return hInternet
  13.   end
  14.  
  15.   def Get_Http_Info.InternetOpenUrl(hSession, url)
  16.     iou = Win32API.new('wininet', 'InternetOpenUrl', %(l, p, p, l, l, l), 'l')
  17.     hService = iou.call(hSession, url, nil, 0, 0, 0)
  18.     return hService
  19.   end
  20.  
  21.   def Get_Http_Info.InternetReadFile(hService,length,bk)
  22.     content = ""
  23.  
  24.     read_size = 1024 # 一次读入文件的尺寸
  25.     irf = Win32API.new('wininet', 'InternetReadFile', %(l, p, i, p), 'i')
  26.     bk.call(0,length)
  27.     id=0
  28.     while(true)
  29.       buf = "\0" * read_size
  30.       red = [0].pack('L')
  31.       irf.call( hService, buf, read_size, red )
  32.       bk.call(id*read_size,length)
  33.       id+=1
  34.       # 读到文件末端
  35.       break if (red.unpack('L') == [0])
  36.       buf.delete!("\0")
  37.       content += buf
  38.     end
  39.     return content
  40.   end
  41.  
  42.   HTTP_QUERY_STATUS_CODE = 19
  43.   CONTENT_LENGTH=5
  44.   def Get_Http_Info.HttpQueryInfo(hService)
  45.     read_size = 1024
  46.     buf = "\0" * read_size
  47.     red = [read_size-1].pack('L')
  48.     hqi = Win32API.new('wininet', 'HttpQueryInfo', %(l, l, p, p, p), 'i')
  49.     isOk = hqi.call( hService, HTTP_QUERY_STATUS_CODE, buf, red, nil)
  50.     buf.delete!("\0")
  51.     return buf
  52.   end
  53.  
  54.   def Get_Http_Info.InternetCloseHandle(hInternet)
  55.     ich = Win32API.new('winInet', 'InternetCloseHandle', %(l), 'i')
  56.     isOk = ich.call(hInternet)
  57.     return isOk
  58.   end
  59.  
  60.   HTTP_CODE_OK = "200"
  61.   def Get_Http_Info.HttpQuerySize(hService)
  62.     read_size = 1024
  63.     buf = "\0" * read_size
  64.     red = [read_size-1].pack('L')
  65.     hqi = Win32API.new('wininet', 'HttpQueryInfo', %(l, l, p, p, p), 'i')
  66.     isOk = hqi.call( hService, CONTENT_LENGTH, buf, red, nil)
  67.     buf.delete!("\0")
  68.     return buf
  69.   end
  70.   def Get_Http_Info.get_info(url)
  71.     info = nil
  72.     begin
  73.       hInternet = InternetOpen()
  74.       if (hInternet != 0)
  75.         hService = InternetOpenUrl(hInternet, url)
  76.         if (hService != 0)
  77.           status_code = HttpQueryInfo(hService)
  78.           if (status_code == HTTP_CODE_OK)
  79.             info = InternetReadFile(hService)
  80.           end
  81.           InternetCloseHandle(hService)
  82.         end
  83.         InternetCloseHandle(hInternet)
  84.       end
  85.     rescue
  86.       # 例外发生
  87.       return nil
  88.     end
  89.     ary = []
  90.     info.each_line do |line|
  91.       next if line.empty?
  92.       ary.push line
  93.     end
  94.     return ary[271].scan(/\w+<\/a>/)
  95.   end
  96.  
  97.   def Get_Http_Info.get_html(url,bk)
  98.     info = nil
  99.    # begin
  100.       hInternet = InternetOpen()
  101.       if (hInternet != 0)
  102.         hService = InternetOpenUrl(hInternet, url)
  103.  
  104.         if (hService != 0)
  105.           status_code = HttpQueryInfo(hService)
  106.           length=HttpQuerySize(hService).to_i
  107.           if (status_code == HTTP_CODE_OK)
  108.             #a=File.open(pathname,"wb")
  109.             info = InternetReadFile(hService,length,bk)
  110.           end
  111.           InternetCloseHandle(hService)
  112.         end
  113.         InternetCloseHandle(hInternet)
  114.       end
  115.     #rescue
  116.       # 例外发生
  117.     #  return nil
  118.     #end
  119.  
  120.     return info
  121.   end
  122.  
  123. end

作者: feizhaodan    时间: 2013-8-3 10:48
其实直接把数据内容写入文件就行了吧。
这个下载因该是直接下载文件数据,保持文件名相同因该就行了。
作者: satgo1546    时间: 2013-8-3 12:43
我也不会

我反正对网络一窍不通你能拿我怎么样= =
然后我对编码不了解大概是编码?(……
作者: end55rpg    时间: 2013-8-3 12:49
satgo1546 发表于 2013-8-3 12:43
我也不会

我反正对网络一窍不通你能拿我怎么样= =

好吧
俺低估你了
作者: orzfly    时间: 2013-8-3 16:08
本帖最后由 orzfly 于 2013-8-3 16:12 编辑

17 楼脚本,第 36 行
  1. buf.delete!("\0")
复制代码
应该改成
  1. buf = buf[0, red.unpack('L')[0]]
复制代码
原因是因为你在尝试加载二进制数据,所以数据中会存在 0 字符。
于是不能简单的用 delete("\0") 来去掉字符串中的空值。

与此同时同样值得注意的是,这个 buf 并不应当作为 C 字符串(C-style zero-terminated string)来处理——去掉 \0 及以后的所有字符。
这只是一个任何数据都可能存放的 buffer。
InternetReadFile 的返回值已经充分返回了 buffer 中有效数据的长度。

如果阁下使用的是 Ruby 1.9+(RGSS3),这个脚本需要做一些编码方面的修改。主要是 force_encoding("ascii-8bit")。

@亿万星辰 @Sion @feizhaodan @satgo1546

顺便感谢 @晴兰 。此回复有TA的贡献。  
作者: end55rpg    时间: 2013-8-3 16:17
本帖最后由 end55rpg 于 2013-8-3 17:05 编辑
orzfly 发表于 2013-8-3 16:08
17 楼脚本,第 36 行应该改成原因是因为你在尝试加载二进制数据,所以数据中会存在 0 字符。
于是不能简单 ...
额,触。。。。
解决了
汗,原来俺用mashl啥玩意儿的不行- -好咯。。。。。
3Q~~~~~~~~~~~~~~~


作者: end55rpg    时间: 2013-8-3 16:53
本帖最后由 end55rpg 于 2013-8-3 17:03 编辑

- -请删啊111111111
作者: 魔塔作家    时间: 2013-8-3 19:27
建议 LZ 去找一下 VB 的文件下载代码,在 VB 中用 API 的部分会比较多。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1