设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4769|回复: 2
打印 上一主题 下一主题

[已经过期] 如何获取网络时间?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3024
在线时间
652 小时
注册时间
2012-2-13
帖子
181
跳转到指定楼层
1
发表于 2021-4-8 13:36:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
RUBY 代码复制
  1. module ReadTime
  2.  
  3.   module Config
  4.  
  5.     #小时,分钟,秒设置的变量编号, 默认放在了6,7,8号变量里面
  6.  
  7.     HOUR   = 6
  8.  
  9.     MINUTE = 7
  10.  
  11.     SECOND = 8
  12.  
  13.  
  14.  
  15.     #年月日
  16.  
  17.     YEAR  = 9
  18.  
  19.     MON   = 10
  20.  
  21.     MDAY  = 11
  22.  
  23.   end
  24.  
  25. end
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. module SAFX
  36.  
  37.   module_function
  38.  
  39.  
  40.  
  41.   def to_param(a)
  42.  
  43.     case a when Integer then "L" when String then "p" end
  44.  
  45.   end
  46.  
  47.  
  48.  
  49.   def to_ptr(a)
  50.  
  51.     case a  when Integer then a when String then [a].pack('p').unpack("L").first end
  52.  
  53.   end
  54.  
  55.  
  56.  
  57.   def api(dll,func)
  58.  
  59.     lambda{|*args|
  60.  
  61.        Win32API.new(dll,func,args.map{|x|to_param(x)}, 'i').call(*args)
  62.  
  63.     }
  64.  
  65.   end
  66.  
  67.  
  68.  
  69.   def memread(addr, size)
  70.  
  71.                         buf = "\0"*size
  72.  
  73.                         api('Kernel32','RtlMoveMemory').call buf, addr, size
  74.  
  75.                         buf
  76.  
  77.         end
  78.  
  79. end
  80.  
  81.  
  82.  
  83. module ReadTime
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.   class << self
  92.  
  93.     TYPE_VOIDP = "L"
  94.  
  95.     PTRLEN = 4
  96.  
  97.     include SAFX
  98.  
  99.     extend SAFX
  100.  
  101.     %w[gethostbyname socket connect send recv closesocket].each{|name|
  102.  
  103.        define_method(name, &api('ws2_32', name))
  104.  
  105.     }
  106.  
  107.     api('ws2_32', 'WSAStartup').call 0x202, "\0"*2048
  108.  
  109.  
  110.  
  111.     def get
  112.  
  113.         # get IP
  114.  
  115.         baidu =  gethostbyname("open.baidu.com\0")
  116.  
  117.         raise "不能ping到open.baidu.com" if baidu == 0
  118.  
  119.         addr = memread(baidu+PTRLEN*3, PTRLEN)
  120.  
  121.                                 addr = addr.unpack(TYPE_VOIDP).first
  122.  
  123.                                 addr = memread(addr, PTRLEN)
  124.  
  125.                                 addr = addr.unpack(TYPE_VOIDP).first
  126.  
  127.                                 addr = memread(addr, PTRLEN)
  128.  
  129.                                 u = addr.unpack("L").first
  130.  
  131.  
  132.  
  133.         #setup TCP
  134.  
  135.         tcpclient = socket(2, 1, 6)
  136.  
  137.         raise "无法初始化TCP" if tcpclient == -1
  138.  
  139.         #connect
  140.  
  141.         result = connect tcpclient, [2, 80, u].pack("SnLx8"), 16
  142.  
  143.         raise "不能连接到open.baidu.com" if result == -1
  144.  
  145.  
  146.  
  147.         #make request
  148.  
  149.         req = "GET /special/time/ HTTP/1.1\r\n"  <<
  150.  
  151.               "host: open.baidu.com\r\n" <<
  152.  
  153.               "\r\n" <<
  154.  
  155.               "\r\n\r\n"
  156.  
  157.         #send
  158.  
  159.         send tcpclient, req, req.length, 0
  160.  
  161.  
  162.  
  163.         #receive
  164.  
  165.         buf = "\0"*1024
  166.  
  167.         ret = ""
  168.  
  169.         while true
  170.  
  171.           len = recv tcpclient, buf, buf.length, 0
  172.  
  173.           break if len < 1
  174.  
  175.           ret << buf[0, len]
  176.  
  177.         end
  178.  
  179.  
  180.  
  181.         #shutdown
  182.  
  183.         closesocket tcpclient
  184.  
  185.  
  186.  
  187.         ret = ret.unpack("C*").pack("C*")
  188.  
  189.         number = ret[/HTTP\/1\.1 (\d+)/, 1].to_i
  190.  
  191.  
  192.  
  193.         if number != 200
  194.  
  195.           raise "HTTP错误: #{number}"
  196.  
  197.         end
  198.  
  199.  
  200.  
  201.  
  202.  
  203.         #gettime
  204.  
  205.         val = ret[/window\.baidu_time\((\d+)\)/, 1].to_i
  206.  
  207.         if val == 0
  208.  
  209.           raise "网络数据格式已变更,请联系作者"
  210.  
  211.         end
  212.  
  213.         curtime = Time.at val / 1000
  214.  
  215.         $game_variables[ReadTime::Config::HOUR] = curtime.hour
  216.  
  217.         $game_variables[ReadTime::Config::MINUTE] = curtime.min
  218.  
  219.         $game_variables[ReadTime::Config::SECOND] = curtime.sec
  220.  
  221.  
  222.  
  223.         $game_variables[ReadTime::Config::YEAR] = curtime.year
  224.  
  225.         $game_variables[ReadTime::Config::MDAY] = curtime.mday
  226.  
  227.         $game_variables[ReadTime::Config::MON] = curtime.mon
  228.  
  229.  
  230.  
  231.      end
  232.  
  233.   end
  234.  
  235. end
  236.  
  237.  
  238.  
  239. def 获取时间
  240.  
  241.   ReadTime.get
  242.  
  243. end


这段脚本是获取网络时间的,事件脚本“获取时间”,就可以将时间储存到指定变量中
我想脚本应该没什么问题的吧?毕竟是大神写的,可是为何会提示195行错误   “HTTP错误:302”(为了避免跟其他脚本冲突,所以我是新建工程测试这段代码的)
求解

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
2
发表于 2021-4-9 01:06:13 | 只看该作者
https://baike.baidu.com/item/302/878045

302 是重定向,可是脚本只考虑了请求成功(200)的情况,所以提示错误。估计是因为HTTP的关系,应该会重定向到HTTPS。这玩意儿我不熟,只能给出可能原因无法给出解决方案。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

3
发表于 2021-4-16 15:01:08 | 只看该作者
似乎:http://open.baidu.com/special/time,这个页面已经不能访问了
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 16:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表