本文是yhustc在娱乐之余利用PHP代码写的刷骨头的文章,现在不知道还能不能用了,但思路和技巧可以参考(这里还有一篇利用greasemonkey来玩开心农场的文章,也可以学习一下哦)
原文网址:http://www.yhustc.com/Blog/172.html
从文章中可以了解,这里面最关键的算法在于code的计算,每一次操作都会返回一个key,用于计算下一次操作的code。如果没有这个,那你所做的外挂程序就无效了。
根据yhustc提供的流程,建议采用firefox(使用firebug插件)进行查看分析(当然还有更多的HTTP分析软件)
不多说了,原文如下:
PHP写的,重在分析,不在可以全文COPY的代码。
校内赚骨头的方法很多,最快的是邀请一下自己的MSN好友,一次送400根。用自己的MSN用户名密码登录后,选任何一个好友(比如自己的MSN小号),直接确定,400根骨头到货了。。
但是要不断的得到新的骨头,还要速度快,得靠刷。刷骨头有几个方法,一个是自动玩飞盘,接中一次3根骨头,总体趋势还是赚的。一种是喂其他人的小狗,要喂饥饿,体力为0的,有一根以上的骨头反馈,我遇到过奖20根骨头。
我用的就是第二个方法,因为我发现不是好友的小狗也是可以喂的,也就是喂狗的页面把那个pid从1到***不断的狂加,每个页面试一把,找到饥饿的小狗就喂。
流程如下:
1、登录拿到自己的校内id (actor_Fid)。
2、http://dog.xiaonei.com/pet-profile.do?method=dogXML&&pid+自增ID+&t=毫秒单位时间戳得到小狗的XML格式的属性和用于计算验证code的key
3、如果是饥饿的小狗,喂水、喂食,pid加一回到第二步去找下一只饥饿的小狗
4、喂水、喂食用的是同一个method,只是active_Fid这个参数不同,都会返回当前状态和下一轮计算使用的key,可以在这里检查一下返回,如果狗粮不够了,自动去买一下(这一步很简单,就是一个POST)
补充:首发的时候忘记说明了,买狗粮因为买40kg的,每一袋至少赚6根骨头(喂一只狗花1Kg狗粮,最少加一 根骨头,40Kg狗粮34根骨头一袋),所以默认是买40kg的狗粮,那就要求程序第一次运行的时候有足够的骨头。如果没有这么多,可以修改 Dog.php第139行,把"buy_id"=>3设置成1或2,也就是买5或20Kg的狗粮。
一天刷下来能刷很不少骨头,外加爱心等级飙升。
关键的算法在于code的计算,每一次操作都会返回一个key,用于计算下一次操作的code,参考了一下别人的文章,计算code用下面这个函数
php代码
- private function getCode($petId,$key)
- {
- return md5($key."#".$petId."#".$this->actor_Fid."#".'%$T&*jkhjksdhfjk$%^&*BJHhh');
- }
后面那堆字符问我怎么知道的?抄的。google 校内狗狗 key code,看到一篇分析文章,他反编译了那个flash,看到的字符串常量。要不然鬼能反过来算这个md5里面是啥。
有了这个code外加cookie,校内的验证就算是过了,那么不断的找饥饿的小狗,post相应动作,其实就跟自己人肉搜索饥饿小狗,再点那个 flash一样。详细代码见附件列表。里面有个Http基类,这个里面封装了curl的get和post操作,带cookie。如果要写需要维护登录状态 的PHP代码,倒是可以用用,直接extends Http,然后调用$this->get $this->post就可以了。
说一下玩飞盘吧,这个实现也就是一个POST请求,返回的数据里会有小狗的属性,可以在体力不足的时候POST一个喂食操作。但是当玩到一定次数的 时候,会有验证码,其实这个验证码破解不难,有兴趣的可以捣鼓捣鼓,切割成单个字母用最大相似度匹配应该可以。由于我自己只是看看流程,不玩狗狗,所以没 有写这部分代码。
运行方式:修改Dog.php最下面的用户名和密码,把php目录添加到path里,在控制台下运行php Dog.php即可。
附件嘛。。。。我这里可以下载,也可以去原文进行下载。
4a09477ae1be3.rar
在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但,这其实是有一个前提的。即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换。
虽然大多数转换都是在gbk和utf-8之间转,但如果不知道转换对象的编码怎么办呢?yhustc.com上就有这么一个函数safeEncoding,可以简单的识别UTF8和GBK的编码(国内,基本上也就这两种最常用吧。big5?咱们不考虑,哈哈)
原文地址为:http://www.yhustc.com/Blog/156.html
内容如下:
YBlog能接收引用通告,但是因为YBlog自己使用的是utf-8编码,如果对方的博客系统使用gb2312的编码的话,POST过来就会出现 乱码(除非对方POST前先转换编码)。在不能保证对方是否一定使用utf-8编码的情况下,自己做一个编码的检查和转换是很有必要的。写了个函数来完成 这个工作,原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英 文不管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的BOM信息,关于这方面的东西,大家可以看看TP工具箱的编码转换功能,我在那个AppCodingSwitch类中写了比较详细的注释。
话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。文件的检查与转码,看这里 [膘叔注:这个链接已经不存在了]
php代码
-
- function safeEncoding($string,$outEncoding = 'UTF-8')
- {
- $encoding = "UTF-8";
- for($i=0;$i<strlen($string);$i++)
- {
- if(ord($string{$i})<128)
- continue;
-
- if((ord($string{$i})&224)==224)
- {
-
- $char = $string{++$i};
- if((ord($char)&128)==128)
- {
-
- $char = $string{++$i};
- if((ord($char)&128)==128)
- {
- $encoding = "UTF-8";
- break;
- }
- }
- }
- if((ord($string{$i})&192)==192)
- {
-
- $char = $string{++$i};
- if((ord($char)&128)==128)
- {
-
- $encoding = "GB2312";
- break;
- }
- }
- }
-
- if(strtoupper($encoding) == strtoupper($outEncoding))
- return $string;
- else
- return iconv($encoding,$outEncoding,$string);
- }
这是一篇 很老的文章了,那时候,PDO应该还没有出来吧。不过,仍然可以作为参考。。这里是纯记录,做个笔记
备注:如果看完下文,你觉得还不够,那么,看看这个吧:http://wiki.oracle.com/page/PHP+Oracle+FAQ?t=anon
原文:http://www.oracle.com/technology/global/cn/pub/notes/technote_php_instant.html
Oracle 10g Instant Client(免费下载)是PHP 与远程 Oracle 数据库连接的最简单方式,它只需要安装三个库。
PHP 访问 Oracle 的当前 API 所使用的 Instant Client 库称作 OCI8.(此 C 接口的名称最早是在 Oracle8 中引入的。)PHP Oracle 8 函数 可以直接调用 Oracle 8.1.7、9.x 或 10.x,或者也可以为了方便起见,使用可选的抽象类,如 PEAR MDB2 和 ADOdb。
Instant Client 也可以使用老版本的 PHP“oracle”扩展,但它调用不赞成使用的 Oracle API。PHP 界或 Oracle 建议不要使用此扩展进行新的开发。
要在 Apache 上将 Instant Client 与 PHP 4 或 连用,请遵循以下步骤。需要一个现有的 Oracle 数据库;Instant Client 不提供 Oracle 数据库。通常情况下,此数据库将位于其他计算机上。如果数据库位于本地,则 Oracle 组件一般早已可用,从而不需要 Instant Client。
软件需求:
软件 |
附注 |
Oracle Instant Client |
下载“Instant Client Package - Basic”。在 Linux 上,还应下载“Instant Client Package - SDK”。 |
Apache HTTPD Server |
PHP 界仍推荐 Apache 1.3 |
PHP — PHP 超文本处理器 |
4.3 版或更高版本 |
在 Windows 上启用 PHP OCI8 扩展
Instant Client 二进制文件是 PHP 的 Windows 预构建二进制文件的补充。
-
下载 PHP 二进制压缩文件(不是安装程序版本)和 Apache。按照 PHP 手册中的 Windows 系统上的安装安装它们。OTN 的开放源代码开发人员中心包含有用背景资料的链接,如“在 Windows 2000/XP 上安装 Oracle、PHP 和 Apache”,它介绍了如何安装传统、完整的 Oracle 10g 版本(Instant Client 不需要此版本)。
继续操作之前检查 PHP 是否正常运行。此阶段未启用 Oracle 支持。
-
从 OTN 的 Instant Client 页面下载用于 Windows 的 Instant Client Basic 程序包。此压缩文件的大小大约为 30MB。
-
创建一个子目录(例如,c:\instantclient10_1),然后从压缩文件中复制以下库:
- oraociei10.dll
- orannzsbb10.dll
- oci.dll
这三个文件的总大小大约为 80MB。
要使用 PHP 老版本的“oracle”扩展(在 php.ini 中使用“extension=php_oracle.dll”启用),则复制 ociw32.dll 而非 oci.dll。
-
编辑此环境,将 c:\instantclient10_1 添加到 PATH 中(位于其他 Oracle 目录之前)。
例如,在 Windows 2000 上,依次单击“开始”->“设置”->“控制面板”->“系统”->“高级”->“环境变量”,编辑系统变量列表中的 PATH。
如果使用了 tnsnames.ora 文件定义 Oracle Net 服务名称,则将 tnsnames.ora 复制到 c:\instantclient10_1,并将用户环境变量 TNS_ADMIN 设置为 c:\instantclient10_1。也可以在用户环境变量 LOCAL 中定义默认的服务名称。
设置必要的 Oracle 全球化语言环境变量,如 NLS_LANG。如果没有设置,则使用默认的本地环境。有关更多详细信息,请参见 Oracle PHP 应用程序全球化概述。
无需设置不必要的 Oracle 变量,如 ORACLE_HOME 和 ORACLE_SID。
-
编辑 php.ini,并不要将 OCI8 扩展设为注释:
extension=php_oci8.dll
将 extension_dir 指令设置为完整的 PHP 扩展 DLL 路径。在 PHP 4 中,DLL 位于 PHP 软件的“extensions”子目录中。在 PHP 5 中,它们位于“ext”中。
-
重新启动 Apache。
要检查是否配置了扩展,请在 web 服务器可以读取的地方创建一个简单的 PHP 脚本。
<?php
phpinfo();
?>
使用“http://”URL 将此脚本加载到浏览器中。浏览器页面应包含一个显示“OCI8 Support enabled”的“oci8”部分。
在 Linux 上启用 PHP OCI8 扩展
要在 Linux 上添加 Oracle 连接,需要重新编译 PHP。
开放源代码开发人员中心包含有用背景资料的链接,如在 Linux 上安装 Oracle、PHP 和 Apache,它介绍了如何安装传统、完整的 Oracle 10g 版本(Instant Client 不需要此版本)。
- 下载并安装 Apache。例如,在您的主目录中安装它:
cd apache_1.3.31
./configure --enable-module=so --prefix=$HOME/apache --with-port=8888
make
make install
编辑 $HOME/apache/conf/httpd.conf 并添加:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
-
下载并解压缩 PHP。
-
从 OTN 上的 Instant Client 页面下载 Basic 和 SDK Instant Client 程序包。这两个 RPM 的总大小大约为 30MB。
-
以 root 用户的身份安装 RPM。
rpm -Uvh oracle-instantclient-basic-10.1.0.3-1.i386.rpm
rpm -Uvh oracle-instantclient-devel-10.1.0.3-1.i386.rpm
第一个 RPM 将 Oracle 库置于 /usr/lib/oracle/10.1.0.3/client/lib 中,第二个 RPM 在 /usr/include/oracle/10.1.0.3/client 中创建头 (header)。
- 备份此补丁,然后将它应用于 PHP 的 ext/oci8/config.m4。该补丁的行号是基于 PHP 4.3.9 的。如果已修复了 PHP 错误 31084(很有可能已在 PHP 4.3.11 和 5.0.4 中修复),则不需要此补丁。
如果使用的是 PHP 4.3.9 或 4.3.10,则可以将此补丁保存到一个文件中(如 php_oci8ic_buildpatch),然后使用以下命令安装它:
patch -u config.m4 php_oci8ic_buildpatch
此补丁创建一个新的 PHP 配置参数:--with-oci8-instant-client[=DIR].在 Linux 上,默认情况下,它使用从 RPM 中安装的最新版本的 Instant Client。可以指定 Oracle 库所在的目录来使用其他版本。无论在哪种情况下,都将自动使用正确的 SDK 头。
新参数与现有的 --with-oci8 参数互斥。
例如:在非 Linux 平台上,将 Instant Client 程序包解压缩到您所选择的目录中。--with-oci8-instant-client 参数将需要明确指定此目录;例如,--with-oci8-instant-client=/home/instantclient10_1。应将 Instant Client SDK 解压缩到与基本程序包相同的目录中,以便修改后的配置脚本可以找到头文件的子目录。
- 在顶层 PHP 目录中重新构建“configure”脚本。
cd php-4.3.9
rm -rf autom4te.cache config.cache
./buildconf --force
-
使用新选项运行 configure。此示例使用安装在主目录中的 Apache。
./configure \
--with-oci8-instant-client \
--prefix=$HOME/php --with-apxs=$HOME/apache/bin/apxs \
--enable-sigchild --with-config-file-path=$HOME/apache/conf
-
重建 PHP。
make
make install
-
将 PHP 配置复制到 --with-config-file-path 指定的位置
cp php.ini-recommended $HOME/apache/conf/php.ini
- 将 LD_LIBRARY_PATH 设置为 /usr/lib/oracle/10.1.0.3/client/lib 并重新启动 Apache。
如果使用了 tnsnames.ora 文件定义 Oracle Net 服务名称,则将 TNS_ADMIN 设置为包含此文件的目录。
启动 Apache 之前应设置所有 Oracle 环境变量。以下脚本可以帮助完成此操作:
#!/bin/sh
APACHEHOME=/home/apache
LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib:${LD_LIBRARY_PATH}
TNS_ADMIN=/home
export LD_LIBRARY_PATH TNS_ADMIN
echo Starting Apache
$APACHEHOME/apachectl start
要确认是否配置了扩展,请在 web 服务器可以读取的地方创建一个简单的 PHP 脚本。
<?php
phpinfo();
?>
使用类似“http://localhost:8888/<path>/phpinfo.php”的 URL 将此脚本加载到浏览器中。浏览器页面应包含一个显示“OCI8 Support enabled”的“oci8”部分。
连接到 Oracle
Oracle 连接信息被传递给 OCILogon() 来创建连接。与 Instant Client 关联的工具通常“远离”任何数据库服务器,因此必须将 Oracle Net 连接标识符与用户名和口令一起使用。对于已建立的 Oracle 数据库,连接信息有可能是众所周知的。对于新系统,此信息由 Oracle 安装程序在安装数据库时提供。此安装程序应配置了 Oracle Net 和创建了一个服务名称。
在新数据库中,可能需要将演示模式(如 HR 用户)解除锁定并向其提供口令。也可通过在 SQL*Plus 中以 SYSTEM 用户身份连接并执行以下语句来完成此操作:
ALTER USER 用户名 IDENTIFIED BY 新口令 ACCOUNT UNLOCK;
将连接信息传递给 PHP 有多种方法。第一个示例使用 Oracle 10g的 Easy Connect 语法连接到 在 mymachine 上运行的 MYDB 数据库服务中的 HR 模式。不需要 tnsnames.ora 或其他 Oracle Network 文件:
$c = OCILogon('hr', 'hr_password', '//mymachine.mydomain/MYDB');
有关 Easy Connect 的语法,请参见 Oracle 的使用 Easy Connect 命名方法文档。
或者,如果 /home/tnsnames.ora 包含:
MYDB =
(DESCRIPTION=
(ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1521))
(CONNECT_DATA=
(SERVER = DEDICATED)
(SERVICE_NAME = MYDB)
)
)
且 TNS_ADMIN 环境变量设置为 /home(在启动 Apache 之前),则连接字符串可以为:
$c = OCILogon('hr', 'hr_password', 'MYDB');
如果环境变量 LOCAL(在 Windows 上)或 TWO_TASK (在 Linux 上)设置为 MYDB,则可以使用以下代码生成与 MYDB 连接:
$c = OCILogon('hr', 'hr_password');
使用 Oracle
当基本连接可以使用时,试着运行一个简单的脚本 testoci.php。根据您的数据库修改该连接的详细信息并在浏览器中加载它。此示例列出了用户 HR 拥有的所有表:
<?php
$conn = OCILogon("hr", "hr_password", '//mymachine.mydomain:port/MYDB);
$query = 'select table_name from user_tables';
$stid = OCIParse($conn, $query);
OCIExecute($stid, OCI_DEFAULT);
while ($succ = OCIFetchInto($stid, $row)) {
foreach ($row as $item) {
echo $item." ";
}
echo "<br>\n";
}
OCILogoff($conn);
?>
故障诊断
Oracle PHP 故障诊断常见问题解答包含有关连接 Oracle 的有用信息。
可以从 Instant Client 页面下载 Oracle 的 SQL*Plus 命令行工具来帮助解决环境问题和连接问题。另请参见 SQL*Plus Instant Client 版本说明。
检查 SQL*Plus 使用的环境是否与 phpinfo.php 显示的环境相同。
Windows 帮助
如果 phpinfo.php 脚本没有生成显示“OCI8 Support enabled”的“oci8”部分,则确认在 php.ini 中没有将“extension=php_oci8.dll”设为注释。
如果 PATH 设置错误,或找不到 Oracle 库,则启动 Apache 将显示警告:“在指定的路径中找不到动态链接库 OCI.dll。”phpinfo() 页面的 Environment 部分将显示 PATH 的值以及 PHP 实际使用的 Oracle 变量。
如果 php.ini 的 extension_dir 指令不正确,则在启动 Apache 将显示警告:“PHP 启动:无法加载动态库 php_oci8.dll。”
Linux 帮助
仔细检查是否正确修复了 config.m4。如果“configure”失败,则检查 config.log 文件。还原 config.m4,删除缓存文件,运行 ./buildconf --force and configure,验证问题是否与所做的更改相关。
确保“configure”上的时间戳是当前的。删除所有缓存文件,并在必要时重建它。
在启动 Apache 的 shell 中设置所有必要的 Oracle 环境变量。
结论
希望本文对您能有所帮助。您可以在 OTN Instant Client 或 PHP 论坛上发表问题和建议。
其实这些东西都是根据网上的资料来解决的。
那些下载字符串,在去除协议后,都是采用BASE64加密过,所以,先解密一下,再处理,就很方便了。
其中,迅雷是在解密后的字符串两头加了“AA”和“ZZ”两个字符串
flashget则是加了[FLASHGET]标签
QQ则最简单,啥也没加,解密后就能用。
flashget在处理前,需要先把&以后的字符串全部清空再作Base64的解密转换。
不多说,源码如下:
PHP代码
- function decode ( $string )
- {
- $exp = explode( "://", $string );
- $type = strToLower( $exp[0] );
- if ( $type == 'thunder' ){
- return str_replace(array("AA","ZZ"),"",base64_decode( $exp[1] ));
- }else if ( $type == 'flashget' ){
- $exp[1] = subStr( $exp[1], 0 , strPos( $exp[1], '&' ) );
- return str_ireplace("[flashget]","",base64_decode( $exp[1] ));
- }else if ( $type == 'qqdl' ){
- return base64_decode( $exp[1] );
- }
- }
以前也曾经转载过关于BASE64方面的文章,那时候仅仅介绍了原理啥的。这回我找来的内容是如何实现的。。。
通过google找来了javaeye上的文章,他写了转载自xxx,进入xxx的页面,他告诉我转载自yyy每个人在转载的时候都去掉了一些内容。基于这样的现状,我。。。
不想转载了,贴出几个地址,自己看吧。
javaeye:http://chmod777.javaeye.com/blog/320301
xxx:http://www.cnblogs.com/yiki/archive/2009/01/18/1377828.html
yyy:http://www.cnblogs.com/reonlyrun/archive/2006/12/29/640991.html
这些实现在PHPer看来都是学习的经验,但phper根本不需要进行这些,因为php自带了base64_encode,base64_decode函数。
我要说的是,如何将加密的后的字符串在URL里传递,众所周知,base64中有三个特殊字符:"/,+,=",其中,=是补位码,/和+的标准字符,但/和=在URL里有着特定的意义,如果放到URL里,可能会被当成其他功能进行处理 。
于是,写了一个小函数进行了转换:
PHP代码
- function exchange ( $string , $reverse = false )
- {
- if ( $reverse === false ){
- return str_replace( array("/","+","="), array(":","|",";"), $string );
- }else{
- return str_replace( array(":","|",";"), array("/","+","="), $string );
- }
- }
其实功能很简单,无非就是把这三个有特殊意义的字符转换成在URL里不被解析的三个字符,只要不和base64所规定的字符相关,也不是URL处理中的特殊字符,这三个字符你可以替换成你平时喜欢用的字符。。。