Project1

标题: 如何获取网络时间? [打印本页]

作者: 大放异彩    时间: 2021-4-8 13:36
标题: 如何获取网络时间?
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”(为了避免跟其他脚本冲突,所以我是新建工程测试这段代码的)
求解
作者: enghao_lim    时间: 2021-4-9 01:06
https://baike.baidu.com/item/302/878045

302 是重定向,可是脚本只考虑了请求成功(200)的情况,所以提示错误。估计是因为HTTP的关系,应该会重定向到HTTPS。这玩意儿我不熟,只能给出可能原因无法给出解决方案。
作者: guoxiaomi    时间: 2021-4-16 15:01
似乎:http://open.baidu.com/special/time,这个页面已经不能访问了




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