大洲 发表于 2013-5-21 07:46:31

思路,功能介绍及DEMO之5: 如何做一个自己的插件

你需要在Visual Studio 中,引用
using Mr9.SiteMirror.IPlugin;




构造中初使化变量: 插件类型,名称,版本,guid,介绍 ,支持URL,和处理的内容类型 ,以及一些你自己可能用到的自己定义的变量.



有2个函数是你必须要处理的, 来自于IMr9SMPlugin 接口

一个是MANAGE,一个是EXECUTE



都只有一个参数 和一个标准的返回类型


数据结构如上.


你可以获取到当前用户的URL和QUERYSTRING,也可以获取到 POST 数据
也可以知道是GET,还是POST.当前请求的域名,目标域名等等.

返回类型为PluginResult , 包括 :
Completed = 完成,继续执行下一个
Failed = 执行失败,继续下一个
Redirect = 完成,结果跳转到一个指定URL
ShowContent = 完成,后面的插件不处理 ,显示一个 自定义内容.

当 结果为 Redirect的时候,StringValue 为 URL,BytesValue 为空
当结果为 ShowContent 的时候,StringValue 为 MimeType , BytesValue 为你要显示的内容.如果是HTML要显示,需要先 Encoding.UTF8.GetBytes(html) 一下.

来看看 NOSCRIPT插件 的源代码 .
这是一个过滤乱七八JS的插件.逻辑上很简单:
保留当前自己域名下的JS, 和包含JQUERY关键字的JS.别的可能是广告,都干掉.
这个插件的可配置版本,后面有空了整完美.

            PluginResult _Result = new PluginResult();
            _Result.ResultType = PluginResultType.Failed;

            if (requestMeta == null)
                return _Result;//如果请求信息异常,直接退了

            if ((requestMeta.ContentType & this._ContentType4Plugin) != ContentTypes.HTML)
                return _Result;//如果内容类型不是HTML的,不处理 .退了

            if (!File.Exists(requestMeta.OutputFilePath))
                return _Result; //如果CACHE文件不存在,退了.


            try{
            string _content = File.ReadAllText(requestMeta.OutputFilePath);//读取HTML文件内容


            HtmlAgilityPack.HtmlDocument _doc = new HtmlAgilityPack.HtmlDocument();
            _doc.LoadHtml(_content);   //获取 一个DOM解析对像.


            bool _changed = false;   //做个标志,是否有改动.因为没改动,就不需要再写文件了.不然会浪费IO.
            var _ScriptNodes = _doc.DocumentNode.SelectNodes("//script");   //用XPATH查找所有的SCRIPT对像.
            if (_ScriptNodes != null)
                foreach (var item in _ScriptNodes)
                {
                  if(item.Attributes["src"]!=null)
                  {
                  try
                  {
                        Uri _url = new Uri(item.Attributes["src"].Value);
                        if (_url.Host.Equals(requestMeta.Domain, StringComparison.OrdinalIgnoreCase) ||
                            _url.ToString().IndexOf("jquery") > 0
//如果SCRIPT SRC 的值不为空,并且(域名和当前域名相同,或者包括 JQUERY 关键字的时候,不处理 .
                            )
                            continue;
                        else
                        {
                            item.Remove(); //否则干掉.
                            _changed = true; //做个标志,有修改.
                        }
                  }
                  catch { }
                  }
                }


            if (_changed)//如果发生了修改
            {
                _content = _doc.DocumentNode.WriteTo();
                File.WriteAllText(requestMeta.OutputFilePath, _content);
//写回去.
            }

            _Result.ResultType = PluginResultType.Completed; //设置插件工作完成了.
            return _Result; //返回给SM继续处理 下一个.

            }
            catch{}

            return _Result;


搞定.






sadffg 发表于 2013-5-21 08:01:28

我表示完全晕菜:L

Jack 发表于 2013-5-21 11:20:33

这个超实用,但是超级蒙

goyh 发表于 2013-5-22 20:29:08

看不懂了,,这个

dfzds 发表于 2013-6-6 08:28:05

这是给牛人的课,我等完全败退。

~星~ 发表于 2013-10-16 11:20:02

插件太厉害了

muster 发表于 2014-1-1 10:34:42

这个插件能实现过滤所有站的原站的js的广告?
页: [1]
查看完整版本: 思路,功能介绍及DEMO之5: 如何做一个自己的插件