开发背景

Pvz指的是Plants vs Zombies,也就是知名手机游戏植物大战僵尸2。

随着对游戏的了解,感觉可以通过辅助工具让游戏玩得更轻松。

要注意要是本项目针对的是自己玩的iOS端,但Android端的账号和游戏服务器等都是iOS端分离的,不在适用范围内。

项目的运行不需要设备越狱。

本机存档

游戏本身有两种存档。为了不跟主题混淆,称为云端存档和手机存档。

云端存档就是玩家在游戏服务商的游戏服务器里的游戏存档。云端存档可以让玩家在iOS设备,普遍是iPhone、iPad之间迁移游戏存档,还有就是因恢复出厂设置、设备丢失等原因丢失游戏数据后可以从云端重新下载游戏存档。

手机存档就是指游戏在手机里的存档数据。游戏是可以离线玩的,离线玩的时候使用的就是手机存档。手机存档会经常自动与云端存档同步。

云端存档是用户是拿不到的,而手机存档在设备没有越狱的前提下也是拿不到的,这给备份游戏数据带来了麻烦。

而本机存档,就是项目在游戏官方认可的云端存档和手机存档之外,建立的第三种存档。

理论上,可以通过本机存档,可以让新手账号直接达到满级,获取海量游戏金币等作弊功能。

我开发此功能的主要目的,主要就是在不越狱的前提备份存档,还有在竞速比赛排名上,通过快速布阵来提升自己的排名。

游戏本身的规则是需要一关一关打下去才能获得需要的植物的,但我通过本机存档可以直接一开始就可以获取满植物。

阵型快速切换

还有就是,随着比赛难度的增加,前期阵形与后期阵形是不一样的。

前期阵形主打快速通关,各种暴力输出。但是随着难度的增加,各种暴力输出都会变得无力。所以后期阵型主打的是稳定通关。

可以这么认为,后期阵型虽然稳定但不能快速通关,所以在前期使用会导致通关变慢,从而使排名下降。而前期阵型在后期则无法通关。

而解决方法,就是在本项目里,通过快速切换本机存档来快速更换阵型。

再举一个通俗一点的例子吧,例如英雄联盟,相信很多人都玩过。

游戏前期的时候,对方的血量防御都比较低,这时候一般是用固定攻击,这样会比较有效果。如果这时候用百分比攻击,打个半天,是吃力不讨好。

但到了游戏后期,对方的血量和防御都达到了一个非常高的水平。这时候使用固定攻击,几乎无法让对方受到实质上的伤害,这时候就要使用百分比攻击了。

无尽挑战补充

在竞赛的时候,植物是有限制的,只能在通关以后获得。

但是通关后的获取植物,是类似于抽奖性质的,不一定能得到自己需要的植物。

之前有玩家统计过,要是运气不好的话,要60关以后才可以得到全部植物。

此功能是通过作弊取得自己需要的植物,让通关奖励最大化,20关就可以在竞赛中得到全部植物。

钻石加速载入

这个是本项目中,2个不为作弊而开发的作弊功能之一。

钻石,是指游戏里的货币。

所有充值类游戏都会有明显地方放置一个充值入口,以增加运营收入,包括本游戏。

问题是,在竞赛的时候,这个充值入口被放到一个很容易被误碰到的地方,这个明显是游戏厂商故意的设计。

本来误碰到充值入口,只要关闭就可以了,也不会有什么实质损失。

但是这个充值入口,一但点击就会跟云端通讯,速度快的话也要等2-3秒加载完成后才可以关闭。要是一旦运气不好,服务器连接失败,就得退出游戏重玩,非常的让人不爽。

这功能就是加速通讯,让点到充值入口以后可以在1秒内加载完成并让玩家可以马上关闭。

无尽挑战计时

这是另一个不为作弊而开发的作弊功能。

到了游戏后期,对方的防御和血量达到了一个非常惊人的地步。厂商认为玩家不可能在短时间内通关,所以就用通关时间计测,做为检测玩家作弊的一个手段。

这个在以前还是有效的。然而,随着游戏不断地推出新植物,玩家们不断地开发出新玩法,已经把短时间内不需要作弊而通关变成了现实。

在这个时候,因为厂商的防作弊而把玩家判断为作弊玩家,并取消竞赛成绩,这是非常不人性化的。

更重要的是,经过了这么长时间,也没看到厂商有修改这种不合理防作弊手段的说明与行动。

所以,项目里就增加了计时功能,在竞赛中,可以实现自动开始倒计时,只要在倒计时完成以后再通关,就可以免除取消竞赛成绩的风险。

项目截图

运行效果

在线演示

测试账号:admin

测试密码:admin

测试地址:http://s.dm1.in/7

测试环境下,部分后台设置禁止修改,请见谅。

开发背景

短网址服务,是一种常用的服务,服务的应用范围很广。例如目前知名度比较高的腾讯短网址服务t.cn,淘宝短网址服务tb.cn,谷歌短网址服务goo.gl,twitter的短网址服务t.co。

机缘之下获得了一个3位数的域名,用来做短网址服务是非常适合的。

自己所发表的演示链接,日后的链接地址可能会发生变化,希望通过短网址服务统一管理,实现长效链接。

短网址服务对SEO有负面影响,自己也不可能像某些大公司一样使用一个专用域名,折衷之下就使用了一个较短的二级域名。

主要功能

方便用户输入网址链接。

方便用户分享、推广网址链接。

可以应用在二维码上,减少二维码的复杂度,提高识别率和容错性。

应用在二维码上时,通过DreamShort后台设置,实现〖活码〗功能。

使用说明

  1. 登录系统,本系统仅有后台
  2. 进入网址管理
  3. 添加网址

项目截图

在线演示

测试地址:http://s.dm1.in/G

测试账号:不需要,直接微信扫码登录

测试邮箱:支持163,126,QQMail,Gmail,邮箱IMAP账号无法提供,请自备。

后台地址:仅现场演示

开发背景

电子邮箱,在计算机历史上是一个历史悠久的服务。

现在仍然有很多网站以电子邮箱做为登陆账号、认证、密保工具。

尤其对于外贸企业,电子邮箱是一项非常重要的服务。

对于我个人来说,因为接触网络的时候比较早,也顺势使用过不少邮箱,例如:

Gmail, Hotmail, Yahoo, 163, 126, QQMail, 已经停止服务的中华邮等等,甚至有一些已经遗忘了。

自己的使用习惯上,境内多用QQMail,境外多用Gmail,每月的信用卡账单,服务器月账单,电子钱包等等都是通过电子邮件处理的,一直有计划去统一管理这些邮箱,让信息处理更便捷。

近年来各大电子邮箱都在做IMAP支持,这让不使用WebMail去管理邮箱邮件成为了可能,目前是使用著名邮件客户端ThunderBird来管理邮件,但是也存在一些问题。

最主要的问题,就是Gmail收信,因为国内网络政策关系,Gmail的收信一直不稳定。

要解决Gmail收信困难的问题,必须得把收信服务放到境外,这就意味着不能单靠ThunderBird来解决这些问题。

HTML5的出现,带来的更多的可能性,特别是让即时收信通知成为了可能。但是PHP因为本身的限制,并不适合本项目的开发。在学习Go后,可以把之前的想法实现出来。

微信扫码登录

通过微信扫码登录,让系统在接管了大量邮箱和邮件信息的私密信息前提下,既避免了目前主流的撞库问题,又能更安全方便地登陆,登陆后通过微信通知账号所有人,避免盗号造成损失,尤其是完成了DreamWeixin后,多项目共用微信登陆成为可能,也不会影响到后续其他项目使用同一微信可能产生的问题。

多语言设计

在前公司,曾经做过一个PHP的多语言项目。总经理让我把单一语言设计的简体中文的公司框架后台,做成五国语言任意切换的后台系统。任务我是完成了,唯一不足的是,总经理没有给我前台,只要求我做后台的五国语言,后来可能是把项目给其他同事做了,后面项目如何就不清楚了,反正后续,或者成品,我都没有见过,DreamMail的多语言设计算是弥补这一小遗憾。

另一方面,客户经常需要修改一些前台文本,每次都需要直接修改模板或者修改源代码,于是就考虑到把前台文本放到后台统一管理,把这两个结合起来的成果就是目前的多语言管理模块,以后的所有项目都是基于这个多语言模块设计完成的。

邮件解码

电子邮件于1971年出现,1987年进入中国,已经有将近50年的历史。

也因此,邮件格式异常地多,再加上各种垃圾邮件,不标准邮件,不规范邮件。

也不敢说DreamMail能正常识别所有邮件,但是就目前来说,上线以来,我几个邮箱里的几千封邮件还是可以正常识别出来的。

支持邮箱

目前支持QQ、163、126、Gmail。

如能提供其他邮箱账号,可现场增加其他邮箱支持。

关联项目

DreamWeixin

使用说明

1. 通过微信扫码登录,未注册用户也可以扫码。DreamMail可以自动识别语言,也可以手工选择语言。

2. 根据提示填入邮箱账号及密码。要注意的是,部分邮箱(如QQ)里,IMAP的密码跟登陆密码不一致,而且默认只能收1周内的信件,这需要在邮箱里自行设置。

相关动图

项目截图

后台截图

开发背景

数据备份本来就是很常用的操作。

网站数据库记录已超百万,以前用的备份工具效果不理想,自带的数据备份早因数据过多而失效。多年来一直手工操作备份、打包,操作似乎有点太繁琐,而且有些时候因工作太忙,难免会延误备份。

近年来的开发项目多与数据库相关,随着项目的增加,数据库的增加,备份越来越复杂。

之前有考虑过用PHP做一个备份工具,但始终是不适合,因而一直没有落实。

之前所学的编程语言大都是Windows下的,在Linux下无法很有效地使用。所以,在学习了Go后,发现用来做此项目实在是非常适合,终于可以把之前的想法实现出来。

开发限制

MySQL的备份工具普遍是PHP做的,但是我网站也是用PHP做的。在进行备份时,因为数据量大,备份时间比较长,导致PHP进程一直卡住,进而影响到网站的正常访问。

由于PHP有在线运行这一特性。虽然可以取消,但是需要高权限,而且一旦设置就全局启用,一旦其中一个脚本卡住就很容易导致全部当机,非常不安全。

PHP还有被动运行的特性,不适合做定时任务,尤其是空闲期运行的定时任务。

PHP的开源特性,用于加密解密数据库,实在是不适合。

综上所述,PHP不适合本项目。

定时备份

由于数据备份涉及到大量数据库读取操作,会影响到网站的响应速度。

定时备份有2个方面,一方面是指以固定的周期,对数据库进行备份。

另一方面,是指在固定的时间,对数据库进行备份。

而这个时间,必须是网站访客较少的时间,既能加快备份的速度,又可以减少对网站的影响。

分卷备份

数据库备份工具普遍都有分卷备份功能。

开发的想法是好的,可是,对于大数据的网站,反而不适用。

首先是分卷备份会导致备份时间大幅延长,尤其是对于PHP做的备份工具,会导致整个PHP进程卡住,影响到其他PHP进程,特别是网站的正常运行。

更重要的是,分卷备份对导致大量重复的数据库分页操作,增加数据库负载。而且在备份过期中,不可避免地产生表锁。重复地分页,不断重复的表锁,极大地影响到相关项目的正常运行。也是因为重复地分页操作,导致备份会越来越慢。

在之前的一个企业项目中,就有一个1G多的数据库,开始的时候1秒一个分卷,10个分卷后就1分钟一个,到后面几个小时都备份不了一个分卷。

参数加密

为了方便安装使用,所有配置都是通过命令行参数设置的。

然而要备份数据库,不可避免地需要数据库的账号密码。

但是把相关资料明文放出来,始终有所不妥。最后的解决方法就是加密参数了。

加密算法是通过正反向乱序四次加密的,所以,无论是增、删、篡改密文或部分密文,都无法得到原始数据。

压缩备份

数据库大多数是文本内容,所以有非常可观的压缩率。

经过压缩后,既可以减少空间占用,又加快了传输速度。

这里特意使用了7z压缩,既不需要像RAR一样需要商业授权,也有着比ZIP、RAR更高的压缩率。唯一不足就是压缩时间稍长,但毕竟是在服务器空闲时间处理的,不会影响到其他项目的正常运行。

加密备份

为了数据安全,导出的数据库备份会被加密处理(可选)。

远端备份

数据库备份完成后,会被发送到远端统一处理。

然后用户就可以到远端定时管理、下载数据库备份。

操作流程

1. 准备好相关参数

示例参数

-mysqldump=/usr/mysql/bin/mysqldump -7z=/usr/7z/p7zip -password=123 -dbhost=localhost -dbuser=root -dbpass=root -dbport=3306 -url=http://127.0.0.1:8080/

2. 在服务端生成密文

3. 在数据库服务器上安装客户端,并添加crontab任务

运行效果

开发背景

在开发过程中,免不了要接收第三方通知。

比较典型的,就是在做电子商务时的各种支付网关的推送通知,还有接收微信的推送通知。

接收通知需要公网地址,但是目前的民用网络,是没有公网地址的,这给调试开发带来了很多麻烦。

一些下载软件,例如著名的BT下载,eMule下载等P2P下载工具,也是需要公网地址才能达到最高速,传统方法是通过UPnP来做端口映射。以前的电信是有公网地址的,通过UPnP是可以解决问题,但是现在电信也不分配公网地址了,所以这种方法也随之失效了。迅雷也通过中转服务器,离线服务器等来实现高速下载的。

细心的读者可能发现了,这个项目就是做DreamWeixin之前所必须解决的首要问题。

可以说,没有DreamTunnel就没有DreamWeixin。

数据转发

由于多年的专业路由器、可编程式路由器的操作经验,使我对网络有一定的了解。

项目的关键,就在于数据的转发,也类似于路由器的NAT操作(两种NAT方式这里不讨论)。

实际操作上还是比较复杂的。

而主要原因,就在于路由器的NAT操作是在内网的,路由器可以直接访问到主机,直接做转发还是很方便的。但是我利用的是境外服务器,服务器不在内网,远在美国,甚至还要通过电信→电信内网→路由器,经过重重路障才可以到达目标主机。

通讯加密

因为众所周知的原因,境外网络数据是经过审核的。

虽然我并不发布或接收敏感信息,但数据一多,难免会被误判。

一旦被判断为敏感信息,轻则中断连接几分钟到几小时,重则直接封IP。

为避免这些不必要的麻烦,服务端与客户端的通讯是全程加密的。

项目演示

CS架构的项目,且属于纯命令行项目,不方便在线演示,可现场演示。

演示账号

因为有真实项目在DreamWeixin下运行着,仅提供前台在线演示,后台可现场演示。

测试账号:demouser

测试密码:demouser

测试地址:https://weixin.dm1.in/

开发背景

在前公司,试用期的第一个项目就是做公司的全新项目:微信分销系统,之后的项目不少都是跟微信有关,遇到一些现有模式下难以解决的问题。

比较典型的,就是需要开发一个基于微信的商城,但是客户的微信资料迟迟拿不到,或者申请不下来导致项目受阻。

公司是有一个微信公众号,但也就只有一个,基本是很难借出来开发使用。

微信系统都是独占式的,特别是分销系统是完全基于微信开发的,没有微信开发账号几乎无法运行。

不说和同事一起运行微信系统就会各种错误,开发任务都是一边上线运行一边开发的,稍一不慎就会影响到线上系统的运行。

一个客户,要求他一个微信商户号做他旗下2个网站的支付,等等…

个人的多个项目也需要用到微信功能,使一个公众号可以用于多个不同的项目的共同开发运行,已经是当务之急。

关联项目

DreamWeixinMonitor、DreamMail、DreamMonitor、DreamTunnel等…

使用说明

1. 准备好微信官方的 AppID和AppSecret。

2. 添加账号里填入AppID和AppSecret,直接确定。

3. 如果有提示IP错误的话,就把提示里的IP复制到微信公众平台的IP白名单里。如果不需要推送功能的话后面的操作可以跳过。

4. 如果需要推送服务的话需要继续填写Token,AESKey。如果是之前没有使用过的话可以直接点右侧随机生成。

5. 加解密方式请选择明文模式。DreamWeixin是可以处理加密模式的,但因为我没有认证公众账号,没有办法测试,不推荐使用。

6. 在左侧导航菜单,我的微信里,选择刚才新添加的微信账号。然后把接口配置资料填入微信公众平台。加解密方式请和上一步一致。

程序调用

1. AppID不变,在程序调用里把AppSecret换成DreamWeixin提供的AppSecret(请参考上图微信信息里的AppSecret项目)。

2.请求路径修改,只修改网址部分,其余不变。

例如,原路径为:

https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

修改为:

https://weixin.dm1.in/cgi-bin/menu/create?access_token=ACCESS_TOKEN

简化开发

ACCESS_TOKEN默认是有请求次数限制,和有效期的。但通过DreamWeixin,请求次数不做限制,有效期由DreamWeixin自动管理,也就是说ACCESS_TOKEN不存在有效期,程序可以不处理有效期的缓存等问题。

如果需要刷新ACCESS_TOKEN的话,可以到“修改账号”里,勾选“重新生成AppAppSecret”项目,这样的话AppSecret和ACCESS_TOKEN会一同更新,原AppSecret和ACCESS_TOKEN失效。

DreamWeixin有微信服务器安全验证功能,且每小时会更新微信服务器资料,确保推送信息来自官方。也因此,消息是否加密不会对安全造成影响。

项目截图

开发背景

在DreamWeixin设计之初,就已经预想到以DreamWeixin的功能性质,必然会成为以后多个项目的核心服务。

所以确保DreamWeixin的在线正常运行至关重要,监控服务必不可少。

在我的项目中,担任这项服务的是DreamMonitor,但是DreamMonitor是微信报警,而微信报警时的核心服务又是DreamWeixin,也就是说,当DreamWeixin故障时,DreamMonitor也无法报警,所以DreamWeixin的监控服务无法由DreamMonitor来完成。综上所述,最终决定特别做一个DreamWeixin专用的监控服务。

双向报警

DreamWeixinMonitor保证DreamWeixin的正常,但是一旦DreamWeixinMonitor故障的话,监控服务也无法建立。

所以,为了保证服务的稳健,使用了双向报警设计。DreamWeixin故障时,DreamWeixinMonitor发出报警,DreamWeixinMonitor故障时,DreamWeixin发出报警,二者双辅双成,缺一不可。

地域分布

DreamWeixin和DreamWeixinMonitor的双向报警设计,决定了必须要至少有一方正常运行才可以正常监控的。

因此,二者不可以同时在一台服务器上安装,否则服务器一旦故障,二者都同时无法运行,监控服务就名存实亡了。

在目前的使用中,DreamWeixin为了兼顾对国内的网速,设在美国西部。而DreamWeixinMonitor则放到了美国中部,二者不单是不同机房,地域上分隔了半个美国,甚至连ISP服务商都不一样,可以充分发挥出二者双向监控,双向报警的功能。

监控间隔

DreamWeixin身上肩负着多个项目的核心服务,所以DreamWeixinMonitor对的监控是3-5分钟,随时可调整,以确保服务的正常运行。

但DreamWeixinMonitor只负责DreamWeixin这一个项目,所以优先级就比较低了,DreamWeixin是30分钟,如果发生故障,则转为10分钟,直到服务重新上线,再恢复成30分钟。

随用随走

DreamWeixin和DreamWeixinMonitor二者需要分布在不同的地域上,也可以认为,DreamWeixinMonitor需要避开DreamWeixin所在的地区。因此,一开始DreamWeixinMonitor就被设计成绿色安装,随用随走的模式,现在在美国中部,下一分钟可以在美国东部,美国北部,国内,日本等任意地区迁移,这不会对双向监控造成影响

关联项目

DreamWeixin

运行效果

在线演示

测试账号:demouser

测试密码:demouser

测试地址:http://s.dm1.in/6

开发背景

本程序是针对以前在公司项目中,多次因短信产生各种问题而开发设计的。

短信发送主要分两种,一种是全文短信,另一种是模板短信。

以前因短信延误问题,跟服务商客服沟通。客服说明全文短信属于营销短信,是有人工审核的,导致发送时间可能会延长,也是客户收信延误的根源所在。

程序框架是公司的,整个框架都是基于全文短信设计,修改会导致其他很多的问题。

其中一个比较典型的问题就是短信发送记录,框架是把短信内容复制一遍做的发送记录。但要是换了模板短信,程序里就只剩下模板变量,就没有办法做发送记录了。

当然,实际问题远不止于此。

也因为这样,即使是更换短信服务商,也只能选择同类型的,导致对短信服务商的选择非常有限。

短信模板直接写在程序源码上,要修改短信内容只能修改源码,非常麻烦。

程序里发送短信的地方又非常多且零散。

还有一些短信服务商的政策问题。突然说短信要全部备案,过几天又说句尾要加退订回T,否则不给发等等,来得猝不胜防。

开发目标

  1. 在不修改原有代码,不影响原有业务的前提下,实现原有框架的短信功能的无缝升级。
  2. 可以选择使用目前市面上主流的短信服务商,不再被限制在只能使用固定的短信商。
  3. 以往在人工抽检下,短信延误30-60分钟,甚至直接丢失。通过DreamSMS,不再需要人工审核,客户可以更快速稳定接收短信。
  4. 不修改源程序的前提下,实现短信内容的修改,甚至无缝更换短信服务商。

支持接口

目前支持阿里云短信、云片网、腾讯云、短信宝、Luosimao、云之信、乐信、秒嘀。

在可提供短信账号及接口资料的前提下,可现场添加其他短信接口。

使用说明

1. 添加短信账号,具体参数因短信服务商而有一定区别。

2. 添加短信模板,根据上一步的短信账号,添加相对应的模板。需要注意的是,短信模板的内容直接完整复制过来。

3. 如果短信服务商支持远程获取模板的,只需要填入ID,然后点击远程获取便可,建议优先使用。

4. 请求调用方式,用户主页有详细说明与示例。

项目截图

在线演示

测试账号:admin

测试密码:admin

测试地址:http://s.dm1.in/E

后台地址:http://s.dm1.in/F

开发背景

随着项目的增加,项目的在线检测成为一个问题。

像是以前那样定期把项目跑一遍,既没有效率,也越来越困难。

在前公司发生过几起类似事故。公司的服务器系统一直开着在线更新(不是我管理的,不清楚是不是正版),晚上自动更新完系统后,IIS死机,然后早上收到客户投诉。

于是,在构思这么一种服务,一方面要确保网站服务的正常运行,另一方面要在网站错误的时候及时提醒,方便尽快恢复正常服务。

由于PHP本身的限制,不适合用于本项目的开发,在学习了Go后,可以把之前的想法实现出来。

证书检测

自己的网站,是一个境外的SSL网站。曾经有一次,因为工作太忙,忘记了证书过期时间,导致证书过期后使网站跳出弹窗提示,影响了会员体验,因此本项目特别增加了证书检测服务,防止类似事情再次发生。

微信报警

当本项目检测到异常时,是需要提醒相关人员及时处理的。

在提醒通知的处理上,开始的时候是考虑使用短信通知,但使用短信通知,不但会产生额外费用,在短信备案和短信审核上也很容易遇到各种问题。

专门开发一个APP用于通知,会把事情和项目变得非常复杂,也不适合。

目前基本每人都有安装微信,让相关人员关注公众号后,通过微信发送报警通知,既免费又方便及时,实在是不二之选。

尤其是DreamWeixin完成的现在,让一个公众号可以实现多个完全不同的服务,对应多个完全不同的项目,即使是做为一个公众号的附加功能,也是非常有意义的。

关联项目

DreamShort、DreamMail、DreamWeixin…

使用说明

  1. 在“我的网站”里添加被检测的地址。
  2. 除了404、500、502等常规错误,当服务器访问指定地址时,响应速度晚于10秒的话,会判断为无法连接报警。
  3. 当检测网址为加密网站时,可以打开证书检测功能。证书检测会在证书有效期到达指定期限时报警。
  4. 因为有相当数量的网站使用的是自定义CA证书,DreamMonitor并不对证书的合法性进行验证。
  5. 在短时间内无法排除故障,让服务重新上线的情况下,可以把检测状态修改为“禁用”,待服务重新上线后再重新开始监控。

项目截图