前些天上网看到有人的博客上写了怎么来给校内网狗狗刷骨头,是用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'
不过,这个很容易改动,所以当你用我这个代码用不了的时候,可能就是这个值又变化了。
相关推荐
【标题】"飞机大战ruby实现" 是一个使用Ruby编程语言开发的飞行射击游戏,它基于RPG Maker XP 1.03引擎构建。这个项目展示了如何利用Ruby的灵活性和RPG Maker XP的功能来创建一款简单但有趣的游戏。 【描述】中的...
**Ruby-TensorStream:用Ruby重现实现TensorFlow** Ruby-TensorStream是一个开源项目,旨在为Ruby开发者提供一个类似于Google TensorFlow的深度学习框架。它的核心目标是让Ruby程序员能够利用TensorFlow的强大功能...
本资源"ruby-使用ruby实现的排序算法-sorting.zip"聚焦于如何使用Ruby实现不同的排序算法,这对于Ruby开发者来说是一项重要的技能。下面将详细讨论Ruby中的排序算法及其原理。 1. 内置排序方法 `sort` Ruby提供了...
从给定的文件信息来看,标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于...
这个库为Ruby开发者提供了一套强大的工具,用于在应用程序中实现多语言支持和文化敏感的文本处理。 首先,我们来了解一下ICU。ICU是一个广泛使用的开源库,它提供了全面的Unicode支持和跨平台的本地化功能。它包含...
ruby-snmp, SNMP ( 简单网络管理协议)的ruby 实现 用于 ruby的 SNMP库摘要这里库实现 SNMP ( 简单网络管理协议) 。 它在纯 ruby 中实现,因此不依赖于的外部库( 如 ) 。 你可以在 ruby 可以运行的任何地方运行这里库...
在Ruby on Rails(ROR)框架中,实现搜索和分页功能是常见的需求,尤其是在构建数据密集型Web应用时。本示例将深入探讨如何利用Ruby技术和Rails的强大特性来完成这一任务。 首先,我们需要理解搜索功能的基础:查询...
Ruby-Http2是HTTP/2协议的一个纯Ruby实现,它为Ruby开发者提供了一种高效、安全的方式来处理HTTP通信。HTTP/2是HTTP协议的最新版本,相比于早期的HTTP/1.1,它引入了许多改进,旨在提高网络性能,降低延迟,并优化...
在Ruby的世界里,管理不同的Ruby实现(如MRI、JRuby、Rubinius、MagLev和MRuby)是非常重要的,这有助于开发者根据项目需求选择最适合的运行时环境。`ruby-install`就是这样一个工具,它允许用户方便地安装和管理...
Ruby-Whois是一个高效、灵活且完全用Ruby语言编写的WHOIS客户端和解析库。它设计用于查询域名、IP地址和其他WHOIS相关的记录,并能够处理各种服务器响应格式。这个库的强大之处在于它不仅可以发送WHOIS请求,还可以...
Ruby Ruby Ruby Ruby Ruby Ruby
本资料包“ruby-使用ruby实现的算法之冒泡排序.zip”专注于讲解如何使用Ruby来实现经典的冒泡排序算法,这对于理解排序算法以及提升Ruby编程技能非常有帮助。 冒泡排序是一种基础且直观的排序算法,它通过重复遍历...
《SlopeOne推荐算法的Ruby实现》 在大数据和个性化推荐系统领域,SlopeOne算法是一种简单而有效的预测方法,尤其适用于处理大规模数据集。它由Daniel Lemire等人在2005年提出,旨在通过用户对物品的评分差异进行...
《基于Ruby实现的音乐推荐网站》 Ruby是一种面向对象的脚本语言,以其简洁明了的语法和强大的元编程能力而受到开发者的喜爱。在这个基于Ruby实现的音乐推荐网站项目中,我们可以深入学习Ruby在Web开发中的应用以及...
本资源包"ruby-使用ruby实现的算法之加密解密算法.zip"显然包含了关于如何在Ruby中实现加密和解密算法的实例和代码。下面将详细介绍Ruby中常用的加密解密方法及相关知识点。 1. **基本概念** - **加密**:是将明文...
在这个"一些图形算法的Ruby实现_Ruby_下载.zip"压缩包中,我们可以期待找到一些用Ruby编写的图形算法示例代码,帮助我们理解和应用这些概念。 1. 图的基本概念: - 图是由节点(或顶点)和边构成的数据结构,可以...
ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby
本篇文章将详细探讨一个特定的工具集,即使用Ruby语言实现的“SSDB到Redis/Pika”的迁移工具,标题为“Ruby-迁移SSDB到RedisPika工具集Ruby实现”。这个工具集主要针对那些希望将数据从SSDB(Simple Scalable ...