`
fortianwei
  • 浏览: 61079 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

校内网狗狗刷骨机的ruby实现

    博客分类:
  • Ruby
阅读更多

      前些天上网看到有人的博客上写了怎么来给校内网狗狗刷骨头,是用perl写的,现在我用ruby简单实现以下。原perl实现代码在http://www.cnblogs.com/xiaoyz/archive/2008/10/27/1320259.html

 

当然,由于校内网也发现了相关问题,会经常换狗狗flash,md5_key,所以这个必须先反编译swf文件找到对应的代码才会知道。

 

注意: 先刷狗粮(就是earnFoods),刷到很多了之后用狗粮给被人狗喂食(这个时候将planA.earnFoods前面加上'#',并把planA.earnBones前面的'#'去掉),那就会赠送骨头给你,这样就是刷骨头了,骨头多了后随便买东西,然后继续刷狗粮,刷骨头,刷狗粮,刷骨头。。。

 

另:校内网很多东西再不断变化,如果服务器端代码变化导致用不了,那就别用了,或者用我下面写的方法将相关改变的东西也改过去。

 

 运行代码前,先将你对应的fid,pid,tsc,cookie 等四个信息填入下面代码。

 

#Author:http://fortianwei.iteye.com
#Date:2009-4-18
#
#
require 'uri'
require 'net/http'
require 'md5'
require 'rexml/document'
class XiaoNeiDog
  attr_reader :key,:conf
  @@flashAddress='http://dog.xnimg.cn/dog/xn_swf/dogs_v0.14.swf'#这个随时会更改
  @@MD5_key='%$T&*jkhjksdhfjk$%^&*BJHhh'  #这个不好弄,要反编译出来,随时会更改
  @@tsc='XXXXXXXXXXXXX'#这个用网络嗅探器得到数据包中获取
  @@fid='XXXXXXXXXXX'#用户id
  @@pid='XXXXXXXXXXx'#狗狗id
  @@storeAddress='http://dog.xiaonei.com/store.do'
  @@cookie='XXXXXXXXXXXXXXXXXXXX' #cookie
  @@head={"Cookie"=>"#{@@cookie}",
          "Accept-Language"=>"zh-CN",
          "x-flash-version"=>"9,0,124,0",
          "Referer"=>"#{@@flashAddress}"
    }

  #初始化
  #获得初始化的狗狗key,做任何事都要获得狗狗的key,这个key是随机数
  #所以每次都要记录,方便下次动作来用,初始化的xml配置单和以后临时配置单数据格式不一样
  #所以初始化不用给@conf赋值
def initialize
     init
  end
  
  def init
      url="/pet-profile.do?method=dogXML&actor_id=" +@@fid + "&pid=" + @@pid
      link=Net::HTTP.new('dog.xiaonei.com',80)
      result=link.get(url,@@head)
      xml=result.body
      doc=REXML::Document.new xml
      @key=REXML::XPath.first(doc,'//key').text
      #bones=REXML::XPath.first(doc,'//num_bones_available').text
      #foods=REXML::XPath.first(doc,'//food_available').text
      #puts "food_available:"<<foods
      #puts "bones_available:"<<bones
  end

#返回狗狗临时配置单的REXML::Document对象
def getXMLConfObject
  REXML::Document.new @conf
end

 #通过狗狗配置单获得狗狗每次随机key
def getKeyFromXML
   getXMLConfObject.root.attributes['key']
end

#看狗狗渴了没
def thirsty?
     getXMLConfObject.root.attributes['is_pet_thirsty']=="true"
end

#看狗狗饿了没 不是看配置单中的is_pet_hungry而是判断狗狗体力是否达到85%,可以把函数改名叫forceOut?
def forceOut?
   getXMLConfObject.root.attributes['force'].to_f/getXMLConfObject.root.attributes['max_force'].to_f<0.85 ? true: false
end

#获取挨饿的狗狗们的id
def getHungryDogs
  s=Set.new
  url='http://dog.xiaonei.com/hall.do?method=hungry'
  link=Net::HTTP.new("dog.xiaonei.com",80)
  result=link.get(url,@@head).body.to_s
  dogsId=result.scan(/pid=\d+/i).each do    
  |dogId| dogId=dogId.sub!(/pid=/,'')
end
sleep(5)
s.union dogsId
end

 #用每次不同的狗狗配置单输出狗狗骨头和狗粮信息
 def outputDogInfo
   foods,bones=getXMLConfObject.root.attributes['user_foods'],getXMLConfObject.root.attributes['user_bones']
   puts "pid :"<<@@pid 
   puts "food_available:"<<foods
   puts "bones_available:"<<bones
  
 end
 
  #陪狗狗玩
  def playWithDog
    begin
    puts "===============play with dog=============="
       code = @key + "#" + @@pid + "#" + @@fid+"#"+@@MD5_key
       
       secret="actor%5Fid=" + @@fid + "&method=pelt&code="+ MD5.hexdigest(code) + "&pid=" + @@pid
       url="/pet-profile.do"
       link=Net::HTTP.new("dog.xiaonei.com",80)
       result=link.post(url,secret,@@head)
       @conf=result.body
       @key=getKeyFromXML#每次玩完后要设定@key的值
       outputDogInfo
    rescue
       puts @conf
       #earnFoods
    ensure
       return @conf
    end
  end
     
  #狗狗体力不支,吃点东西喝点水吧,"获得体力"
  #type=1的时候是吃狗粮,type=2的时候是喝水
  def feachForce(type)
      code=@key+"#"+@@pid+"#"+@@fid+"#"+@@MD5_key
      secret="active%5Fid="+type.to_s+ "&method=doing&actor%5Fid="+@@fid+"&code="+ MD5.hexdigest(code) + "&pid=" + @@pid
      url="/pet-profile.do"
      link=Net::HTTP.new("dog.xiaonei.com",80)
      result=link.post(url,secret,@@head)
      @conf=result.body
      puts @conf
      @key=getKeyFromXML#每次玩完后要设定@key的值
      foods=type==1? "foods":"water"
      puts "=========feed dog #{@@pid} with #{foods}================="
      outputDogInfo
      
  end
  
  #骨头够5个了,去买狗粮吧,免得等会输回去了^_^,,不过第一步是获取一个叫做tsc的用作store key的东东
  #这个要先进去商店,从返回的html里面获取有一个tsc=xxxxxxx的东东就是,不过用网络嗅探器更好得到
  def buyFoods
      puts "===============buy foods==============="
      url="/store.do"
      link=Net::HTTP.new("dog.xiaonei.com",80)
      result=link.post(url,"method=buyfood&buy_id=1&buy_count=1&tsc="+@@tsc,{"Cookie"=>"#{@@cookie}","Referer"=>"http://dog.xiaonei.com/store.do?method=food"})
  end

  #赚狗粮,也就是玩球球,看概率,超过5个骨头马上换狗粮
  def earnFoods
    begin
    count=0
     while(true) do
     count+=1
        playWithDog
        puts @conf
        sleep(6)
        buyFoods if getXMLConfObject.root.attributes['user_bones'].to_i>=5
        feachForce(2) if thirsty?
        feachForce(1) if forceOut?
        
       # return if count==1200
        end
      rescue 
        puts "error"
     #   earnFoods
    end
  end
  
  #赚骨头,方法:给别人挨饿的狗狗喂食,好人有好报啊
  #不过一般吃狗粮前要喝水
  def earnBones
    while true do
      list=getHungryDogs
      begin
      list.each do
        |dogId| @@pid=dogId 
        init
        sleep(5)
        puts "feed dog #{@@pid}"
        feachForce(2)
        sleep(5)
        feachForce(1)
      end
      rescue Timeout::Error
       puts "Time out this time!"
      earnBones 
    end
  end
  
  end
  
end

planA=Internet.new
planA.earnFoods
#planA.earnBones

 顺带说一下那些不好得到的东东怎么搞到的:

先贴一个网络嗅探器的截图:

 

1.

 @@flashAddress='http://dog.xnimg.cn/dog/xn_swf/dogs_v0.14.swf'#这个随时会更改

你用的那个狗狗的flash,就是你再给狗丢球玩之前发送的数据包上图中的Referer后面对应网址,当然,上面只是一个数据包示范而已,真实的由于包含本人信息就没放上来。

 

2.

@@tsc='f8490cc8bfad54d7ca148cf81b82cec0'#这个用网络嗅探器得到数据包中获取
  @@fid='XXXXXXXXXXX'#用户id
  @@pid='XXXXXXXXXXx'#狗狗id
 @@cookie='XXXXXXXXXXXXXXXXXXXX' #cookie

这些比如fid,pid都可以从cookie中找到,而@@cookie就是那个cookie的全部,复制过来就行。而tsc是在你进入商店后(方式是post)生成的数据包中传递的数据中得到比如我的就是method=buyfood&buy_id=1&buy_count=1&tsc=f8490cc8bfad54d7ca148cf81b82cec0

 

3.

@@MD5_key='%$T&*jkhjksdhfjk$%^&*BJHhh'  #这个不好弄,要反编译出来,随时会更改

这个的确不好弄,先要用swf反编译器得到源代码,然后我是先查看到有一个Pokey文件里面有下面代码:

var _loc_6:* = current_state;
            _loc_6.ping_count = current_state.ping_count++;
            var _loc_2:* = new URLVariables();
            _loc_2.actor_id = INFO["actor_id"];
            _loc_2.active_id = String(param1);
            _loc_2.pid = INFO["pet_id"];
            var _loc_3:* = code + "#" + INFO["pet_id"] + "#" + INFO["actor_id"] + "#" + 

ConfigurationManager.MD5_KEY;
            _loc_2.code = MD5.hash(_loc_3);
            _loc_2.method = "doing";






            var _loc_4:* = new URLLoader();
            new URLLoader().addEventListener(Event.COMPLETE, handlePingResponse);
            var _loc_5:* = new URLRequest(ConfigurationManager.PING_URL);
            new URLRequest(ConfigurationManager.PING_URL).data = _loc_2;
            _loc_5.method = URLRequestMethod.POST;
            _loc_4.load(_loc_5);

 上面代码中很明显的加了一个ConfigurationManager.MD5_KEY,这个是关键(别的比如method="doing"表示是吃东西或喝水,怎么得到的?从网络嗅探器中得知)。那么这个ConfigurationManager.MD5_KEY怎么得到?我看了看有个叫做com.xiaonei.pokey.managers::ConfigurationManager的包,到里面一看,有如下代码。

package com.xiaonei.pokey.managers
{

    public class ConfigurationManager extends Object
    {
        static public const PING_URL:String;
        static public const FLASH_SHOP:String;
        static public const MD5_KEY:String = "%$T&*jkhjksdhfjk$%^&*BJHhh";
        static public const HOUSE_URL:String;
        static public const APP_URL:String = "http://dog.xiaonei.com/";


 很显然,这只是个头部,还有别的就不用贴上来了,我们可以看到

static public const MD5_KEY:String = "%$T&*jkhjksdhfjk$%^&*BJHhh";

那就是我代码里面对应的@@MD5_key='%$T&*jkhjksdhfjk$%^&*BJHhh'

不过,这个很容易改动,所以当你用我这个代码用不了的时候,可能就是这个值又变化了。

 

 

 

 

分享到:
评论

相关推荐

    ysoserial-master.zip

    ysoserial是一个用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。它包含一系列在常见Java库中发现的"gadget chains",可以在特定条件下利用执行不安全的反序列化操作的Java应用程序。ysoserial项目最初在2015年AppSecCali会议上提出,包含针对Apache Commons Collections(3.x和4.x版本)、Spring Beans/Core(4.x版本)和Groovy(2.3.x版本)的利用链

    zigbee CC2530无线自组网协议栈系统代码实现协调器与终端的TI Sensor实验和Monitor使用.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    YOLO算法-自卸卡车-挖掘机-轮式装载机数据集-2644张图像带标签-自卸卡车-挖掘机-轮式装载机.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    Oracle10gDBA学习手册中文PDF清晰版最新版本

    **Oracle 10g DBA学习手册:安装Oracle和构建数据库** **目的:** 本章节旨在指导您完成Oracle数据库软件的安装和数据库的创建。您将通过Oracle Universal Installer (OUI)了解软件安装过程,并学习如何利用Database Configuration Assistant (DBCA)创建附加数据库。 **主题概览:** 1. 利用Oracle Universal Installer (OUI)安装软件 2. 利用Database Configuration Assistant (DBCA)创建数据库 **第2章:Oracle软件的安装与数据库构建** **Oracle Universal Installer (OUI)的运用:** Oracle Universal Installer (OUI)是一个图形用户界面(GUI)工具,它允许您查看、安装和卸载机器上的Oracle软件。通过OUI,您可以轻松地管理Oracle软件的安装和维护。 **安装步骤:** 以下是使用OUI安装Oracle软件并创建数据库的具体步骤:

    消防验收过程服务--现场记录表.doc

    消防验收过程服务--现场记录表.doc

    (4655036)数据库 管理与应用 期末考试题 数据库试题

    数据库管理\09-10年第1学期数据库期末考试试卷A(改卷参考).doc。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    YOLO算法-瓶纸盒合并数据集-3161张图像带标签-纸张-纸箱-瓶子.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    职业暴露后的处理流程.docx

    职业暴露后的处理流程.docx

    Java Web开发短消息系统

    Java Web开发短消息系统

    java毕设项目之ssm基于java和mysql的多角色学生管理系统+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    批量导出多项目核心目录工具

    这是一款可以配置过滤目录及过滤的文件后缀的工具,并且支持多个项目同时输出导出,并过滤指定不需要导出的目录及文件后缀。 导出后将会保留原有的路径,并在新的文件夹中体现。

    【图像压缩】基于matlab GUI DCT图像压缩(含MAX MED MIN NONE)【含Matlab源码 9946期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    操作系统实验 Ucore lab5

    操作系统实验 Ucore lab5

    IMG_5950.jpg

    IMG_5950.jpg

    竞选报价评分表.docx

    竞选报价评分表.docx

    java系统,mysql、springboot等框架

    java系统,mysql、springboot等框架

    zigbee CC2530网关+4节点无线通讯实现温湿度、光敏、LED、继电器等传感节点数据的采集上传,网关通过ESP8266上传远程服务器及下发控制.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    YOLO算法-快递衣物数据集-496张图像带标签.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    搜索引擎lucen的相关介绍 从事搜索行业程序研发、人工智能、存储等技术人员和企业

    内容概要:本文详细讲解了搜索引擎的基础原理,特别是索引机制、优化 like 前缀模糊查询的方法、建立索引的标准以及针对中文的分词处理。文章进一步深入探讨了Lucene,包括它的使用场景、特性、框架结构、Maven引入方法,尤其是Analyzer及其TokenStream的实现细节,以及自定义Analyzer的具体步骤和示例代码。 适合人群:数据库管理员、后端开发者以及希望深入了解搜索引擎底层实现的技术人员。 使用场景及目标:适用于那些需要优化数据库查询性能、实施或改进搜索引擎技术的场景。主要目标在于提高数据库的访问效率,实现高效的数据检索。 阅读建议:由于文章涉及大量的技术术语和实现细节,建议在阅读过程中对照实际开发项目,结合示例代码进行实践操作,有助于更好地理解和吸收知识点。

Global site tag (gtag.js) - Google Analytics