分类目录归档:程序生活

Program Life – Web

转一篇-十天学会PHP

十天学会PHP之第一天

以前写了十天学会ASP,十天学会ASP.NET什么的,现在想想 再写个PHP吧,也算比较全了。 PHP的调试方法我这里就不说了,外面很多文章都有介绍,也有很多不同的组合。我这里暂时是以 Apache web server 和 MY SQL 作为WEB服务器和数据库,在php-4.3.3下的环境做的程序。当然要简单的构建和访问查看数据库 PHPMYADMIN 不可少。

至于表单设计什么的,我这里也不想多说了,在《十天学会ASP》中已经有介绍。

下面简单介绍一下PHP的语法。

1、嵌入方法:

类似ASP的<%,PHP可以是<?php或者是<?,结束符号是?>,当然您也可以自己指定。

2、引用文件:

引用文件的方法有两种:require 及 include。
require 的使用方法如 require(“MyRequireFile.php”); 。这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

include 使用方法如 include(“MyIncludeFile.php”); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

3、注释方法:

<?php
echo “这是第一种例子。\n” ; // 本例是 C++ 语法的注释
/* 本例采用多行的
注释方式 */
echo “这是第二种例子。\n” ;

echo “这是第三种例子。\n” ; # 本例使用 UNIX Shell 语法注释
?>

4、变量类型:

$mystring = “我是字符串” ;
$NewLine = “换行了\n” ;
$int1 = 38 ;
$float1 = 1.732 ;
$float2 = 1.4E+2 ;
$MyArray1 = array( “子” , “丑” , “寅” , “卯” );

这里引出两个问题,首先PHP变量以$开头,第二PHP语句以;结尾,可能ASP程序员会不适应。这两个遗漏也是程序上大多错误所在。

5、运算符号:

数学运算: 符号 意义
+ 加法运算
– 减法运算
* 乘法运算
/ 除法运算
% 取余数
++ 累加
— 递减

字符串运算:

运算符号只有一个,就是英文的句号。它可以将字符串连接起来,变成合并的新字符串。类似ASP中的&
<?

$a = “PHP 4” ;
$b = “功能强大” ;
echo $a.$b;
?>
这里也引出两个问题,首先PHP中输出语句是echo,第二类似ASP中的<%=变量%>,PHP中也可以<?=变量? >。

逻辑运算:

符号 意义
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于
&& 而且 (And)
and 而且 (And)
|| 或者 (Or)
or 或者 (Or)
xor 异或 (Xor)
! 不 (Not)

今天就说到这里,明天说一下流程控制。


十天学会PHP之第二天

继续阅读

java.lang.OutOfMemoryError: PermGen space及其解决方法(转)

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。
说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

  在tomcat中redeploy时出现outofmemory的错误. 可以有以下几个方面的原因: 
1, 使用了proxool,因为proxool内部包含了一个老版本的cglib. 
2, log4j,最好不用,只用common-logging 
3, 老版本的cglib,快点更新到最新版。
4, 更新到最新的hibernate3.2 3、

这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。

一、 java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

继续阅读

[转]GAE Java中用SQL操作Datastore

GAE支持Java对很多java开发者来说是一个非常令人兴奋的消息。做应用存储是少不了的,Google给的答案是Datastore。它和我们以往使用的关系型数据库有很大不同,你不需要创建表,可以直接进行添加、修改、删除等操作。Google说datastore是分布式的,可以提供很好的伸缩性,易于扩展。

  

Google的datastore对java的api有三种:JDO、JPA、LowApi,JDO和JPA是建立在LowApi之上的。这api功能比较有限,我们不能像使用关系型数据库一样用SQL操作datastore中的内容。

  

HGSQL是一个虚拟数据库引擎,它提供了强大的SQL处理能力。它针对Google Datastore发布了一个接口API,该API也是建立在LowApi之上。http://hgsql4gae.appspot.com/是该API的演示,你可以在上面输入SQL语句进行操作里面存储的数据。

  

1、插入测试数据

  

  

    

insert into 员工 (编号, 姓名, 职位, 上级, 出生日期, 工资, 奖金, 部门) values ('0001', '王东', '职员', '0013', '1980-02-05', '800', '0', '20');

  

  
  

2、执行一个简单查询
  

select * from 员工 order by 编号

3、执行一个比较复杂查询

  

select *from (select *from (select 编号,姓名, 部门, 职位, 工资from 员工union allselect '', '', 部门, 职位, sum(工资)from 员工group by rollup(部门, 职位)))order by nvl(部门, char(65535)),nvl(职位, char(65535))

4、删除数据

  

delete from 员工

HGSQL forGoogle Datastore的使用非常简单,首先从http://hgsql4gae.appspot.com/中下载接口程序包hggds.jar,然后加入到你的GAE项目中,调用类com.hg.gds.HgGds中的query和execute方法就可以了。语法参考:http://www.hgsql.com/down/SQL参考手册.pdf

【转】合格程序员每天每周每月每年应该做的事

程序员每天该做的事

  

1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多

  

2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作

  

3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢

  

4、考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍

  

5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示

  

6、记住一位同事的名字及其特点 你认识公司的所有同事吗?你了解他们吗?

  

7、清理自己的代码 今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?

  

8、清理自己的桌面 当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净

  

程序员每周该做的事

  

1、向你的老板汇报一次工作 让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定

  

2、进行一次自我总结(非正式) 这周之内自己表现得怎么样?该加分还是扣分?

  

3、制定下周计划 把下周要做的事情列出来,一样要分清楚优先级

  

4、整理自己的文件夹、书柜和电脑文件 把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉

  

5、与一个非公司的朋友沟通 它山之石,可以攻玉

  

6、看一本杂志 找一本适合自己的专业杂志、

  

7、纠正自己或同事一个细节上的不正确做法 《细节决定成败》看过了吗?没看过强烈建议先看看

  

程序员每月该做的事

  

1、至少和一个同事一起吃饭或喝茶 不光了解自己工作伙伴的工作,还要了解他们的生活

  

2、自我考核一次 相对正式地考核自己一下,你对得起这个月的工资吗?

  

3、对你的同事考核一次 你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?

  

3、制定下月的计划,确定下月的工作重点

  

4、总结自己工作质量改进状况 自己的质量提高了多少?

  

5、有针对性地对一项工作指标做深入地分析并得出改进的方案 可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。

  

6、与老板沟通一次 最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点

  

程序员每年该做的事

  

1、年终总结 每个公司都会做的事情,但你真正认真地总结过自己吗?

  

2、兑现给自己、给家人的承诺 给老婆、儿子的新年礼物买了没有?给自己的呢?

  

3、下年度工作规划 好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干?

  

4、掌握一项新技术 至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。 掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog

  

5、推出一种新产品 可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的

  

6、与父母团聚一次 常回家看看,常回家看看

用C语言打印一个菱形-公式法

今天和我新浪微博的一位好友Misacat聊起了C语言,用C语言打印一个菱形,今天上午抽空写了写,好久没有写C语言,竟生疏了很多…
其实这些打印类的问题,都能用一个固定的方法来做,我把它叫做“公式法”,打印类的题目都可归结为在一个平面打印一个图形,这个图形由星号组号。再进一步说,无非就是两种情况,打印一个空格,或者打印一个星号。不同的打印空格和星号的规则不同,就打印成了不同的图形。说到这里就更好理解了,一个平面图形是由什么构成的?就是纵坐标和横坐标,将它们定义为两个变量,i和j.这样任何的打印问题都可以由两个for循环来做
for(int i=0;i<M;i++){//这个是扫描i即纵坐标,就构成了一条线
   for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
                         //这样就构成了一个面
       method(){}:
    }
}
那个method()方法其实在定义了一个i即横坐标之后,相应的纵坐标的规则,一般的打印都是有规则的,有了i,一定有个相应的规则来求出j。不会有人无聊到打印一个毫无规律的东东吧。即一定可以写出 j = getJMethod(i);这样的一个方法。
有了j=getJMethod(i);的方法就好办了,在内层循环里一个一个匹配吧,如果符合j=getJMethod(i)的,就打印一个星号,如果不符合,就打印一个空格。如下所示:
for(int i=0;i<M;i++){//这个是扫描i即综坐标,就构成了一条线
   for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
                         //这样就构成了一个面
       method(){
          if(j==getJMethod(i)) print("*");
          else print(" ";)
       }
    }
    print("\n");//打印完一整行后,别忘了打印一个换行符。    
}
下面我们就可以套用这个公式来完成这个题目了,完整C语言代码如下,相信聪明的你一定可以读懂的:)
#include <stdio.h>

int main()
{
  int i;
  int j;
  for(i=1;i<=7;i++)
  {
     if(i<=4){//前4行
         for(j=1;j<=7;j++){//打印每一行的星号或者空格
             int temp=i-1;
             /*
             *找规律,i=1时,即第一行,是第4个位置星号,其他地方空格
             *第二行,是4,5,6三个位置星号,其他地方空格
             *第三行,是2,3,4,5,6五个位置星号,其他地方空格
             *所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
             */
             if(j>=4-temp&&j<=4+temp) printf("*");
             else printf(" ");
         }
         /**打印完以后有回车*/
         printf("\n");
     }
     else //后三行
     {
         for(j=1;j<=7;j++){
             int temp=7-i;
             /*
             找规律,i=5时,即第五行,是第3,4,5个位置星号,其他地方空格
             第二行,是4,5,6三个位置星号,其他地方空格
             第三行,是2,3,4,5,6五个位置星号,其他地方空格
             所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
             */
             if(j>=4-temp&&j<=4+temp) printf("*");
             else printf(" ");
         }
         printf("\n");
     }            
  }
  system("PAUSE");    
  return 0;
}打印完的界面如下:

这时一定有朋友说了,“这个太复杂了,打印菱形我有更好的办法,比这个简洁多了”,没错,你说的是对的。我只是抽象出了一种公共的方法,以后无论任何打印的问题,都是可以这么做的,可谓是个万能方法。
我之前写过一篇“用java打印一个圆”,用的就是这个方法。
好了,希望我这个公式法可以对你有所帮助:-)

php小数取整的方法

1.丢弃小数部分,保留整数部分
php: intval(7/2)
js:parseInt(7/2)

2.向上取整,有小数就整数部分加1
php: ceil(7/2)
js: Math.ceil(7/2)

3,四舍五入.
php: round(7/2)
js: Math.round(7/2)

4,向下取整
php: floor(7/2)
js: Math.floor(7/2)

js 取得 Unix时间戳(Unix timestamp)

js 取得 Unix时间戳

Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix 系统、类Unix系统中,也在许多其他操作系统中被广告采用。

目前相当一部分操作系统使用32位二进制数字表示时间。此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为10000000 00000000 00000000 00000000, 发生溢出错误,造成系统将时间误解为1901年12月13日20时45分52秒。这很可能会引起软件故障,甚至是系统瘫痪。使用64位二进制数字表示时间 的系统(最多可以使用到格林威治时间292,277,026,596年12月04日15时30分08秒)则基本不会遇到这类溢出问题。

  

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

Java time
JavaScript Math.round(new Date().getTime()/1000)
getTime()返回数值的单位是毫秒
Microsoft .NET / C# epoch = (DateTime.Now.ToUniversalTime().Ticks – 621355968000000000) / 10000000
MySQL SELECT unix_timestamp(now())
Perl time
PHP time()
PostgreSQL SELECT extract(epoch FROM now())
Python import time 然后 time.time()
Ruby 获取Unix时间戳:Time.now Time.new
显示Unix时间戳:Time.now.to_i
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, GETUTCDATE())
Unix / Linux date +%s
VBScript / ASP DateDiff("s", "01/01/1970 00:00:00", Now())
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e "print time"

  

如何在不同编程语言中实现Unix时间戳(Unix timestamp) → 普通时间?

  

Java String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(Unix timestamp * 1000))
JavaScript var unixTimestamp = new Date(Unix timestamp * 1000) 然后 commonTime = unixTimestamp.toLocaleString()
Linux date -d @Unix timestamp
MySQL from_unixtime(Unix timestamp)
Perl my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]
PHP date(‘r’, Unix timestamp)
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE ‘epoch’ + Unix timestamp) * INTERVAL ‘1 second’;
Python import time 然后 time.gmtime(Unix timestamp)
Ruby Time.at(Unix timestamp)
SQL Server DATEADD(s, Unix timestamp, ‘1970-01-01 00:00:00’)
VBScript / ASP DateAdd("s", Unix timestamp, "01/01/1970 00:00:00")
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e "print scalar(localtime(Unix timestamp))"

【转载】QQ农场数据分析

最近QQ农场很火,昨天晚上在家研究起QQ农场来。对于Web应用,交互的数据还是很好分析的。要分析QQ农场,我主要使用到的工具有,HTTP协议抓包工具,我用的是firefox上插件jerad’s web recorder,这个东东非常好用。swf反编译工具,我使用的是SWFDecompiler。

当进入农场时,例如请求获取到的数据为:

{“farmlandStatus”:[{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359728,”r”:1255359728},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359726,”r”:1255359726},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359700,”r”:1255359700},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359727,”r”:1255359727},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359726,”r”:1255359726},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359700,”r”:1255359700},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359729,”r”:1255359729},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359726,”r”:1255359726},{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359725,”r”:1255359725}],”items”:{“1”:{“itemId”:213},”2″:{“itemId”:214},”3″:{“itemId”:215},”4″:{“itemId”:216}},”exp”:10852,”weather”:{“weatherId”:3,”weatherDesc”:”\u96e8\u5929″},”serverTime”:{“time”:1255434832},”user”:{“uId”:7174870,”userName”:null,”money”:18353,”headPic”:null,”exp”:10852,”yellowlevel”:0,”yellowstatus”:0,”canbad”:50,”pf”:false},”cacheControl”:{“seed”:7,”tool”:1,”diy”:2},”a”:true,”b”:0,”c”:false,”task”:{“taskId”:0,”taskFlag”:0}}

通过反编译flash,可以在Main_v_10.swf与happyfarm_v_1.swf中破译上面这么怪异的表述,看来开发人员还是蛮有水平的,充分为了节省网络流量,用一个字母来表示。

farmlandStatus中有9块地正在使用。每块地的数据分析:
{“a”:10,”b”:1,”c”:0,”d”:0,”e”:1,”f”:0,”g”:0,”h”:1,”i”:100,”j”:0,”k”:0,”l”:0,”m”:0,”n”:[],”o”:0,”p”:[],”q”:1255359728,”r”:1255359728},

a:种子的编号
b:地的状态,1表示有植物在种
c:曾经是否有草
d:曾经是否有虫子
e:曾经是否干旱
f:大于0有草
g:大于0有虫子
h:等于0干旱
i:优秀程度
j:采摘的次数
l:大于0叶,最小能偷多少?这个不能太确认
m:大于0时,表示还剩下多少个
n:偷过我果实的好友uid列表
0:施肥的次数
p:动作?
q:作物播种时间点

r:更新时间点

用户数据分析:
“user”:{“uId”:7174870 ,”userName”:null,”money”:18353,”headPic”:null,”exp”:10852,”yellowlevel”:0,”yellowstatus”:0,”canbad”:50,”pf”:false},
uid:你的QQ号码在农场中的编号
money:表示用户的金币
exp:表示用户的经验,等级是根据经验计算出来的
yellowlevel,yellowstatus跟黄钻用户相关,偶不是黄钻。

一些URI,其中每个URI都有和farmTime与farmKey,其中farmTime为提交的时间点,既然每次要提交farmTime,那farmKey的加密码规则肯定与它有关,可能是MD5(farmTime+密钥)

下面我是抓包得到的farmKey 与farmTime

farmKey    52363cfa7e60658be05db5fce363416d
farmTime    1255434831

# 进入农场:

api.php?mod=user&act=run

# 获取所有好友
api.php?mod=friend&farmKey=%s&farmTime=%s&inuId=”
body=({“refresh”:”true”})

# 获取某好友信息
api.php?mod=user&act=run&flag=1&farmKey=%s&farmTime=%s&inuId=’
body={‘ownerId’:fid}

# 浇水 fid: 用户ID place:土地编号
api.php?mod=farmlandstatus&act=water&farmKey=%s&farmTime=%s&inuId=’
body={‘ownerId’:fid,’place’:place}

# 除草 fid:用户ID place:土地编号
api.php?mod=farmlandstatus&act=clearWeed&farmKey=%s&farmTime=%s&inuId=’
body={‘ownerId’:fid,’place’:place}

# 杀虫
api.php?mod=farmlandstatus&act=spraying&farmKey=%s&farmTime=%s&inuId=’
body={‘ownerId’:fid,’place’:place,’tId’:0}

# 获取商店列表
api.php?mod=repertory&act=getSeedInfo&farmKey=%s&farmTime=%s&inuId=’

# 查看自己购买的物品
api.php?mod=repertory&act=getUserSeed&farmKey=%s&farmTime=%s&inuId=’

# 翻土
api.php?mod=farmlandstatus&act=scarify&farmKey=%s&farmTime=%s&inuId=’
body={‘ownerId’:fid,’place’:place}

# 种植
api.php?mod=farmlandstatus&act=planting&farmKey=%s&farmTime=%s&inuId=’
body={‘cId’:cid,’ownerId’:uid,’place’:place}

经过反复地抓取数据分析,最后还是能够分析出farmkey的加密规则,原来是这样的:

MD5(farmtime + “密钥”.substr(farmtime% 10)),密钥这里就不说了,免得腾讯对我个小博客来点什么的。