使用EJS进行GUI编程(二)

三月 11, 2015 at 11:04 下午Easton
在上一篇博文《使用EJS进行GUI编程(一)》中我们初步了解了如何使用EJS进行GUI编程,本文将进一步讲解如何使用EJS进行GUI编程。 前一个例子运行之后只是弹出一个窗口,里面有文本框和按钮,并且单击按钮可以触发单击事件。拥有了这些知识后其实你已经有能力制作一个登录窗口了,当然,得出这个结论的前提我是假设读者已经具备一定的前台编程功底,并且会使用AJAX之类的方式进行编程。 1、在进行GUI编程前,我们首先需要了解什么叫控件?      在计算机编程当中,控件(或部件,widget或control)是一种图形用户界面元素,其显示的信息排列可由用户改变,例如视窗或文本框(源于维基百科http://ily.so/RFnq2e)。在EJS内集成了.NET 4.0框架内所有的原生Windows控件,这些控件有文本框、按钮、单选框、复选框、列表等等。总之,在System.Windows.Forms命名空间内的所有控件理论上EJS都是支持的。这里http://ily.so/7Zbi6j是微软关于System.Windows.Forms命名空间的介绍及详细的文档。 2、如何在EJS中引用这些.NET控件?      在EJS引擎中内置了一个System命名空间,通过这个命名空间我们可以访问它下面的命名空间,例如:System.Windows.Forms,这与java的包类似,但是它是虚拟的目录,并不是实实在在的目录,它只是逻辑上的结构。System的Windows的Forms命名空间,OK,我们可以把“.”读成“的”,当然,这只是为了便于理解,我并没有看到哪个文章有类似的叫法。同样,维基百科上也有命名空间的词条(http://ily.so/AjuQf2),词条里有个例子是这样的。例如:设Bill是X公司的员工,工号为123,而John是Y公司的员工,工号也是123。由于两人在不同的公司工作,可以使用相同的工号来标识而不会造成混乱,这里每个公司就表示一个独立的命名空间。如果两人在同一家公司工作,其工号就不能相同了,否则在支付工资时便会发生混乱。      用了那么大篇幅介绍命名空间,如果读者还是看不懂,那就把System.Windows.Forms当做一个控件包好了,里面有许许多多的控件。现在我们只需要知道在System.Windows.Forms命名空间里面有什么?我们应该怎么把这些东西引用到EJS里面?      在微软关于System.Windows.Forms命名空间的介绍及详细文档内有这个命名空间内包含的所有控件(http://ily.so/7Zbi6j),在EJS里我们应该使用变量去引用命名空间内的控件。 //引用一个窗体控件 var Form = System.Windows.Forms.Form; //引用一个按钮控件 var Button = System.Windows.Forms.Button; 这样应该能明白在EJS中如何引用控件了,其实只要在命名空间后加“.”,然后接上控件的名称即可。 在微软关于System.Windows.Forms命名空间的文档中,拥有所有的控件信息,只要参考文档进行操作即可。   下面再通过一个小例子进一步学习EJS的GUI编程,在例子中新增了几个事件,大家有兴趣的可以查询下MSDN的介绍。 console.hide(); //引用.NET框架内的类 var Form = System.Windows.Forms.Form; var FormStartPosition = System.Windows.Forms.FormStartPosition; var Button = System.Windows.Forms.Button; var TextBox = System.Windows.Forms.TextBox; var Application = System.Windows.Forms.Application; var Point = System.Drawing.Point; var Size = System.Drawing.Size; var FormBorderStyle = System.Windows.Forms.FormBorderStyle; var Icon = System.Drawing.Icon; var ScrollBars = System.Windows.Forms.ScrollBars; var AnchorStyles = System.Windows.Forms.AnchorStyles; //实例化类 var frm = new Form(); frm.Text = "EJS GUI编程实例"; frm.Size = new Size(800, 500); //frm.MaximizeBox = false; frm.StartPosition = FormStartPosition.CenterScreen; //frm.FormBorderStyle = FormBorderStyle.FixedSingle; frm.Icon = new Icon(path.dir + "\\icons\\sjs.ico"); frm.ShowInTaskbar = false; frm.TopMost = true; var txt = new TextBox(); txt.Text = "http://"; txt.Location = new Point(20, 20); txt.Size = new Size(500, txt.Size.Height); frm.Controls.Add(txt); var txt2 = new TextBox(); txt2.Multiline = true; txt2.Location = new Point(20, 90); txt2.Size = new Size(745, 360); txt2.ScrollBars = ScrollBars.Both; txt2.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); frm.Controls.Add(txt2); var btn = new Button(); btn.Text = "获取"; btn.Location = new Point(20, 50); btn.Click += function(sender, e) { try { txt2.Text = http.get(txt.Text, "utf-8"); console.log("click:" + sender.Text); } catch(e) { alert(e.message); } }; btn.MouseLeave += function(sender, e) { //alert("离开了"); console.log("离开了"); }; btn.MouseUp += function(sender, e) { console.log("按下了"); //alert("按下了"); }; frm.AcceptButton = btn; frm.Controls.Add(btn); //运行 Application.Run(frm); console.show(); //如果不显示则在cmd模式下将会不现实cmd窗口 这个小例子是一个网页源码获取器,输入URL后可以把网页源代码从网站服务器中下载回来,并显示在下方的文本框内。   本篇文章就写到这里,如果有问题可以在评论里给我留言,我看到后会第一时间回复。

Posted in: EJSTool

Tags:

使用EJS进行GUI编程(一)

三月 8, 2015 at 10:34 下午Easton
众所周知,原生JavaScript是不支持GUI编程的,在对原生JavaScript标准进行拓展后,我让EJS拥有了GUI编程的能力。 下面就让我们来学习下EJS是如何进行GUI编程的吧。 首先,我们谈谈EJS是如何支持GUI编程的。EJS是基于.NET平台的脚本语言,因此它天生就拥有强大的运行库支持,通过.NET平台提供的GUI接口,我们可以方便的让EJS具有与C#或F#一样的强大功能。 为了解决这个问题,我也花了一点时间解决各种兼容性问题,尤其是脚本解释运行方面的问题。因为原生JavaScript是没有事件这个概念的(注意区分浏览器支持的JS和原生的JS标准,浏览器支持的JS是支持DOM事件的,并且浏览器中的JS本身就属于事件驱动的),因此为了支持这个功能,我对JavaScrpt引擎进行了改造,让它支持+=事件绑定。由于语言特点,我这里并没有让它支持-=事件取消(因为语言特点的问题,JS不太好实现这个语法,而且这个功能并不实用)。 下面来说说微软的JScript引擎,微软的JScript甚至不支持新的事件声明,这对GUI编程来说是一件多操蛋的事情,微软原文:http://ily.so/aYnuui。 声明:我本文使用的EJS脚本解释器的IDE是V1.2 R1版本的,这个版本是我2015年3月8日发布的最新版本,在http://ily.so/2EZZz2可以下载到。 建议下载绿色版,它可以脱离.NET环境运行,如果下载的5.5MB的普通版则需要安装.NET 4.0框架和.NET 2.0框架。   下面我们开始通过一段小代码来学习EJS下是如何进行GUI编程的。 代码如下: //在shell中执行可以隐藏控制台 console.hide(); //引用.NET框架内的类,这些类通过微软MSDN:http://ily.so/7Zbi6j 可以查找到详细用法。 var Form = System.Windows.Forms.Form; var FormStartPosition = System.Windows.Forms.FormStartPosition; var Button = System.Windows.Forms.Button; var TextBox = System.Windows.Forms.TextBox; var Application = System.Windows.Forms.Application; var Point = System.Drawing.Point; function main() { //实例化类 var frm = new Form(); frm.Text = "EJS GUI编程实例01"; var txt = new TextBox(); txt.Text = "hello"; txt.Location = new Point(20, 20); frm.Controls.Add(txt); var txt2 = new TextBox(); txt2.Multiline = true; txt2.Location = new Point(20, 90); frm.Controls.Add(txt2); var btn = new Button(); btn.Text = "测试"; btn.Location = new Point(20, 50); //为按钮绑定单击事件 //脚本解释器会自动匹配事件类型 btn.Click += function(sender, e) { alert(txt.Text); alert("您单击的是:\"" + sender.Text + "\"按钮。"); }; frm.AcceptButton = btn; frm.Controls.Add(btn); //运行 Application.Run(frm); } //别忘了调用main,当然,你也可以把所有代码放在main函数外面直接执行 //但是我不推荐大家使用这种方法,因为放在函数内部有个好处是可以使用return停止执行后面的代码。 main(); //恢复shell窗口,这样不会因为出错导致shell进程一直驻留在系统 console.show(); 上面的代码直接在IDE环境中运行就可以看到一个窗口出现,并且可以单击按钮。 如下图所示: 是不是感觉很简单呢? 为了方便运行脚本代码,在1.2版本的EJS中,我新增了Shell工具,通过注册SJS文件关联,可以让我们双击SJS文件运行脚本。 在本文中,我们新建的脚本文件也是保存为*.sjs文件的。   注意:在运行网络上下载的SJS脚本文件时需要注意里面是否具有恶意代码。

Posted in: EJSTool

Tags:

如何不翻墙使用Google服务?

三月 7, 2015 at 10:35 下午Easton
注意: 目前64.233.X.X IP段可用服务器已经不多了,大家可以尝试173.194.79.1开始,搜索200个左右的IP。 BUG修复: var IP = { toInt: function(ip) { var ipTest =/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; var xH = "", result = ipTest.exec(ip); if(!result) return -1; return (parseInt(result[1]) << 24 | parseInt(result[2]) << 16 | parseInt(result[3]) << 8 | parseInt(result[4])) >>> 0; }, toString: function(ip) { if(ip < 0 || ip > 0xFFFFFFFF){ throw new ArgumentException("参数超过IPV4地址范围。"); } return (ip >>> 24) + "." + (ip >> 16 & 0xFF) + "." + (ip >> 8 & 0xFF) + "." + (ip & 0xFF); } } 在当前脚本21行找到这个对象,替换掉这个对象的代码。之前的版本忘了考虑负数问题,所以把IP转换成整数会有可能出现负数的可能,只需要把整数>>>0运算就可以解决这个问题。 上述BUG只存在之前下载的脚本内,当前提供下载的脚本已修复该BUG。 从Google公开宣布退出天朝开始,在我天朝上国Google服务一直是不稳定的,最近两年更是直接河蟹不能访问(嘿嘿,原因你懂得。此处省略N字)。但是由于Google索引了全球众多优秀站点,对于众多程序猿和各行各业的科研工作者来说是很有用的,离开了Google用某度很显然是一种很操蛋的感觉(中文搜索也没觉得某度能比Google好到哪里,差太远了)。写这篇文章我并不是想挑战党的英明领导,我只想让更多的学者、科研工作者能使用Google提供的全球搜索服务查找学习资料。 我觉得我应该检讨下自己,我还是背一遍《社会主义核心价值观》好了:富强、民主、文明、和谐;自由、平等、公正、法治;爱国、敬业、诚信、友善。希望大家热爱自己的国家,热爱党,我们用Google只是学习国外的先进科学技术。 之前互联网上也有很多关于如何恢复Google服务的文章,但是大多数都是授人以鱼,并不是授人以渔。 好了,废话不多说,我们开始进入正题,如何不翻墙使用Google的服务。 一、了解Google是如何被封的,以及WEB服务的请求过程。(如果不想了解原理可直接跳过本节,直接到第二节) 之前发过两篇博文说过如何恢复Google服务,但是由于文章可读内容非常少,对于一般用户来说可能没什么意义,这篇文章我将用大量的截图和例子说明如何恢复Goolge服务,让您在不翻墙的情况下使用Goolge提供的优秀搜索服务。《利用EJS查找可用的Google搜索服务器IP,并缓存入系统Hosts文件内(改进版)》《利用EJS查找可用的Google搜索服务器IP,并缓存入系统Hosts文件内》 一般人遇到被墙网站首先想到的是利用代理翻墙,但是这招会非常影响速度,时间就是生命,时间就是金钱,打开个网站要超过5秒这种感觉会非常蛋疼,因此,不到万不得已的情况下我一般不会考虑使用IP代理的。 要解决天朝境内不能使用Google的问题首先我们要了解天朝是如何做到屏蔽大家上Google的。 众所周知,我们上Google需要在浏览器的地址栏输入http://www.google.com.hk,这就是Google的域名,通过Google的域名我们可以访问Google的服务器。而服务器在互联网的唯一地址应该是IP,而不是域名,这就涉及到域名解析问题。域名在得到最终IP的过程就是域名解析的过程,这一般是通过DNS服务器实现的,在浏览器访问http://www.google.com.hk的时候会向当前计算机内设置的DNS服务器查询www.google.com.hk域名对应的IP地址,然后通过TCP/IP协议访问这个IP地址的80端口,并且发送HTTP协议内规定的请求头信息,最后服务器收到信息后就会返回Google的网页源代码,浏览器渲染这些HTML代码后将Google搜索的界面显示在您的面前。这就是一个简单的WEB交互过程,在了解完这个WEB交互过程我们就可以开始分析Google为什么不能访问了。 通过前面的讲解,我们应该清楚了我们访问Google服务需要经历哪些环节,通过了解这些环节我们可以逐一排除可能的原因,并最终找到答案。 1、排除DNS解析过程中的问题。 要测试这个问题可以通过Windows提供的ping命令,这个命令可以支持解析域名,并得到最终的IP地址。 按WIN键+R可以打开“运行”,键入“cmd”后按回车则可以打开命令行工具。 在命令行工具内键入ping www.google.com.hk,如下图所示。   我的系统是做过处理的,可以在不翻墙的情况下使用Google,因此我们可以看到我这里ping Google域名是有响应的。 但是您在自己的电脑上ping的时候可能只能看到“正在 Ping www.google.com.hk [XXX.XXX.XXX.XXX] 具有 32 字节的数据:”,然后后面就是超时信息。 通过上述简单的小实验我们就可以排除在DNS解析过程中发生了问题。 2、排除Google服务器的IP被封。 嘿嘿,上面的小实验其实已经说明了结果,其实就是Google服务器的IP被封了(否则不会ping不通Google服务器,而Google服务器是没有禁止ping的,它会响应ping),在我朝主干网络上,组织可对我等屁民的任何网络请求进行拦截,要封一个IP对于伟大的党组织来说是非常容易的。 知道了原因,我们开始想办法如何突破这种封锁。 要知道,Google作为全球最大的搜索引擎服务商,它绝不可能只有一台服务器,它的服务器遍布全球各地,因此组织要想完全封锁Google服务也并不是那么容易的,而且组织内部的科研人员很多情况下肯定也是需要使用Google服务的,因此他们必定留有一些可用的Google服务器或者漏网之鱼。我们通过去扫描已知的Google服务器IP段可以找到这些可用的服务器,并使用系统提供的DNS缓存文件(hosts)就可以将这些IP缓存到本地电脑,以后在域名解析的时候直接使用本机的DNS缓存进行解析,而不是用DNS服务器。 二、如何突破封锁,恢复Google服务。 了解了上述原理,要恢复Google对于会编程的程序猿来说应该是so easy的,但是对于普通大众来说还是有些麻烦的,这里我提供一个非常简单的方案,只需要下载一个脚本解释器,运行一端小脚本即可。 1、首先,需要下载一个脚本解释器; EJSTool Alpha2 V1.3[R1](绿色版).zip (它内置了强大的运行库,可以方便的使用JavaScrit进行编程) 上一版本下载地址:http://pan.baidu.com/s/1c06fbtY(存在若干BUG,并且与2015年3月12日微软发布的某个补丁存在冲突,导致IDE无法启动,不建议下载,建议下载新版本)   2、解压脚本解释器,得到目录“EJSTool Alpha2 V1.2[R1](绿色版)”,在目录内找到 双击它即可在系统内注册SJS脚本文件的关联。(注意:部分杀毒软件会给出提示有一个叫“ejsshell.exe”的程序正在操作系统注册表,只要将ejsshell.exe设置到杀毒软件白名单即可,这只是一个脚本解释器,对电脑并没有任何副作用,如果不想关联SJS文件只要双击“取消注册SJS文件.bat”文件即可) 3、下载EJS脚本文件,点击这里下载脚本文件。 如果前面已经关联了SJS文件,则下载回来的文件会有一个灰色的图标,上面带有SJS字样,如下图: 双击这个文件即可开始恢复Google服务之旅。 如果双击脚本文件后一切正常,则会出现上面截图中的内容。上面的输入框内是设置Google服务器IP段起始内容的,一般按照默认参数设置即可。 设置完这两步后脚本就开始搜索工作了,请耐心等待脚本执行完毕。 在200个Google服务器IP之间一般都会有两三个IP是可用的,在找到可用的IP后SJS脚本会将这个IP缓存到系统的hosts文件内。 完成搜索后在浏览器中键入http://www.google.com.hk 嘿嘿,恢复完后你会意外的发现原来Chrome的数据同步服务也正常了。 Done, have fun... 本文短地址:http://ily.so/zIzUNz

Posted in: EJSTool

Tags:

利用EJS查找可用的Google搜索服务器IP,并缓存入系统Hosts文件内(改进版)

二月 28, 2015 at 11:40 上午Easton
EJS脚本运行环境下载:下载地址 由于http对象底层Socket的连接功能未提供超时机制,所以即使为http对象设置了Timeout属性在某些情况下也会等待20秒左右才能连接超时。 为了解决这个问题,我们采用Socket提供的异步连接方法测试服务器是否开通80端口。 第一步:新建一个名为“Socket.ejs”的脚本文件(下一个版本将集成到lib运行库目录内),键入下面代码: /* 指定 Socket 类的实例可以使用的寻址方案。 AppleTalk AppleTalk 地址。 Atm 本机 ATM 服务地址。 Banyan Banyan 地址。 Ccitt CCITT 协议(如 X.25)的地址。 Chaos MIT CHAOS 协议的地址。 Cluster Microsoft 群集产品的地址。 DataKit Datakit 协议的地址。 DataLink 直接数据链接接口地址。 DecNet DECnet 地址。 Ecma 欧洲计算机制造商协会 (ECMA) 地址。 FireFox FireFox 地址。 HyperChannel NSC Hyperchannel 地址。 Ieee12844 IEEE 1284.4 工作组地址。 ImpLink ARPANET IMP 地址。 InterNetwork IP 版本 4 的地址。 InterNetworkV6 IP 版本 6 的地址。 Ipx IPX 或 SPX 地址。 Irda IrDA 地址。 Iso ISO 协议的地址。 Lat LAT 地址。 Max MAX 地址。 NetBios NetBios 地址。 NetworkDesigners 支持网络设计器 OSI 网关的协议的地址。 NS Xerox NS 协议的地址。 Osi OSI 协议的地址。 Pup PUP 协议的地址。 Sna IBM SNA 地址。 Unix Unix 本地到主机地址。 Unknown 未知的地址族。 Unspecified 未指定的地址族。 VoiceView VoiceView 地址。 */ var AddressFamily = System.Net.Sockets.AddressFamily; /* 指定 Socket 类的实例表示的套接字类型。 Dgram 支持数据报,即最大长度固定(通常很小)的无连接、不可靠消息。 消息可能会丢失或重复并可能在到达时不按顺序排列。 Dgram 类型的 Socket 在发送和接收数据之前不需要任何连接,并且可以与多个对方主机进行通信。 Dgram 使用数据报协议 (Udp) 和 InterNetworkAddressFamily。 Raw 支持对基础传输协议的访问。 通过使用 SocketTypeRaw,可以使用 Internet 控制消息协议 (Icmp) 和 Internet 组管理协议 (Igmp) 这样的协议来进行通信。 在发送时,您的应用程序必须提供完整的 IP 标头。 所接收的数据报在返回时会保持其 IP 标头和选项不变。 Rdm 支持无连接、面向消息、以可靠方式发送的消息,并保留数据中的消息边界。 RDM(以可靠方式发送的消息)消息会依次到达,不会重复。 此外,如果消息丢失,将会通知发送方。 如果使用 Rdm 初始化 Socket,则在发送和接收数据之前无需建立远程主机连接。 利用 Rdm,您可以与多个对方主机进行通信。 Seqpacket 在网络上提供排序字节流的面向连接且可靠的双向传输。 Seqpacket 不重复数据,它在数据流中保留边界。 Seqpacket 类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。 Stream 支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。 此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。 Stream 使用传输控制协议 (Tcp) ProtocolType 和 InterNetworkAddressFamily。 Unknown 指定未知的 Socket 类型。 */ var SocketType = System.Net.Sockets.SocketType; /* 指定 Socket 类支持的协议。 Ggp 网关到网关协议。 Icmp 网际消息控制协议。 IcmpV6 用于 IPv6 的 Internet 控制消息协议。 Idp Internet 数据报协议。 Igmp 网际组管理协议。 IP 网际协议。 IPSecAuthenticationHeader IPv6 身份验证头。 有关详细信息,请参见位于 http://www.ietf.org 中的 RFC 2292 的 2.2.1 节。 IPSecEncapsulatingSecurityPayload IPv6 封装式安全措施负载头。 IPv4 Internet 协议版本 4。 IPv6 Internet 协议版本 6 (IPv6)。 IPv6DestinationOptions IPv6 目标选项头。 IPv6FragmentHeader IPv6 片段头。 IPv6HopByHopOptions IPv6 逐跳选项头。 IPv6NoNextHeader IPv6 No Next 头。 IPv6RoutingHeader IPv6 路由头。 Ipx Internet 数据包交换协议。 ND 网络磁盘协议(非正式)。 Pup PARC 通用数据包协议。 Raw 原始 IP 数据包协议。 Spx 顺序包交换协议。 SpxII 顺序包交换协议第 2 版。 Tcp 传输控制协议。 Udp 用户数据报协议。 Unknown 未知协议。 Unspecified 未指定的协议。 */ var ProtocolType = System.Net.Sockets.ProtocolType; /* 使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。 addressFamily:AddressFamily 值之一。 类型:AddressFamily socketType:SocketType 值之一。 类型:SocketType protocolType:ProtocolType 值之一。 类型:ProtocolType */ function Socket(addressFamily, socketType, protocolType) { if(typeof(addressFamily) != "number") { throw new ArgumentException("addressFamily参数不能为空,并且必须为Number。"); } if(typeof(socketType) != "number") { throw new ArgumentException("socketType参数不能为空,并且必须为Number。"); } if(typeof(protocolType) != "number") { throw new ArgumentException("protocolType参数不能为空,并且必须为Number。"); } this.author = "Easton"; this.url = "http://www.9925.org"; this.version = "1.0.0.0"; this.baseObject = new System.Net.Sockets.Socket(addressFamily, socketType, protocolType); } 第二步:修改上一篇文章内提供的脚本,新增检测80端口是否启用的功能。 var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //检测80端口是否开通 var result = socket.baseObject.BeginConnect(temp, 80, null, null); var success = result.AsyncWaitHandle.WaitOne(2000, true); if (!success) { console.error(url + "连接80端口超时。"); continue; } } finally { socket.baseObject.Close(); } 完整的脚本 clear(); console.info("/**************************版权声明**************************/"); console.info("/* */"); console.info("/*功能描述:查找可用的Google服务器,并将其缓存入系统DNS。 */"); console.info("/*脚本作者:Easton */"); console.info("/*联系邮箱:easton@xiangyadao.com */"); console.info("/*完成时间:2015年2月27日 */"); console.info("/* */"); console.info("/************************************************************/"); var hostsMarkBegin = "#EJS GOOGLE HOSTS BEGIN"; var hostsMarkEnd = "#EJS GOOGLE HOSTS END"; var googleDomains = ["google.com", "www.google.com", "m.google.com", "scholar.google.com", "translate.google.com", "books.google.com", "appengine.google.com", "maps.google.com", "news.google.com", "images.google.com", "finance.google.com", "history.google.com", "drive.google.com", "docs.google.com", "plus.google.com", "play.google.com", "calendar.google.com", "domains.google.com", "code.google.com", "googlecode.com", "v8.googlecode.com", "gyp.googlecode.com", "cloud.google.com", "earth.google.com", "places.google.com", "adwords.google.com", "sites.google.com", "keep.google.com", "support.google.com", "developers.google.com", "spreadsheets.google.com", "video.google.com", "photos.google.com", "wallet.google.com", "groups.google.com", "gmail.com", "www.gmail.com", "m.gmail.com", "m.googlemail.com", "mail-attachment.googleusercontent.com", "www.chrome.com", "developer.chrome.com", "chrome.google.com", "picasa.google.com", "talkgadget.google.com", "toolbar.google.com", "tools.google.com", "inbox.google.com", "apis.google.com", "www.googleapis.com", "android.googleapis.com", "play.googleapis.com", "plus.googleapis.com", "ajax.googleapis.com", "chart.googleapis.com", "fonts.googleapis.com", "redirector-bigcache.googleapis.com", "translate.googleapis.com", "maps.googleapis.com", "content.googleapis.com", "storage.googleapis.com", "commondatastorage.googleapis.com", "static.panoramio.com.storage.googleapis.com", "www.gstatic.com", "ssl.gstatic.com", "csi.gstatic.com", "maps.gstatic.com", "fonts.gstatic.com", "encrypted-tbn0.gstatic.com", "encrypted-tbn1.gstatic.com", "encrypted-tbn2.gstatic.com", "encrypted-tbn3.gstatic.com", "encrypted-tbn4.gstatic.com", "encrypted-tbn5.gstatic.com", "encrypted-tbn6.gstatic.com", "g0.gstatic.com", "g1.gstatic.com", "g2.gstatic.com", "g3.gstatic.com", "g4.gstatic.com", "g5.gstatic.com", "g6.gstatic.com", "g7.gstatic.com", "mt0.gstatic.com", "mt1.gstatic.com", "mt2.gstatic.com", "mt3.gstatic.com", "mt4.gstatic.com", "mt5.gstatic.com", "mt6.gstatic.com", "mt7.gstatic.com", "t0.gstatic.com", "t1.gstatic.com", "t2.gstatic.com", "t3.gstatic.com", "t4.gstatic.com", "t5.gstatic.com", "t6.gstatic.com", "t7.gstatic.com", "1-ps.googleusercontent.com", "2-ps.googleusercontent.com", "3-ps.googleusercontent.com", "4-ps.googleusercontent.com", "www.googleusercontent.com", "oauth.googleusercontent.com", "feedback.googleusercontent.com", "translate.googleusercontent.com", "themes.googleusercontent.com", "webcache.googleusercontent.com", "books.googleusercontent.com", "video.googleusercontent.com", "music-onebox.googleusercontent.com", "music.googleusercontent.com", "blogger.googleusercontent.com", "newsstand.googleusercontent.com", "producer.googleusercontent.com", "code-opensocial.googleusercontent.com", "spreadsheets-opensocial.googleusercontent.com", "www-calENDar-opensocial.googleusercontent.com", "www-fc-opensocial.googleusercontent.com", "www-focus-opensocial.googleusercontent.com", "www-gm-opensocial.googleusercontent.com", "www-kix-opensocial.googleusercontent.com", "www-open-opensocial.googleusercontent.com", "www-opensocial.googleusercontent.com", "www-opensocial-sandbox.googleusercontent.com", "www-oz-opensocial.googleusercontent.com", "a-oz-opensocial.googleusercontent.com", "0-open-opensocial.googleusercontent.com", "1-open-opensocial.googleusercontent.com", "2-open-opensocial.googleusercontent.com", "3-open-opensocial.googleusercontent.com", "0-focus-opensocial.googleusercontent.com", "1-focus-opensocial.googleusercontent.com", "2-focus-opensocial.googleusercontent.com", "3-focus-opensocial.googleusercontent.com", "doc-00-7o-docs.googleusercontent.com", "doc-01-7o-docs.googleusercontent.com", "doc-02-7o-docs.googleusercontent.com", "doc-03-7o-docs.googleusercontent.com", "doc-04-7o-docs.googleusercontent.com", "doc-05-7o-docs.googleusercontent.com", "doc-06-7o-docs.googleusercontent.com", "doc-07-7o-docs.googleusercontent.com", "doc-08-7o-docs.googleusercontent.com", "doc-09-7o-docs.googleusercontent.com", "doc-10-7o-docs.googleusercontent.com", "doc-0a-7o-docs.googleusercontent.com", "doc-0b-7o-docs.googleusercontent.com", "doc-0c-7o-docs.googleusercontent.com", "doc-0d-7o-docs.googleusercontent.com", "doc-0e-7o-docs.googleusercontent.com", "doc-0f-7o-docs.googleusercontent.com", "doc-0g-7o-docs.googleusercontent.com", "doc-0h-7o-docs.googleusercontent.com", "doc-0i-7o-docs.googleusercontent.com", "doc-0j-7o-docs.googleusercontent.com", "doc-0k-7o-docs.googleusercontent.com", "doc-0l-7o-docs.googleusercontent.com", "doc-0m-7o-docs.googleusercontent.com", "doc-0n-7o-docs.googleusercontent.com", "doc-0o-7o-docs.googleusercontent.com", "doc-0p-7o-docs.googleusercontent.com", "doc-0q-7o-docs.googleusercontent.com", "doc-0r-7o-docs.googleusercontent.com", "doc-0s-7o-docs.googleusercontent.com", "doc-0t-7o-docs.googleusercontent.com", "doc-00-bc-docs.googleusercontent.com", "doc-01-bc-docs.googleusercontent.com", "doc-02-bc-docs.googleusercontent.com", "doc-03-bc-docs.googleusercontent.com", "doc-04-bc-docs.googleusercontent.com", "doc-05-bc-docs.googleusercontent.com", "doc-06-bc-docs.googleusercontent.com", "doc-07-bc-docs.googleusercontent.com", "doc-08-bc-docs.googleusercontent.com", "doc-09-bc-docs.googleusercontent.com", "doc-10-bc-docs.googleusercontent.com", "doc-0a-bc-docs.googleusercontent.com", "doc-0b-bc-docs.googleusercontent.com", "doc-0c-bc-docs.googleusercontent.com", "doc-0d-bc-docs.googleusercontent.com", "doc-0e-bc-docs.googleusercontent.com", "doc-0f-bc-docs.googleusercontent.com", "doc-0g-bc-docs.googleusercontent.com", "doc-0h-bc-docs.googleusercontent.com", "doc-0i-bc-docs.googleusercontent.com", "doc-0j-bc-docs.googleusercontent.com", "doc-0k-bc-docs.googleusercontent.com", "doc-0l-bc-docs.googleusercontent.com", "doc-0m-bc-docs.googleusercontent.com", "doc-0n-bc-docs.googleusercontent.com", "doc-0o-bc-docs.googleusercontent.com", "doc-0p-bc-docs.googleusercontent.com", "doc-0q-bc-docs.googleusercontent.com", "doc-0r-bc-docs.googleusercontent.com", "doc-0s-bc-docs.googleusercontent.com", "doc-0t-bc-docs.googleusercontent.com", "doc-00-1s-docs.googleusercontent.com", "doc-01-1s-docs.googleusercontent.com", "doc-02-1s-docs.googleusercontent.com", "doc-03-1s-docs.googleusercontent.com", "doc-04-1s-docs.googleusercontent.com", "doc-05-1s-docs.googleusercontent.com", "doc-06-1s-docs.googleusercontent.com", "doc-07-1s-docs.googleusercontent.com", "doc-08-1s-docs.googleusercontent.com", "doc-09-1s-docs.googleusercontent.com", "doc-10-1s-docs.googleusercontent.com", "doc-0a-1s-docs.googleusercontent.com", "doc-0b-1s-docs.googleusercontent.com", "doc-0c-1s-docs.googleusercontent.com", "doc-0d-1s-docs.googleusercontent.com", "doc-0e-1s-docs.googleusercontent.com", "doc-0f-1s-docs.googleusercontent.com", "doc-0g-1s-docs.googleusercontent.com", "doc-0h-1s-docs.googleusercontent.com", "doc-0i-1s-docs.googleusercontent.com", "doc-0j-1s-docs.googleusercontent.com", "doc-0k-1s-docs.googleusercontent.com", "doc-0l-1s-docs.googleusercontent.com", "doc-0m-1s-docs.googleusercontent.com", "doc-0n-1s-docs.googleusercontent.com", "doc-0o-1s-docs.googleusercontent.com", "doc-0p-1s-docs.googleusercontent.com", "doc-0q-1s-docs.googleusercontent.com", "doc-0r-1s-docs.googleusercontent.com", "doc-0s-1s-docs.googleusercontent.com", "doc-0t-1s-docs.googleusercontent.com", "doc-04-80-docs.googleusercontent.com", "doc-08-6g-docs.googleusercontent.com", "doc-0k-bk-docs.googleusercontent.com", "doc-10-6g-docs.googleusercontent.com", "doc-10-00-docs.googleusercontent.com", "images1-focus-opensocial.googleusercontent.com", "images2-focus-opensocial.googleusercontent.com", "images3-focus-opensocial.googleusercontent.com", "images4-focus-opensocial.googleusercontent.com", "images5-focus-opensocial.googleusercontent.com", "images6-focus-opensocial.googleusercontent.com", "images7-focus-opensocial.googleusercontent.com", "images8-focus-opensocial.googleusercontent.com", "images9-focus-opensocial.googleusercontent.com", "images1-esmobile-opensocial.googleusercontent.com", "images2-esmobile-opensocial.googleusercontent.com", "images3-esmobile-opensocial.googleusercontent.com", "images4-esmobile-opensocial.googleusercontent.com", "images5-esmobile-opensocial.googleusercontent.com", "images6-esmobile-opensocial.googleusercontent.com", "images7-esmobile-opensocial.googleusercontent.com", "images8-esmobile-opensocial.googleusercontent.com", "images9-esmobile-opensocial.googleusercontent.com", "images-docs-opensocial.googleusercontent.com", "images-oz-opensocial.googleusercontent.com", "images-lso-opensocial.googleusercontent.com", "images-blogger-opensocial.googleusercontent.com", "images-pos-opensocial.googleusercontent.com", "lh0.googleusercontent.com", "lh1.googleusercontent.com", "lh2.googleusercontent.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "gp1.googleusercontent.com", "gp2.googleusercontent.com", "gp3.googleusercontent.com", "gp4.googleusercontent.com", "gp5.googleusercontent.com", "gp6.googleusercontent.com", "ci1.googleusercontent.com", "ci2.googleusercontent.com", "ci3.googleusercontent.com", "ci4.googleusercontent.com", "ci5.googleusercontent.com", "ci6.googleusercontent.com", "s1.googleusercontent.com", "s2.googleusercontent.com", "s3.googleusercontent.com", "s4.googleusercontent.com", "s5.googleusercontent.com", "s6.googleusercontent.com", "sp0.googleusercontent.com", "sp1.googleusercontent.com", "sp2.googleusercontent.com", "sp3.googleusercontent.com", "sp4.googleusercontent.com", "sp5.googleusercontent.com", "sp6.googleusercontent.com", "sp7.googleusercontent.com", "sp8.googleusercontent.com", "sp9.googleusercontent.com", "clients1.googleusercontent.com", "clients2.googleusercontent.com", "clients3.googleusercontent.com", "clients4.googleusercontent.com", "clients5.googleusercontent.com", "clients6.googleusercontent.com", "clients7.googleusercontent.com", "lh0.ggpht.com", "lh1.ggpht.com", "lh2.ggpht.com", "lh3.ggpht.com", "lh4.ggpht.com", "lh5.ggpht.com", "lh6.ggpht.com", "nt0.ggpht.com", "nt1.ggpht.com", "nt2.ggpht.com", "nt3.ggpht.com", "nt4.ggpht.com", "nt5.ggpht.com", "nt6.ggpht.com", "yt0.ggpht.com", "yt1.ggpht.com", "yt2.ggpht.com", "yt3.ggpht.com", "yt4.ggpht.com", "yt5.ggpht.com", "yt6.ggpht.com", "gm0.ggpht.com", "gm1.ggpht.com", "gm2.ggpht.com", "gm3.ggpht.com", "gm4.ggpht.com", "gm5.ggpht.com", "gm6.ggpht.com", "geo0.ggpht.com", "geo1.ggpht.com", "geo2.ggpht.com", "geo3.ggpht.com", "geo4.ggpht.com", "geo5.ggpht.com", "geo6.ggpht.com", "clients1.google.com", "clients2.google.com", "clients3.google.com", "clients4.google.com", "clients5.google.com", "clients6.google.com", "0.client-channel.google.com", "1.client-channel.google.com", "2.client-channel.google.com", "3.client-channel.google.com", "4.client-channel.google.com", "5.client-channel.google.com", "6.client-channel.google.com", "7.client-channel.google.com", "8.client-channel.google.com", "9.client-channel.google.com", "10.client-channel.google.com", "11.client-channel.google.com", "12.client-channel.google.com", "13.client-channel.google.com", "14.client-channel.google.com", "15.client-channel.google.com", "16.client-channel.google.com", "17.client-channel.google.com", "18.client-channel.google.com", "19.client-channel.google.com", "20.client-channel.google.com", "21.client-channel.google.com", "22.client-channel.google.com", "23.client-channel.google.com", "24.client-channel.google.com", "25.client-channel.google.com", "26.client-channel.google.com", "27.client-channel.google.com", "28.client-channel.google.com", "29.client-channel.google.com", "uploads.clients.google.com", "uploads.client.google.com", "upload.clients.google.com", "upload.client.google.com", "upload.google.com", "upload.docs.google.com", "upload.photos.google.com", "upload.drive.google.com", "upload.video.google.com", "uploads.code.google.com", "uploads.clients.google.com", "linkhelp.clients.google.com", "feedburner.google.com", "feedproxy.google.com", "0.talkgadget.google.com", "chromoting-host.talkgadget.google.com", "chromoting-oauth.talkgadget.google.com", "chromoting-client.talkgadget.google.com", "maps-api-ssl.google.com", "mapsengine.google.com", "bpui0.google.com", "i18napis.appspot.com", "safebrowsing.google.com", "safebrowsing.clients.google.com", "safebrowsing-cache.google.com", "admin.google.com", "appspot.l.google.com", "browserchannel-docs.l.google.com", "browserchannel-spreadsheets.l.google.com", "browsersync.google.com", "browsersync.l.google.com", "cache.l.google.com", "cache.pack.google.com", "cbk0.google.com", "cbk1.google.com", "cbk2.google.com", "cbk3.google.com", "cbks0.google.com", "cbks1.google.com", "cbks2.google.com", "cbks3.google.com", "dl.google.com", "dl.l.google.com", "dl-ssl.google.com", "encrypted.google.com", "encrypted-tbn.l.google.com", "encrypted-tbn0.google.com", "encrypted-tbn1.google.com", "encrypted-tbn2.google.com", "encrypted-tbn3.google.com", "gg.google.com", "ghs.google.com", "ghs.l.google.com", "ghs46.google.com", "ghs46.l.google.com", "googlecode.l.google.com", "google-public-dns-a.google.com", "google-public-dns-b.google.com", "groups.l.google.com", "investor.google.com", "kh.google.com", "kh.l.google.com", "khm.google.com", "khm.l.google.com", "khm0.google.com", "khm1.google.com", "khm2.google.com", "khm3.google.com", "khmdb.google.com", "khms.google.com", "khms.l.google.com", "khms0.google.com", "khms1.google.com", "khms2.google.com", "khms3.google.com", "lh2.google.com", "lh2.l.google.com", "lh3.google.com", "lh4.google.com", "lh5.google.com", "lh6.google.com", "mars.google.com", "mobilemaps.clients.google.com", "mt.google.com", "mt.l.google.com", "mt0.google.com", "mt1.google.com", "mt2.google.com", "mt3.google.com", "mts.google.com", "mts.l.google.com", "mts0.google.com", "mts1.google.com", "mts2.google.com", "mts3.google.com", "music.google.com", "mw1.google.com", "mw2.google.com", "picasaweb.google.com", "picasaweb.l.google.com", "services.google.com", "sandbox.google.com", "pack.google.com", "sb.google.com", "sb-ssl.google.com", "script.google.com", "security.google.com", "id.google.com", "id.l.google.com", "tbn0.google.com", "tbn1.google.com", "tbn2.google.com", "tbn3.google.com", "voice.google.com", "wifi.google.com", "g.co", "goo.gl", "goto.google.com", "0.docs.google.com", "1.docs.google.com", "2.docs.google.com", "3.docs.google.com", "4.docs.google.com", "5.docs.google.com", "6.docs.google.com", "7.docs.google.com", "8.docs.google.com", "9.docs.google.com", "10.docs.google.com", "0.drive.google.com", "1.drive.google.com", "2.drive.google.com", "3.drive.google.com", "4.drive.google.com", "5.drive.google.com", "6.drive.google.com", "7.drive.google.com", "8.drive.google.com", "9.drive.google.com", "10.drive.google.com", "bks0.books.google.com", "bks1.books.google.com", "bks2.books.google.com", "bks3.books.google.com", "bks4.books.google.com", "bks5.books.google.com", "bks6.books.google.com", "bks7.books.google.com", "bks8.books.google.com", "bks9.books.google.com", "bks10.books.google.com", "spreadsheets0.google.com", "spreadsheets1.google.com", "spreadsheets2.google.com", "spreadsheets3.google.com", "spreadsheets4.google.com", "spreadsheets5.google.com", "spreadsheets6.google.com", "spreadsheets7.google.com", "spreadsheets8.google.com", "spreadsheets9.google.com", "news.google.com.hk", "books.google.com.hk", "accounts.google.com.hk", "clients1.google.com.hk", "encrypted.google.com.hk", "groups.google.com.hk", "id.google.com.hk", "images.google.com.hk", "m.google.com.hk", "maps.google.com.hk", "picasaweb.google.com.hk", "scholar.google.com.hk", "toolbar.google.com.hk", "translate.google.com.hk", "wenda.google.com.hk", "www.google.com.hk", "www.google.com.tw", "accounts.google.com.tw", "maps.google.com.tw", "news.google.com.tw", "books.google.com.tw", "clients1.google.com.tw", "encrypted.google.com.tw", "groups.google.com.tw", "id.google.com.tw", "images.google.com.tw", "m.google.com.tw", "picasaweb.google.com.tw", "scholar.google.com.tw", "toolbar.google.com.tw", "toolbarqueries.google.com.tw", "translate.google.com.tw", "g.cn", "www.g.cn", "www.gstatic.cn", "ditu.google.cn", "maps.google.cn", "gg.google.cn", "id.google.cn", "maps.gstatic.cn", "m.google.cn", "mt.google.cn", "mt0.google.cn", "mt1.google.cn", "mt2.google.cn", "mt3.google.cn", "news.google.cn", "scholar.google.cn", "translate.google.cn", "www.google.cn", "accounts.l.google.com", "csi.l.google.com", "googleapis.l.google.com", "maps.l.google.com", "code.l.google.com", "news.l.google.com", "images.l.google.com", "mobile.l.google.com", "talkx.l.google.com", "talk.l.google.com", "large-uploads.l.google.com", "writely.l.google.com", "writely-china.l.google.com", "writely-com.l.google.com", "www.l.google.com", "www2.l.google.com", "www3.l.google.com", "www4.l.google.com", "ytstatic.l.google.com", "wildcard-talkgadget.l.google.com", "mobile-gtalk.l.google.com", "safebrowsing.cache.l.google.com", "spreadsheets-china.l.google.com", "spreadsheets.l.google.com", "suggestqueries.l.google.com", "video-stats.l.google.com", "sb.l.google.com", "sb-ssl.l.google.com", "scholar.l.google.com", "wifi.l.google.com", "wire.l.google.com", "tools.l.google.com", "photos-ugc.l.google.com", "music-streaming.l.google.com", "googlehosted.l.googleusercontent.com", "www.googledrive.com", "map.google.com", "mage.google.com", "plusone.google.com", "spreadsheet.google.com", "ditu.google.com", "local.google.com", "answers.google.com", "profiles.google.com", "writely.google.com", "buzz.google.com", "ssl.google-analytics.com", "www.google-analytics.com", "googlesource.com", "www.googlesource.com", "android.googlesource.com", "chromium.googlesource.com", "gerrit.googlesource.com", "kernel.googlesource.com", "gwt.googlesource.com"]; #include ~/io/file.ejs #include ~/io/textfile.ejs #include Socket.ejs /* IP辅助对象 */ var IP = { toInt: function(ip) { var ipTest =/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; var xH = "", result = ipTest.exec(ip); if(!result) return -1; return (parseInt(result[1]) << 24 | parseInt(result[2]) << 16 | parseInt(result[3]) << 8 | parseInt(result[4])); }, toString: function(ip) { if(ip < 0 || ip > 0xFFFFFFFF){ throw new ArgumentException("参数超过IPV4地址范围。"); } return (ip >>> 24) + "." + (ip >> 16 & 0xFF) + "." + (ip >> 8 & 0xFF) + "." + (ip & 0xFF); } } var main = function() { //开始搜索的IP地址 var start = 1089054986; //结束搜索的IP地址 var end = 1089077247; //使用对话框接收值 while(true) { var _start = prompt("请输入开始搜索的IP(默认从" + IP.toString(start) + "开始搜索):"); if(_start !== null) { _start = IP.toInt(_start); if(_start === -1) { alert("请输入正确的IP地址。"); continue; } start = _start; } break; } console.log("从" + IP.toString(start) + "开始检索。"); while(true) { var _count = prompt("请输入要检索的IP个数(默认检索到" + IP.toString(end) + "):"); if(_count !== null) { _count = parseInt(_count); if(isNaN(_count)) { alert("请输入阿拉伯数字作为要检索的IP个数!"); continue; } end = start + _count - 1; } break; } console.log("检索到" + IP.toString(end) + "结束。"); //为了避免底部http协议视图区域显示http数据封包,加快检索速度这里避免使用内置“http”对象,而是实例化新的http对象。 var h = new Http(); var ipaddr, lastTime = 9999999999; var ipTotal = (end - start) + 1; //总数 if(!confirm("需要搜索" + ipTotal + "个IP地址,搜索可能会消耗较长的时间,是否继续?")) { console.error("用户停止执行脚本。"); return; //退出服务 } var count = 0; //开始检索 for(var ip = start; ip <= end; ip++) { //计算运行时间 var beginTime = new Date().getTime(); try { var temp = IP.toString(ip); var url = "http://" + temp; //延时超过300毫秒的服务器都丢掉 var timeout = h.TestIP(temp, 300); if(timeout != -1) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //检测80端口是否开通 var result = socket.baseObject.BeginConnect(temp, 80, null, null); //500毫秒超时,如果可以忍受更大的数值可以修改 var success = result.AsyncWaitHandle.WaitOne(500, true); if (!success) { console.error(url + "连接80端口超时。"); continue; } } finally { socket.baseObject.Close(); } var htmlText = h.get(url, "utf-8"); if(htmlText.indexOf("按回车键进行搜索。") > -1) { var endTime = new Date().getTime(); var time = endTime - beginTime; if(lastTime > time) { lastTime = time; ipaddr = temp; } console.info(url + "地址测试耗时:" + time + "毫秒。"); } else { console.error(url + "不是Google搜索服务首页。"); } } else { console.error(url + "服务器ping超时。"); } } catch(e) { var endTime = new Date().getTime(); var time = endTime - beginTime; console.error(e.message + "\r\n耗时:" + time + "毫秒。"); } finally { count++; console.info("搜索进度:完成" + (count / ipTotal * 100).toFixed(2) + "%。"); } } if(ipaddr === undefined) { console.error("未能搜索到可用的Google服务器IP地址。"); return; } console.info("最优Google搜索服务器:http://" + ipaddr); //将最优IP缓存入系统hosts文件 if(confirm("是否将" + ipaddr + "缓存入系统hosts文件?\r\n\r\n警告:缓存过程中请勿停止执行脚本,否则可能造成hosts缓存数据丢失!!!")) { var env = System.Environment; var hosts = env.SystemDirectory + "\\drivers\\etc\\hosts"; if(File.exists(hosts)) { console.info("当前系统hosts文件路径:" + hosts); var lines = []; var i = 0; //先读取hosts文件 var reader = new TextReader(hosts, "utf-8"); try { var skip = false; while(reader.peek() > -1) { var line = reader.readLine(); if(line.indexOf(hostsMarkBegin) === 0) { skip = true; } if(!skip) { lines[i++] = line; } if(line.indexOf(hostsMarkEnd) === 0) { skip = false; } } lines[i++] = hostsMarkBegin; for(var j = 0; j < googleDomains.length; j++) { lines[i++] = ipaddr + " " + googleDomains[j]; } lines[i++] = hostsMarkEnd; } catch(e) { console.error(e.message); } finally { reader.close(); } var hosts_backup = env.SystemDirectory + "\\drivers\\etc\\hosts_ejs_backup"; //先备份一份hosts数据 File.copy(hosts, hosts_backup, true); console.info("已备份hosts文件至:" + hosts_backup); //写新的hosts文件 File.writeAllLines(hosts, lines, "utf-8"); console.info("已将" + ipaddr + "地址缓存入系统hosts文件。\r\n友情提示:如果未能及时生效请在命令行环境中键入“ipconfig /flushdns”指令刷新DNS。在刷新DNS后还是无效请检查下当前系统的hosts文件是否存在非EJS脚本生成的Google域名DNS缓存,如果存在删除非EJS脚本生成的Google域名DNS缓存即可生效。"); } else { console.error("未找到hosts文件。"); } } } //程序开始执行 main(); 注意:上述脚本需要引用“Socket.ejs”脚本文件,这里是将两个脚本文件放在同一目录内的。

Posted in: EJSTool

Tags: ,

利用EJS查找可用的Google搜索服务器IP,并缓存入系统Hosts文件内

二月 27, 2015 at 11:17 下午Easton
搜索可用的Google搜索服务器IP,并将搜索结果缓存入系统Hosts文件内。 提示:此脚本在R5以上版本的EJS脚本IDE工具内可成功解释运行。 clear(); console.info("/**************************版权声明**************************/"); console.info("/* */"); console.info("/*功能描述:查找可用的Google服务器,并将其缓存入系统DNS。 */"); console.info("/*脚本作者:Easton */"); console.info("/*联系邮箱:easton@xiangyadao.com */"); console.info("/*完成时间:2015年2月27日 */"); console.info("/* */"); console.info("/************************************************************/"); var hostsMarkBegin = "#EJS GOOGLE HOSTS BEGIN"; var hostsMarkEnd = "#EJS GOOGLE HOSTS END"; var googleDomains = ["google.com", "www.google.com", "m.google.com", "scholar.google.com", "translate.google.com", "books.google.com", "appengine.google.com", "maps.google.com", "news.google.com", "images.google.com", "finance.google.com", "history.google.com", "drive.google.com", "docs.google.com", "plus.google.com", "play.google.com", "calendar.google.com", "domains.google.com", "code.google.com", "googlecode.com", "v8.googlecode.com", "gyp.googlecode.com", "cloud.google.com", "earth.google.com", "places.google.com", "adwords.google.com", "sites.google.com", "keep.google.com", "support.google.com", "developers.google.com", "spreadsheets.google.com", "video.google.com", "photos.google.com", "wallet.google.com", "groups.google.com", "gmail.com", "www.gmail.com", "m.gmail.com", "m.googlemail.com", "mail-attachment.googleusercontent.com", "www.chrome.com", "developer.chrome.com", "chrome.google.com", "picasa.google.com", "talkgadget.google.com", "toolbar.google.com", "tools.google.com", "inbox.google.com", "apis.google.com", "www.googleapis.com", "android.googleapis.com", "play.googleapis.com", "plus.googleapis.com", "ajax.googleapis.com", "chart.googleapis.com", "fonts.googleapis.com", "redirector-bigcache.googleapis.com", "translate.googleapis.com", "maps.googleapis.com", "content.googleapis.com", "storage.googleapis.com", "commondatastorage.googleapis.com", "static.panoramio.com.storage.googleapis.com", "www.gstatic.com", "ssl.gstatic.com", "csi.gstatic.com", "maps.gstatic.com", "fonts.gstatic.com", "encrypted-tbn0.gstatic.com", "encrypted-tbn1.gstatic.com", "encrypted-tbn2.gstatic.com", "encrypted-tbn3.gstatic.com", "encrypted-tbn4.gstatic.com", "encrypted-tbn5.gstatic.com", "encrypted-tbn6.gstatic.com", "g0.gstatic.com", "g1.gstatic.com", "g2.gstatic.com", "g3.gstatic.com", "g4.gstatic.com", "g5.gstatic.com", "g6.gstatic.com", "g7.gstatic.com", "mt0.gstatic.com", "mt1.gstatic.com", "mt2.gstatic.com", "mt3.gstatic.com", "mt4.gstatic.com", "mt5.gstatic.com", "mt6.gstatic.com", "mt7.gstatic.com", "t0.gstatic.com", "t1.gstatic.com", "t2.gstatic.com", "t3.gstatic.com", "t4.gstatic.com", "t5.gstatic.com", "t6.gstatic.com", "t7.gstatic.com", "1-ps.googleusercontent.com", "2-ps.googleusercontent.com", "3-ps.googleusercontent.com", "4-ps.googleusercontent.com", "www.googleusercontent.com", "oauth.googleusercontent.com", "feedback.googleusercontent.com", "translate.googleusercontent.com", "themes.googleusercontent.com", "webcache.googleusercontent.com", "books.googleusercontent.com", "video.googleusercontent.com", "music-onebox.googleusercontent.com", "music.googleusercontent.com", "blogger.googleusercontent.com", "newsstand.googleusercontent.com", "producer.googleusercontent.com", "code-opensocial.googleusercontent.com", "spreadsheets-opensocial.googleusercontent.com", "www-calENDar-opensocial.googleusercontent.com", "www-fc-opensocial.googleusercontent.com", "www-focus-opensocial.googleusercontent.com", "www-gm-opensocial.googleusercontent.com", "www-kix-opensocial.googleusercontent.com", "www-open-opensocial.googleusercontent.com", "www-opensocial.googleusercontent.com", "www-opensocial-sandbox.googleusercontent.com", "www-oz-opensocial.googleusercontent.com", "a-oz-opensocial.googleusercontent.com", "0-open-opensocial.googleusercontent.com", "1-open-opensocial.googleusercontent.com", "2-open-opensocial.googleusercontent.com", "3-open-opensocial.googleusercontent.com", "0-focus-opensocial.googleusercontent.com", "1-focus-opensocial.googleusercontent.com", "2-focus-opensocial.googleusercontent.com", "3-focus-opensocial.googleusercontent.com", "doc-00-7o-docs.googleusercontent.com", "doc-01-7o-docs.googleusercontent.com", "doc-02-7o-docs.googleusercontent.com", "doc-03-7o-docs.googleusercontent.com", "doc-04-7o-docs.googleusercontent.com", "doc-05-7o-docs.googleusercontent.com", "doc-06-7o-docs.googleusercontent.com", "doc-07-7o-docs.googleusercontent.com", "doc-08-7o-docs.googleusercontent.com", "doc-09-7o-docs.googleusercontent.com", "doc-10-7o-docs.googleusercontent.com", "doc-0a-7o-docs.googleusercontent.com", "doc-0b-7o-docs.googleusercontent.com", "doc-0c-7o-docs.googleusercontent.com", "doc-0d-7o-docs.googleusercontent.com", "doc-0e-7o-docs.googleusercontent.com", "doc-0f-7o-docs.googleusercontent.com", "doc-0g-7o-docs.googleusercontent.com", "doc-0h-7o-docs.googleusercontent.com", "doc-0i-7o-docs.googleusercontent.com", "doc-0j-7o-docs.googleusercontent.com", "doc-0k-7o-docs.googleusercontent.com", "doc-0l-7o-docs.googleusercontent.com", "doc-0m-7o-docs.googleusercontent.com", "doc-0n-7o-docs.googleusercontent.com", "doc-0o-7o-docs.googleusercontent.com", "doc-0p-7o-docs.googleusercontent.com", "doc-0q-7o-docs.googleusercontent.com", "doc-0r-7o-docs.googleusercontent.com", "doc-0s-7o-docs.googleusercontent.com", "doc-0t-7o-docs.googleusercontent.com", "doc-00-bc-docs.googleusercontent.com", "doc-01-bc-docs.googleusercontent.com", "doc-02-bc-docs.googleusercontent.com", "doc-03-bc-docs.googleusercontent.com", "doc-04-bc-docs.googleusercontent.com", "doc-05-bc-docs.googleusercontent.com", "doc-06-bc-docs.googleusercontent.com", "doc-07-bc-docs.googleusercontent.com", "doc-08-bc-docs.googleusercontent.com", "doc-09-bc-docs.googleusercontent.com", "doc-10-bc-docs.googleusercontent.com", "doc-0a-bc-docs.googleusercontent.com", "doc-0b-bc-docs.googleusercontent.com", "doc-0c-bc-docs.googleusercontent.com", "doc-0d-bc-docs.googleusercontent.com", "doc-0e-bc-docs.googleusercontent.com", "doc-0f-bc-docs.googleusercontent.com", "doc-0g-bc-docs.googleusercontent.com", "doc-0h-bc-docs.googleusercontent.com", "doc-0i-bc-docs.googleusercontent.com", "doc-0j-bc-docs.googleusercontent.com", "doc-0k-bc-docs.googleusercontent.com", "doc-0l-bc-docs.googleusercontent.com", "doc-0m-bc-docs.googleusercontent.com", "doc-0n-bc-docs.googleusercontent.com", "doc-0o-bc-docs.googleusercontent.com", "doc-0p-bc-docs.googleusercontent.com", "doc-0q-bc-docs.googleusercontent.com", "doc-0r-bc-docs.googleusercontent.com", "doc-0s-bc-docs.googleusercontent.com", "doc-0t-bc-docs.googleusercontent.com", "doc-00-1s-docs.googleusercontent.com", "doc-01-1s-docs.googleusercontent.com", "doc-02-1s-docs.googleusercontent.com", "doc-03-1s-docs.googleusercontent.com", "doc-04-1s-docs.googleusercontent.com", "doc-05-1s-docs.googleusercontent.com", "doc-06-1s-docs.googleusercontent.com", "doc-07-1s-docs.googleusercontent.com", "doc-08-1s-docs.googleusercontent.com", "doc-09-1s-docs.googleusercontent.com", "doc-10-1s-docs.googleusercontent.com", "doc-0a-1s-docs.googleusercontent.com", "doc-0b-1s-docs.googleusercontent.com", "doc-0c-1s-docs.googleusercontent.com", "doc-0d-1s-docs.googleusercontent.com", "doc-0e-1s-docs.googleusercontent.com", "doc-0f-1s-docs.googleusercontent.com", "doc-0g-1s-docs.googleusercontent.com", "doc-0h-1s-docs.googleusercontent.com", "doc-0i-1s-docs.googleusercontent.com", "doc-0j-1s-docs.googleusercontent.com", "doc-0k-1s-docs.googleusercontent.com", "doc-0l-1s-docs.googleusercontent.com", "doc-0m-1s-docs.googleusercontent.com", "doc-0n-1s-docs.googleusercontent.com", "doc-0o-1s-docs.googleusercontent.com", "doc-0p-1s-docs.googleusercontent.com", "doc-0q-1s-docs.googleusercontent.com", "doc-0r-1s-docs.googleusercontent.com", "doc-0s-1s-docs.googleusercontent.com", "doc-0t-1s-docs.googleusercontent.com", "doc-04-80-docs.googleusercontent.com", "doc-08-6g-docs.googleusercontent.com", "doc-0k-bk-docs.googleusercontent.com", "doc-10-6g-docs.googleusercontent.com", "doc-10-00-docs.googleusercontent.com", "images1-focus-opensocial.googleusercontent.com", "images2-focus-opensocial.googleusercontent.com", "images3-focus-opensocial.googleusercontent.com", "images4-focus-opensocial.googleusercontent.com", "images5-focus-opensocial.googleusercontent.com", "images6-focus-opensocial.googleusercontent.com", "images7-focus-opensocial.googleusercontent.com", "images8-focus-opensocial.googleusercontent.com", "images9-focus-opensocial.googleusercontent.com", "images1-esmobile-opensocial.googleusercontent.com", "images2-esmobile-opensocial.googleusercontent.com", "images3-esmobile-opensocial.googleusercontent.com", "images4-esmobile-opensocial.googleusercontent.com", "images5-esmobile-opensocial.googleusercontent.com", "images6-esmobile-opensocial.googleusercontent.com", "images7-esmobile-opensocial.googleusercontent.com", "images8-esmobile-opensocial.googleusercontent.com", "images9-esmobile-opensocial.googleusercontent.com", "images-docs-opensocial.googleusercontent.com", "images-oz-opensocial.googleusercontent.com", "images-lso-opensocial.googleusercontent.com", "images-blogger-opensocial.googleusercontent.com", "images-pos-opensocial.googleusercontent.com", "lh0.googleusercontent.com", "lh1.googleusercontent.com", "lh2.googleusercontent.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "gp1.googleusercontent.com", "gp2.googleusercontent.com", "gp3.googleusercontent.com", "gp4.googleusercontent.com", "gp5.googleusercontent.com", "gp6.googleusercontent.com", "ci1.googleusercontent.com", "ci2.googleusercontent.com", "ci3.googleusercontent.com", "ci4.googleusercontent.com", "ci5.googleusercontent.com", "ci6.googleusercontent.com", "s1.googleusercontent.com", "s2.googleusercontent.com", "s3.googleusercontent.com", "s4.googleusercontent.com", "s5.googleusercontent.com", "s6.googleusercontent.com", "sp0.googleusercontent.com", "sp1.googleusercontent.com", "sp2.googleusercontent.com", "sp3.googleusercontent.com", "sp4.googleusercontent.com", "sp5.googleusercontent.com", "sp6.googleusercontent.com", "sp7.googleusercontent.com", "sp8.googleusercontent.com", "sp9.googleusercontent.com", "clients1.googleusercontent.com", "clients2.googleusercontent.com", "clients3.googleusercontent.com", "clients4.googleusercontent.com", "clients5.googleusercontent.com", "clients6.googleusercontent.com", "clients7.googleusercontent.com", "lh0.ggpht.com", "lh1.ggpht.com", "lh2.ggpht.com", "lh3.ggpht.com", "lh4.ggpht.com", "lh5.ggpht.com", "lh6.ggpht.com", "nt0.ggpht.com", "nt1.ggpht.com", "nt2.ggpht.com", "nt3.ggpht.com", "nt4.ggpht.com", "nt5.ggpht.com", "nt6.ggpht.com", "yt0.ggpht.com", "yt1.ggpht.com", "yt2.ggpht.com", "yt3.ggpht.com", "yt4.ggpht.com", "yt5.ggpht.com", "yt6.ggpht.com", "gm0.ggpht.com", "gm1.ggpht.com", "gm2.ggpht.com", "gm3.ggpht.com", "gm4.ggpht.com", "gm5.ggpht.com", "gm6.ggpht.com", "geo0.ggpht.com", "geo1.ggpht.com", "geo2.ggpht.com", "geo3.ggpht.com", "geo4.ggpht.com", "geo5.ggpht.com", "geo6.ggpht.com", "clients1.google.com", "clients2.google.com", "clients3.google.com", "clients4.google.com", "clients5.google.com", "clients6.google.com", "0.client-channel.google.com", "1.client-channel.google.com", "2.client-channel.google.com", "3.client-channel.google.com", "4.client-channel.google.com", "5.client-channel.google.com", "6.client-channel.google.com", "7.client-channel.google.com", "8.client-channel.google.com", "9.client-channel.google.com", "10.client-channel.google.com", "11.client-channel.google.com", "12.client-channel.google.com", "13.client-channel.google.com", "14.client-channel.google.com", "15.client-channel.google.com", "16.client-channel.google.com", "17.client-channel.google.com", "18.client-channel.google.com", "19.client-channel.google.com", "20.client-channel.google.com", "21.client-channel.google.com", "22.client-channel.google.com", "23.client-channel.google.com", "24.client-channel.google.com", "25.client-channel.google.com", "26.client-channel.google.com", "27.client-channel.google.com", "28.client-channel.google.com", "29.client-channel.google.com", "uploads.clients.google.com", "uploads.client.google.com", "upload.clients.google.com", "upload.client.google.com", "upload.google.com", "upload.docs.google.com", "upload.photos.google.com", "upload.drive.google.com", "upload.video.google.com", "uploads.code.google.com", "uploads.clients.google.com", "linkhelp.clients.google.com", "feedburner.google.com", "feedproxy.google.com", "0.talkgadget.google.com", "chromoting-host.talkgadget.google.com", "chromoting-oauth.talkgadget.google.com", "chromoting-client.talkgadget.google.com", "maps-api-ssl.google.com", "mapsengine.google.com", "bpui0.google.com", "i18napis.appspot.com", "safebrowsing.google.com", "safebrowsing.clients.google.com", "safebrowsing-cache.google.com", "admin.google.com", "appspot.l.google.com", "browserchannel-docs.l.google.com", "browserchannel-spreadsheets.l.google.com", "browsersync.google.com", "browsersync.l.google.com", "cache.l.google.com", "cache.pack.google.com", "cbk0.google.com", "cbk1.google.com", "cbk2.google.com", "cbk3.google.com", "cbks0.google.com", "cbks1.google.com", "cbks2.google.com", "cbks3.google.com", "dl.google.com", "dl.l.google.com", "dl-ssl.google.com", "encrypted.google.com", "encrypted-tbn.l.google.com", "encrypted-tbn0.google.com", "encrypted-tbn1.google.com", "encrypted-tbn2.google.com", "encrypted-tbn3.google.com", "gg.google.com", "ghs.google.com", "ghs.l.google.com", "ghs46.google.com", "ghs46.l.google.com", "googlecode.l.google.com", "google-public-dns-a.google.com", "google-public-dns-b.google.com", "groups.l.google.com", "investor.google.com", "kh.google.com", "kh.l.google.com", "khm.google.com", "khm.l.google.com", "khm0.google.com", "khm1.google.com", "khm2.google.com", "khm3.google.com", "khmdb.google.com", "khms.google.com", "khms.l.google.com", "khms0.google.com", "khms1.google.com", "khms2.google.com", "khms3.google.com", "lh2.google.com", "lh2.l.google.com", "lh3.google.com", "lh4.google.com", "lh5.google.com", "lh6.google.com", "mars.google.com", "mobilemaps.clients.google.com", "mt.google.com", "mt.l.google.com", "mt0.google.com", "mt1.google.com", "mt2.google.com", "mt3.google.com", "mts.google.com", "mts.l.google.com", "mts0.google.com", "mts1.google.com", "mts2.google.com", "mts3.google.com", "music.google.com", "mw1.google.com", "mw2.google.com", "picasaweb.google.com", "picasaweb.l.google.com", "services.google.com", "sandbox.google.com", "pack.google.com", "sb.google.com", "sb-ssl.google.com", "script.google.com", "security.google.com", "id.google.com", "id.l.google.com", "tbn0.google.com", "tbn1.google.com", "tbn2.google.com", "tbn3.google.com", "voice.google.com", "wifi.google.com", "g.co", "goo.gl", "goto.google.com", "0.docs.google.com", "1.docs.google.com", "2.docs.google.com", "3.docs.google.com", "4.docs.google.com", "5.docs.google.com", "6.docs.google.com", "7.docs.google.com", "8.docs.google.com", "9.docs.google.com", "10.docs.google.com", "0.drive.google.com", "1.drive.google.com", "2.drive.google.com", "3.drive.google.com", "4.drive.google.com", "5.drive.google.com", "6.drive.google.com", "7.drive.google.com", "8.drive.google.com", "9.drive.google.com", "10.drive.google.com", "bks0.books.google.com", "bks1.books.google.com", "bks2.books.google.com", "bks3.books.google.com", "bks4.books.google.com", "bks5.books.google.com", "bks6.books.google.com", "bks7.books.google.com", "bks8.books.google.com", "bks9.books.google.com", "bks10.books.google.com", "spreadsheets0.google.com", "spreadsheets1.google.com", "spreadsheets2.google.com", "spreadsheets3.google.com", "spreadsheets4.google.com", "spreadsheets5.google.com", "spreadsheets6.google.com", "spreadsheets7.google.com", "spreadsheets8.google.com", "spreadsheets9.google.com", "news.google.com.hk", "books.google.com.hk", "accounts.google.com.hk", "clients1.google.com.hk", "encrypted.google.com.hk", "groups.google.com.hk", "id.google.com.hk", "images.google.com.hk", "m.google.com.hk", "maps.google.com.hk", "picasaweb.google.com.hk", "scholar.google.com.hk", "toolbar.google.com.hk", "translate.google.com.hk", "wenda.google.com.hk", "www.google.com.hk", "www.google.com.tw", "accounts.google.com.tw", "maps.google.com.tw", "news.google.com.tw", "books.google.com.tw", "clients1.google.com.tw", "encrypted.google.com.tw", "groups.google.com.tw", "id.google.com.tw", "images.google.com.tw", "m.google.com.tw", "picasaweb.google.com.tw", "scholar.google.com.tw", "toolbar.google.com.tw", "toolbarqueries.google.com.tw", "translate.google.com.tw", "g.cn", "www.g.cn", "www.gstatic.cn", "ditu.google.cn", "maps.google.cn", "gg.google.cn", "id.google.cn", "maps.gstatic.cn", "m.google.cn", "mt.google.cn", "mt0.google.cn", "mt1.google.cn", "mt2.google.cn", "mt3.google.cn", "news.google.cn", "scholar.google.cn", "translate.google.cn", "www.google.cn", "accounts.l.google.com", "csi.l.google.com", "googleapis.l.google.com", "maps.l.google.com", "code.l.google.com", "news.l.google.com", "images.l.google.com", "mobile.l.google.com", "talkx.l.google.com", "talk.l.google.com", "large-uploads.l.google.com", "writely.l.google.com", "writely-china.l.google.com", "writely-com.l.google.com", "www.l.google.com", "www2.l.google.com", "www3.l.google.com", "www4.l.google.com", "ytstatic.l.google.com", "wildcard-talkgadget.l.google.com", "mobile-gtalk.l.google.com", "safebrowsing.cache.l.google.com", "spreadsheets-china.l.google.com", "spreadsheets.l.google.com", "suggestqueries.l.google.com", "video-stats.l.google.com", "sb.l.google.com", "sb-ssl.l.google.com", "scholar.l.google.com", "wifi.l.google.com", "wire.l.google.com", "tools.l.google.com", "photos-ugc.l.google.com", "music-streaming.l.google.com", "googlehosted.l.googleusercontent.com", "www.googledrive.com", "map.google.com", "mage.google.com", "plusone.google.com", "spreadsheet.google.com", "ditu.google.com", "local.google.com", "answers.google.com", "profiles.google.com", "writely.google.com", "buzz.google.com", "ssl.google-analytics.com", "www.google-analytics.com", "googlesource.com", "www.googlesource.com", "android.googlesource.com", "chromium.googlesource.com", "gerrit.googlesource.com", "kernel.googlesource.com", "gwt.googlesource.com"]; #include ~/io/file.ejs #include ~/io/textfile.ejs /* IP辅助对象 */ var IP = { toInt: function(ip) { var ipTest =/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; var xH = "", result = ipTest.exec(ip); if(!result) return -1; return (parseInt(result[1]) << 24 | parseInt(result[2]) << 16 | parseInt(result[3]) << 8 | parseInt(result[4])); }, toString: function(ip) { if(ip < 0 || ip > 0xFFFFFFFF){ throw new ArgumentException("参数超过IPV4地址范围。"); } return (ip >>> 24) + "." + (ip >> 16 & 0xFF) + "." + (ip >> 8 & 0xFF) + "." + (ip & 0xFF); } } var main = function() { //开始搜索的IP地址 var start = 1089054986; //结束搜索的IP地址 var end = 1089077247; //使用对话框接收值 while(true) { var _start = prompt("请输入开始搜索的IP(默认从" + IP.toString(start) + "开始搜索):"); if(_start !== null) { _start = IP.toInt(_start); if(_start === -1) { alert("请输入正确的IP地址。"); continue; } start = _start; } break; } console.log("从" + IP.toString(start) + "开始检索。"); while(true) { var _count = prompt("请输入要检索的IP个数(默认检索到" + IP.toString(end) + "):"); if(_count !== null) { _count = parseInt(_count); if(isNaN(_count)) { alert("请输入阿拉伯数字作为要检索的IP个数!"); continue; } end = start + _count - 1; } break; } console.log("检索到" + IP.toString(end) + "结束。"); //为了避免底部http协议视图区域显示http数据封包,加快检索速度这里避免使用内置“http”对象,而是实例化新的http对象。 var h = new Http(); var ipaddr, lastTime = 9999999999; var ipTotal = (end - start) + 1; //总数 if(!confirm("需要搜索" + ipTotal + "个IP地址,搜索可能会消耗较长的时间,是否继续?")) { console.error("用户停止执行脚本。"); return; //退出服务 } var count = 0; //开始检索 for(var ip = start; ip <= end; ip++) { //计算运行时间 var beginTime = new Date().getTime(); try { var temp = IP.toString(ip); var url = "http://" + temp; //延时超过300毫秒的服务器都丢掉 var timeout = h.TestIP(temp, 300); if(timeout != -1) { var htmlText = h.get(url, "utf-8"); if(htmlText.indexOf("按回车键进行搜索。") > -1) { var endTime = new Date().getTime(); var time = endTime - beginTime; if(lastTime > time) { lastTime = time; ipaddr = temp; } console.info(url + "地址访问耗时:" + time + "毫秒。"); } else { console.error(url + "不是Google搜索服务首页。"); } } else { console.error(url + "地址访问超时。"); } } catch(e) { var endTime = new Date().getTime(); var time = endTime - beginTime; console.error(e.message + "\r\n耗时:" + time + "毫秒。"); } count++; console.info("搜索进度:完成" + (count / ipTotal * 100).toFixed(2) + "%。"); } if(ipaddr === undefined) { console.error("未能搜索到可用的Google服务器IP地址。"); return; } console.info("最优Google搜索服务器:http://" + ipaddr); //将最优IP缓存入系统hosts文件 if(confirm("是否将" + ipaddr + "缓存入系统hosts文件?\r\n\r\n警告:缓存过程中请勿停止执行脚本,否则可能造成hosts缓存数据丢失!!!")) { var env = System.Environment; var hosts = env.SystemDirectory + "\\drivers\\etc\\hosts"; if(File.exists(hosts)) { console.info("当前系统hosts文件路径:" + hosts); var lines = []; var i = 0; //先读取hosts文件 var reader = new TextReader(hosts, "utf-8"); try { var skip = false; while(reader.peek() > -1) { var line = reader.readLine(); if(line.indexOf(hostsMarkBegin) === 0) { skip = true; } if(!skip) { lines[i++] = line; } if(line.indexOf(hostsMarkEnd) === 0) { skip = false; } } lines[i++] = hostsMarkBegin; for(var j = 0; j < googleDomains.length; j++) { lines[i++] = ipaddr + " " + googleDomains[j]; } lines[i++] = hostsMarkEnd; } catch(e) { console.error(e.message); } finally { reader.close(); } var hosts_backup = env.SystemDirectory + "\\drivers\\etc\\hosts_ejs_backup"; //先备份一份hosts数据 File.copy(hosts, hosts_backup, true); console.info("已备份hosts文件至:" + hosts_backup); //写新的hosts文件 File.writeAllLines(hosts, lines, "utf-8"); console.info("已将" + ipaddr + "地址缓存入系统hosts文件。\r\n友情提示:如果未能及时生效请在命令行环境中键入“ipconfig /flushdns”指令刷新DNS。在刷新DNS后还是无效请检查下当前系统的hosts文件是否存在非EJS脚本生成的Google域名DNS缓存,如果存在删除非EJS脚本生成的Google域名DNS缓存即可生效。"); } else { console.error("未找到hosts文件。"); } } } //程序开始执行 main(); 建议在执行脚本前先手动备份hosts文件,使用此脚本产生的任何后果由用户自行负责,脚本作者不承担任何后果。

Posted in: EJSTool

Tags:

【例子】EJS调用webapi

二月 26, 2015 at 11:33 下午Easton
EJS最擅长的工作就是调用webapi,由于JSON数据格式本身就是JS原生支持的,因此在处理webapi方面,EJS脚本可以直接解析webapi返回的JSON数据,并作为对象直接使用。   声明:下列接口源于互联网,仅作参考,请勿用于商业目的,如有侵权,请联系删除。 clear(); var htmlText = http.get("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15811111111", "gbk"); eval(htmlText); console.log(__GetZoneResult_.catName) //删除对象 delete __GetZoneResult_ 由于淘宝webapi接口返回的数据格式并不是标准的JSON数据格式,而是JS代码,因此需要通过eval来解释运行,如果使用“JSON.parse”解析数据将产生错误。 运行结果如下图所示: 通过下面的数据浏览视图可以查看通过http对象发出的所有请求数据。

Posted in: EJSTool

Tags:

使用EJS脚本实现花生壳动态域名更新服务(二)

二月 26, 2015 at 8:46 下午Easton
在《使用EJS脚本实现花生壳动态域名更新服务(一)》中,我们粗暴的把代码放在一起,然后执行。利用EJS支持的“#include”预编译指令我们可以以更加优美的方式组织代码。 步骤如下: 把BASE64编码部分的代码复制到一个新建的脚本。 /** * UTF16和UTF8转换对照表 * U+00000000 – U+0000007F 0xxxxxxx * U+00000080 – U+000007FF 110xxxxx 10xxxxxx * U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx * U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ var Base64 = { // 转码表 table : [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' ,'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' ], UTF16ToUTF8 : function(str) { var res = [], len = str.length; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); if (code > 0x0000 && code <= 0x007F) { // 单字节,这里并不考虑0x0000,因为它是空字节 // U+00000000 – U+0000007F 0xxxxxxx res.push(str.charAt(i)); } else if (code >= 0x0080 && code <= 0x07FF) { // 双字节 // U+00000080 – U+000007FF 110xxxxx 10xxxxxx // 110xxxxx var byte1 = 0xC0 | ((code >> 6) & 0x1F); // 10xxxxxx var byte2 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2) ); } else if (code >= 0x0800 && code <= 0xFFFF) { // 三字节 // U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx // 1110xxxx var byte1 = 0xE0 | ((code >> 12) & 0x0F); // 10xxxxxx var byte2 = 0x80 | ((code >> 6) & 0x3F); // 10xxxxxx var byte3 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2), String.fromCharCode(byte3) ); } else if (code >= 0x00010000 && code <= 0x001FFFFF) { // 四字节 // U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (code >= 0x00200000 && code <= 0x03FFFFFF) { // 五字节 // U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ { // 六字节 // U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, UTF8ToUTF16 : function(str) { var res = [], len = str.length; var i = 0; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); // 对第一个字节进行判断 if (((code >> 7) & 0xFF) == 0x0) { // 单字节 // 0xxxxxxx res.push(str.charAt(i)); } else if (((code >> 5) & 0xFF) == 0x6) { // 双字节 // 110xxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var byte1 = (code & 0x1F) << 6; var byte2 = code2 & 0x3F; var utf16 = byte1 | byte2; res.push(Sting.fromCharCode(utf16)); } else if (((code >> 4) & 0xFF) == 0xE) { // 三字节 // 1110xxxx 10xxxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var code3 = str.charCodeAt(++i); var byte1 = (code << 4) | ((code2 >> 2) & 0x0F); var byte2 = ((code2 & 0x03) << 6) | (code3 & 0x3F); var utf16 = ((byte1 & 0x00FF) << 8) | byte2 res.push(String.fromCharCode(utf16)); } else if (((code >> 3) & 0xFF) == 0x1E) { // 四字节 // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (((code >> 2) & 0xFF) == 0x3E) { // 五字节 // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (((code >> 1) & 0xFF) == 0x7E)*/ { // 六字节 // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, encode : function(str) { if (!str) { return ''; } var utf8 = this.UTF16ToUTF8(str); // 转成UTF8 var i = 0; // 遍历索引 var len = utf8.length; var res = []; while (i < len) { var c1 = utf8.charCodeAt(i++) & 0xFF; res.push(this.table[c1 >> 2]); // 需要补2个= if (i == len) { res.push(this.table[(c1 & 0x3) << 4]); res.push('=='); break; } var c2 = utf8.charCodeAt(i++); // 需要补1个= if (i == len) { res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[(c2 & 0x0F) << 2]); res.push('='); break; } var c3 = utf8.charCodeAt(i++); res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]); res.push(this.table[c3 & 0x3F]); } return res.join(''); }, decode : function(str) { if (!str) { return ''; } var len = str.length; var i = 0; var res = []; while (i < len) { code1 = this.table.indexOf(str.charAt(i++)); code2 = this.table.indexOf(str.charAt(i++)); code3 = this.table.indexOf(str.charAt(i++)); code4 = this.table.indexOf(str.charAt(i++)); c1 = (code1 << 2) | (code2 >> 4); c2 = ((code2 & 0xF) << 4) | (code3 >> 2); c3 = ((code3 & 0x3) << 6) | code4; res.push(String.fromCharCode(c1)); if (code3 != 64) { res.push(String.fromCharCode(c2)); } if (code4 != 64) { res.push(String.fromCharCode(c3)); } } return this.UTF8ToUTF16(res.join('')); } }; 将脚本命名为“base64.ejs”,放在一个你喜欢的目录,在例子中我们把这个文件保存在桌面。 路径如下:X:\Users\USER\Desktop\base64.ejs 再新建一个脚本,键入下面代码: #include base64.ejs clear() /* good 更新成功,域名的IP地址已经更新,同时会返回本次更新成功的IP,用空格隔开,如:good 1.2.3.4 nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样 notfqdn 未有激活花生壳的域名 nohost 域名不存在或未激活花生壳 nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样 abuse 请求失败,频繁请求或验证失败时会出现 !donator 表示此功能需要付费用户才能使用,如https 911 系统错误 */ var hostname = prompt("请输入要更新的动态域名:"); var user = prompt("请输入账号:"); var pwd = prompt("请输入密码:"); var result = http.get("http://ddns.oray.com/ph/update?hostname=" + hostname, "User-Agent:Oray\nAuthorization:Basic " + Base64.encode(user + ":" + pwd), "utf-8"); console.log(result); 将脚本命名为“花生壳更新.ejs”,放在与“base64.ejs”相同的目录内。 路径如下:X:\Users\USER\Desktop\花生壳更新.ejs 执行脚本“花生壳更新.ejs”后可更新花生壳域名。 注意:直接执行 base64.ejs 的脚本是没有结果的,这个脚本内只是定义了Base64编码的对象,并未调用。 在“花生壳更新.ejs”脚本的第一行我们会看到: #include base64.ejs 这句代码的作用就是将“base64.ejs”内的代码copy到“花生壳更新.ejs”内的“#include base64.ejs”处,这个过程是通过EJS的预编译器实现的。 EJS脚本的执行过程如下: 需要注意的是“#include base64.ejs”的路径搜索问题,这里的搜索路径是当前运行的EJS脚本路径。 比如:X:\Users\USER\Desktop\花生壳更新.ejs,那么“#include base64.ejs”内的“base64.ejs”搜索目录就是“X:\Users\USER\Desktop\”。 更多关于“#include”指令的信息请参考《在EJS脚本内使用“#include”预编译指令》。

Posted in: EJSTool

Tags:

使用EJS脚本实现花生壳动态域名更新服务(一)

二月 26, 2015 at 8:31 下午Easton
花生壳提供了动态域名服务,动态域名可实现几乎实时生效的DNS解析服务,并且花生壳还提供了webapi更新域名解析的服务。 通过EJS我们可以轻松调用花生壳提供的webapi服务实现动态域名更新功能。 注意:这个webapi是采用Http Basic Authentication(HTTP基本认证)的,因此账号和密码必须用BASE64(account:password)编码后放在请求头。具体实现请参考下面代码,Base64编码部分代码copy自互联网,版权由原作者所有。 代码如下: clear() /** * UTF16和UTF8转换对照表 * U+00000000 – U+0000007F 0xxxxxxx * U+00000080 – U+000007FF 110xxxxx 10xxxxxx * U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx * U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ var Base64 = { // 转码表 table : [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' ,'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' ], UTF16ToUTF8 : function(str) { var res = [], len = str.length; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); if (code > 0x0000 && code <= 0x007F) { // 单字节,这里并不考虑0x0000,因为它是空字节 // U+00000000 – U+0000007F 0xxxxxxx res.push(str.charAt(i)); } else if (code >= 0x0080 && code <= 0x07FF) { // 双字节 // U+00000080 – U+000007FF 110xxxxx 10xxxxxx // 110xxxxx var byte1 = 0xC0 | ((code >> 6) & 0x1F); // 10xxxxxx var byte2 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2) ); } else if (code >= 0x0800 && code <= 0xFFFF) { // 三字节 // U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx // 1110xxxx var byte1 = 0xE0 | ((code >> 12) & 0x0F); // 10xxxxxx var byte2 = 0x80 | ((code >> 6) & 0x3F); // 10xxxxxx var byte3 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2), String.fromCharCode(byte3) ); } else if (code >= 0x00010000 && code <= 0x001FFFFF) { // 四字节 // U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (code >= 0x00200000 && code <= 0x03FFFFFF) { // 五字节 // U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ { // 六字节 // U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, UTF8ToUTF16 : function(str) { var res = [], len = str.length; var i = 0; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); // 对第一个字节进行判断 if (((code >> 7) & 0xFF) == 0x0) { // 单字节 // 0xxxxxxx res.push(str.charAt(i)); } else if (((code >> 5) & 0xFF) == 0x6) { // 双字节 // 110xxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var byte1 = (code & 0x1F) << 6; var byte2 = code2 & 0x3F; var utf16 = byte1 | byte2; res.push(Sting.fromCharCode(utf16)); } else if (((code >> 4) & 0xFF) == 0xE) { // 三字节 // 1110xxxx 10xxxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var code3 = str.charCodeAt(++i); var byte1 = (code << 4) | ((code2 >> 2) & 0x0F); var byte2 = ((code2 & 0x03) << 6) | (code3 & 0x3F); var utf16 = ((byte1 & 0x00FF) << 8) | byte2 res.push(String.fromCharCode(utf16)); } else if (((code >> 3) & 0xFF) == 0x1E) { // 四字节 // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (((code >> 2) & 0xFF) == 0x3E) { // 五字节 // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (((code >> 1) & 0xFF) == 0x7E)*/ { // 六字节 // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, encode : function(str) { if (!str) { return ''; } var utf8 = this.UTF16ToUTF8(str); // 转成UTF8 var i = 0; // 遍历索引 var len = utf8.length; var res = []; while (i < len) { var c1 = utf8.charCodeAt(i++) & 0xFF; res.push(this.table[c1 >> 2]); // 需要补2个= if (i == len) { res.push(this.table[(c1 & 0x3) << 4]); res.push('=='); break; } var c2 = utf8.charCodeAt(i++); // 需要补1个= if (i == len) { res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[(c2 & 0x0F) << 2]); res.push('='); break; } var c3 = utf8.charCodeAt(i++); res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]); res.push(this.table[c3 & 0x3F]); } return res.join(''); }, decode : function(str) { if (!str) { return ''; } var len = str.length; var i = 0; var res = []; while (i < len) { code1 = this.table.indexOf(str.charAt(i++)); code2 = this.table.indexOf(str.charAt(i++)); code3 = this.table.indexOf(str.charAt(i++)); code4 = this.table.indexOf(str.charAt(i++)); c1 = (code1 << 2) | (code2 >> 4); c2 = ((code2 & 0xF) << 4) | (code3 >> 2); c3 = ((code3 & 0x3) << 6) | code4; res.push(String.fromCharCode(c1)); if (code3 != 64) { res.push(String.fromCharCode(c2)); } if (code4 != 64) { res.push(String.fromCharCode(c3)); } } return this.UTF8ToUTF16(res.join('')); } }; /* good 更新成功,域名的IP地址已经更新,同时会返回本次更新成功的IP,用空格隔开,如:good 1.2.3.4 nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样 notfqdn 未有激活花生壳的域名 nohost 域名不存在或未激活花生壳 nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样 abuse 请求失败,频繁请求或验证失败时会出现 !donator 表示此功能需要付费用户才能使用,如https 911 系统错误 */ var hostname = prompt("请输入要更新的动态域名:"); var user = prompt("请输入账号:"); var pwd = prompt("请输入密码:"); var result = http.get("http://ddns.oray.com/ph/update?hostname=" + hostname, "User-Agent:Oray\nAuthorization:Basic " + Base64.encode(user + ":" + pwd), "utf-8"); console.log(result); 将代码复制到R5以上版本的IDE工具可运行。

Posted in: EJSTool

Tags:

使用EJS脚本将字符串转换成Base64编码

二月 26, 2015 at 7:53 下午Easton
  由于EJS脚本解释器是完美支持 ECMA-262 标准的,因此EJS脚本是JavaScript的真超集。 说了一段废话后,我其实是想说我在网上copy了一段JS支持的将字符串转换成Base64编码的代码,不知出处,这里斗胆将代码贴出,如有侵权请联系删除。 var Base64 = { // 转码表 table : [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' ,'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' ], UTF16ToUTF8 : function(str) { var res = [], len = str.length; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); if (code > 0x0000 && code <= 0x007F) { // 单字节,这里并不考虑0x0000,因为它是空字节 // U+00000000 – U+0000007F 0xxxxxxx res.push(str.charAt(i)); } else if (code >= 0x0080 && code <= 0x07FF) { // 双字节 // U+00000080 – U+000007FF 110xxxxx 10xxxxxx // 110xxxxx var byte1 = 0xC0 | ((code >> 6) & 0x1F); // 10xxxxxx var byte2 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2) ); } else if (code >= 0x0800 && code <= 0xFFFF) { // 三字节 // U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx // 1110xxxx var byte1 = 0xE0 | ((code >> 12) & 0x0F); // 10xxxxxx var byte2 = 0x80 | ((code >> 6) & 0x3F); // 10xxxxxx var byte3 = 0x80 | (code & 0x3F); res.push( String.fromCharCode(byte1), String.fromCharCode(byte2), String.fromCharCode(byte3) ); } else if (code >= 0x00010000 && code <= 0x001FFFFF) { // 四字节 // U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (code >= 0x00200000 && code <= 0x03FFFFFF) { // 五字节 // U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ { // 六字节 // U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, UTF8ToUTF16 : function(str) { var res = [], len = str.length; var i = 0; for (var i = 0; i < len; i++) { var code = str.charCodeAt(i); // 对第一个字节进行判断 if (((code >> 7) & 0xFF) == 0x0) { // 单字节 // 0xxxxxxx res.push(str.charAt(i)); } else if (((code >> 5) & 0xFF) == 0x6) { // 双字节 // 110xxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var byte1 = (code & 0x1F) << 6; var byte2 = code2 & 0x3F; var utf16 = byte1 | byte2; res.push(Sting.fromCharCode(utf16)); } else if (((code >> 4) & 0xFF) == 0xE) { // 三字节 // 1110xxxx 10xxxxxx 10xxxxxx var code2 = str.charCodeAt(++i); var code3 = str.charCodeAt(++i); var byte1 = (code << 4) | ((code2 >> 2) & 0x0F); var byte2 = ((code2 & 0x03) << 6) | (code3 & 0x3F); var utf16 = ((byte1 & 0x00FF) << 8) | byte2 res.push(String.fromCharCode(utf16)); } else if (((code >> 3) & 0xFF) == 0x1E) { // 四字节 // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx } else if (((code >> 2) & 0xFF) == 0x3E) { // 五字节 // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } else /** if (((code >> 1) & 0xFF) == 0x7E)*/ { // 六字节 // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx } } return res.join(''); }, encode : function(str) { if (!str) { return ''; } var utf8 = this.UTF16ToUTF8(str); // 转成UTF8 var i = 0; // 遍历索引 var len = utf8.length; var res = []; while (i < len) { var c1 = utf8.charCodeAt(i++) & 0xFF; res.push(this.table[c1 >> 2]); // 需要补2个= if (i == len) { res.push(this.table[(c1 & 0x3) << 4]); res.push('=='); break; } var c2 = utf8.charCodeAt(i++); // 需要补1个= if (i == len) { res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[(c2 & 0x0F) << 2]); res.push('='); break; } var c3 = utf8.charCodeAt(i++); res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]); res.push(this.table[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]); res.push(this.table[c3 & 0x3F]); } return res.join(''); }, decode : function(str) { if (!str) { return ''; } var len = str.length; var i = 0; var res = []; while (i < len) { code1 = this.table.indexOf(str.charAt(i++)); code2 = this.table.indexOf(str.charAt(i++)); code3 = this.table.indexOf(str.charAt(i++)); code4 = this.table.indexOf(str.charAt(i++)); c1 = (code1 << 2) | (code2 >> 4); c2 = ((code2 & 0xF) << 4) | (code3 >> 2); c3 = ((code3 & 0x3) << 6) | code4; res.push(String.fromCharCode(c1)); if (code3 != 64) { res.push(String.fromCharCode(c2)); } if (code4 != 64) { res.push(String.fromCharCode(c3)); } } return this.UTF8ToUTF16(res.join('')); } }; clear(); console.log(Base64.encode("1234567")); 使用EJS的IDE工具执行上述代码后将在控制台输出“MTIzNDU2Nw==”。 上述代码删除后clear()函数后可直接在chrome浏览器内执行。

Posted in: EJSTool

Tags:

在EJS脚本内使用“#include”预编译指令

二月 22, 2015 at 5:23 下午Easton
预编译指令是Easton JavaScript脚本解释器对JavaScript语言拓展的重要功能之一,使用预编译指令可以引用外部的JS脚本代码,类似于HTML内的<script>标签引用外部JS脚本。 #include语法解释 以“#include”指令开始,一行一个指令,指令后面加不加空格都无所谓,但是为了方便阅读通常情况下都加一个空格。 例如: //引用运行库内的AES模块 #include ~/encrypt/aes.ejs “~”符号表示运行库根路径,后接目录名称和文件名,文件名必须接上后缀。 如果不加“~”符号,则预编译器将以当前运行的脚本文件路径为搜索目录(可参考运行库的“__init__.ejs”文件)。

Posted in: EJSTool

Tags: