开发背景

6月,一个事件多发的月。
受各种政治事件影响,国际互联网的连接变得非常敏感。
大量IP被封锁,联网工具无法使用,连SSH都无法连接,查资料变得异常困难,严重影响到开发。

工作流程

为了保证兼容性,跟某知名联网工具基本一致。
本地客户端支持HTTP/Socks4/Socks5网络连接,支持Pac模式。

连接合并

与某工具最大的不一样,项目使用的是单一连接。
所有的资源请求在客户端与服务端之间,都会转变为单一连接。
简单地说,就是相当于项目内建了HTTP/2的多路复用加速功能。
在流量干扰严重的情况下,连建立连接都是困难的,浏览器的多个请求的连接建立会变得非常缓慢,甚至失敗。
通过单一连接,不需要多次新建连接,减免了连接握手的时间,可以维持一个相对稳定的网络,也增加了隐匿性。

乱序发送

在服务端与客户端的数据传输上,数据被分拆成多个数据包,乱序发送,再由客户端多线程下载、组装、还原原始数据。
一方面是方便多线程加速下载,另一方面,因为原始数据被打乱了,大量穿插其他数据,所以更难检测出原始数据,增加隐匿性。
因为流量加密,数据分拆乱序,以及TCP分界等的原因,从ISP的角度来看,即使是复制所有连接数据,也无法获得正常的原始文件/加密文件。

白名单

客户端支持白名单功能,结合Pac模式实现黑白名单。
白名单不进行流量加密,直接走本地流量,加速访问。

双向认证

服务端与客户端之间采用证书双向认证。
一方面减少网络攻击,另一方面也可以伪装成普通的SSL/TLS流量。

运行效果

在这个政治事件多发的月份,某工具连接30秒就断开,完全无法使用的情况下,通过DreamSocks可以稳定地浏览国际互联网。

开发背景

在Chrome出世之前,使用了多年的Firefox。Firefox的扩展是一个很好用的功能。
然后,Firefox越来越作死了,先是v29后部分扩展不兼容,经过了一段时间的扩展升级,好不容易解决了。
再来就是v56后,扩展要签名,又分了旧式扩展,直接把多年的扩展给失效了。
多次折腾下来,我这种从Firefox v2版用到v56版多年的死忠也表示受不了。
整个项目,都是因为Frefox的扩展问题而开发的。

关键扩展

我常用的扩展很多,但有2个实在是无法在Chrome上找到替代。
一个是远程控制扩展,也因此产生了DreamRemote项目。
另一个就是Show IP,后面升级为Show Location,再到Firefox v56后就无法使用了。
一直希望能在Chrome上找到替代,然而多年无果。

功能介绍

主要功能是分析网站信息,这对我来说非常重要。
例如获取服务器的IP地址,服务器的地理信息,机房信息等等。

动图演示

项目截图

项目演示

演示地址:http://s.dm1.in/C

开发背景

我自己的网站,是基于用户生成内容(User-generated content,简称UGC)模式开设的。网站的信息内容,都是由用户自行发布、维护的,目前信息总量达到150万条。

其中,有不少信息是用户通过图床发布的。因为网站位于境外,用户也比较喜欢使用Photobucket,Flickr等境外长效图床,也因此存在一些问题。

特别是近年来,图床在大力推广收费策略,导致原有的图片大量失效。

网站上的不少信息,特别是用户的专业翻译文章,有使用到图床,因此遭到损坏,实在是令人痛心疾首。

即使是引导用户改变习惯,但原有的各种精华信息的失效仍然非常令人痛心。

于是便在构思此项目,希望能解决图床因策略调整使图片失效,从而影响到用户发布的图文信息损坏,导致网站内容减少,质量下降的问题。

封锁突破

Photobucket的图片服务是非常长效稳定的,储存了超过10年的图片,现在仍然可以正常打开。但是,由于政策关系,国内铁通/移动网络的用户却无法打开图片。

Flickr在国内则经常因为域名被封锁,导致无法打开图片。

通过DreamPic,实现让图像可以对所有用户正常显示。

弹窗提示

网站是加密网站,当引用非加密内容(通常是外链图片)时,浏览器会出现不友好的弹窗提示。

通过DreamPic,可以实现图片的统一加载,消去这种弹窗提示。

故障容灾

这是一个真实发生的案例。

某知名图床发生故障,约2天无法正常访问。

此时,通过DreamPic让图像服务不中断,网站不受影响正常使用。

分流镜像

DreamPic对外使用(指对其他网站使用),是可以对图床破解,让受限的图像能正常显示。对内使用,通过配置也可以实现一些复杂效果。

DreamPic有图像缓存智能管理功能,通过配置多域名,实现同ISP加载图像。电信的加载电信的图片,联通的加载联通的图片,境内加载境内的图片,境外加载境外图片,让网页的加载速度进一步提高。

相关新闻

注意!受Photobucket政策“勒索”,亚马逊、eBay卖家产品图片受影响

http://www.cifnews.com/article/27242

效果演示

自己的网站不方便演示,就使用在考驾照时,报考网站上的一篇新闻做为示例。

防盗链功能

因项目的特殊性,极易被复制至第三方使用。

为避免被滥用,DreamPic有防盗链功能。

打开防盗链功能的话非指定网站使用就会有相关图像提示。

开发背景

因工作和个人需要,一直有使用远程控制的需求,使用过多款远程控制软件。

在Linux下,SSH能解决绝大部分的问题,但Windows是以GUI为核心设计的,而且软件大部分也是基于GUI设计的,所以命令行模式太弱,无法满足需求。

远程控制软件大部分都是基于CS模式设计,每次都要安装个不小的客户端(例如pcAnyWhere等),我希望的是随用随走,这实在是不方便。

而Windows Server自带的远程桌面功能,会生成一套前台和后台的远程桌面,桌面内容不相通,更重要的是远程桌面下不少软件因为权限、驱动等问题无法正常运行。

最终找到一款可以在网页上运行的远程控制软件,完美解决所有问题,用了好多年。可惜因为浏览器升级关系,不再兼容新版浏览器,非常可惜。

使用过多年的境外服务器,有部分是网页控制台可以直接使用远程功能的。Linux下的终端控制台做得很好,但Windows下只见过一次某服务商提供基于VNC的网页远程控制,但是需要安装Java插件且使用体验极差。

HTML5带来了更多的可能性,通过HTML5来实现一个基于浏览器的随用随走、免安装、免插件的远程控制,就是DreamRemote的开发初衷。

剪贴板

在使用里,经常需要把一些数据复制到远程主机,其中剪贴版文字更是特别多,所以做了这个剪贴板复制功能。

刷新速度

极速:10帧/秒,默认:5帧/秒,普通:2帧/秒,稍慢:1.25帧/秒,最慢: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有微信服务器安全验证功能,且每小时会更新微信服务器资料,确保推送信息来自官方。也因此,消息是否加密不会对安全造成影响。

项目截图