|
你需要在Visual Studio 中,引用
% h0 ~ d, \. @' S- Q) U) Susing Mr9.SiteMirror.IPlugin;
G" Y' C) @0 u: \6 }: o' e/ A& n( [) ^; k
2 Z, P2 g) A& k2 E6 g! ~' M
3 }( P4 r" l/ P" y1 \
! y& a$ X$ Q7 f) \& A
构造中初使化变量: 插件类型,名称,版本,guid,介绍 ,支持URL,和处理的内容类型 ,以及一些你自己可能用到的自己定义的变量.6 X& T8 C. Y- u, i
2 o+ \, z+ i) E% d4 y) W! g0 z) A# N7 y9 v% L! S3 @
B! W' }) W+ W6 D7 H, O1 `有2个函数是你必须要处理的, 来自于 IMr9SMPlugin 接口9 e6 @8 W& b3 x, f; x
. F9 r" D+ S6 m# J一个是MANAGE,一个是EXECUTE
. O$ c6 H6 A( f5 r
r5 ], n5 V% e: Z, b& S- T! S. o; Z, m
4 P+ K; J" }$ g2 B% Q8 [+ ^8 ?
都只有一个参数 和一个标准的返回类型
. P- V D9 k# {/ t% U! k0 M" K5 g% k1 W3 u/ o' T
9 J/ a: ~8 |) i9 Y' e0 t4 J' u b数据结构如上.
+ ?+ i8 `' `& H+ K; ]
. _3 ~; @+ l0 Q
/ q) G6 Z" O, K你可以获取到当前用户的URL和QUERYSTRING,也可以获取到 POST 数据
5 G! A# {, i! w) u* W: K也可以知道是GET,还是POST. 当前请求的域名,目标域名等等.
# J7 F( b* l! K0 @& N6 ]
/ P+ I. K! ]+ K" F返回类型为PluginResult , 包括 :' {+ _/ \- e |) ?: b& y3 V5 |
Completed = 完成,继续执行下一个 I+ w3 x3 H: T+ G+ D) z' j# N
Failed = 执行失败,继续下一个
2 x% p% A9 T( b5 o! @4 q& yRedirect = 完成,结果跳转到一个指定URL
& a0 a& k; J8 A* D. L# BShowContent = 完成,后面的插件不处理 ,显示一个 自定义内容.
7 _4 [0 `+ j" A; [* a. A6 Z: L4 R& m
当 结果为 Redirect的时候,StringValue 为 URL,BytesValue 为空$ e" c4 w8 Y5 J& V
当结果为 ShowContent 的时候,StringValue 为 MimeType , BytesValue 为你要显示的内容.如果是HTML要显示,需要先 Encoding.UTF8.GetBytes(html) 一下.1 D4 J m' J0 ]9 W1 g" K! M
$ N* {. s" S* h5 h/ d. h9 d1 e6 a来看看 NOSCRIPT插件 的源代码 .4 l, ?* s, o& d4 T$ s" z9 E! D
这是一个过滤乱七八JS的插件. 逻辑上很简单:
" H' ]' X2 z3 m, B) a保留当前自己域名下的JS, 和包含JQUERY关键字的JS.别的可能是广告,都干掉.
7 ^. A1 o; u/ F9 `, l% ~; P这个插件的可配置版本,后面有空了整完美. PluginResult _Result = new PluginResult();
4 I. W: t( m9 S _Result.ResultType = PluginResultType.Failed;
1 i- b' K) Y- n4 K: H- ^6 @, S
" F: g- l2 K% |; \& i: a5 G$ U6 c if (requestMeta == null)
- }- E) m. G" `- {3 X. A" o2 n% p return _Result; //如果请求信息异常,直接退了
' D" O5 q7 P$ a# k
1 g; z; d# ?8 X% W; t, _ if ((requestMeta.ContentType & this._ContentType4Plugin) != ContentTypes.HTML)/ C4 l' w( y: h
return _Result; //如果内容类型不是HTML的,不处理 .退了
* x1 O! B- N* P3 p" U
2 @* w" x3 W$ W, D' N( `. S if (!File.Exists(requestMeta.OutputFilePath))
1 Y, ~5 m' ?* c5 R return _Result; //如果CACHE文件不存在,退了.8 \4 L C0 ]' z) t
5 w/ J4 S5 c' Q. E0 o/ F7 G: X+ A
3 h. t [" h' L; S- z try{
3 \* R2 E6 _7 S" r! P7 S$ F# W string _content = File.ReadAllText(requestMeta.OutputFilePath); //读取HTML文件内容# _. x% F1 m+ u, R9 Q( U
" V) t& o' W9 D9 |% V
6 d% B& C9 N. V$ ~& v
HtmlAgilityPack.HtmlDocument _doc = new HtmlAgilityPack.HtmlDocument();
4 `* M2 ?' M0 N" q! j _doc.LoadHtml(_content); //获取 一个DOM解析对像.
1 l+ D( S4 g/ ]' a) \/ X
9 h) d* c0 Y% U4 Q6 P
% h7 d4 P3 v! o2 e bool _changed = false; //做个标志,是否有改动.因为没改动,就不需要再写文件了.不然会浪费IO.8 ]( t5 x, F) m9 x. Y' e
var _ScriptNodes = _doc.DocumentNode.SelectNodes("//script"); //用XPATH查找所有的SCRIPT对像.
" U& j/ U8 @$ w3 O; W/ Y if (_ScriptNodes != null)
; w1 n8 m1 D0 C0 f9 J/ [ foreach (var item in _ScriptNodes)1 P8 a" S9 z& q" R, k; c
{, o+ B9 F* I x+ h" ^
if(item.Attributes["src"]!=null)
% F% Q4 A3 F! L! P" _ {
, D8 U0 `1 E. O try+ H$ F5 |' x6 ]4 D
{- N' ]- M4 D9 K. `3 u: m
Uri _url = new Uri(item.Attributes["src"].Value); F+ K! Q. r; l9 D! i# r1 P# F5 v
if (_url.Host.Equals(requestMeta.Domain, StringComparison.OrdinalIgnoreCase) ||
: E, W5 i" t, h7 } ]" ~% w& i, B( r _url.ToString().IndexOf("jquery") > 0. A0 a9 i4 L/ T% w
//如果SCRIPT SRC 的值不为空,并且(域名和当前域名相同,或者包括 JQUERY 关键字的时候,不处理 .5 |2 i& {* W9 t* H* ~
)
8 E. M. ^9 o" A7 A' L9 ^ continue;
+ w9 A; W+ x" u* Y0 [ else
- W4 O* A$ n5 }" i {: Z1 I3 W/ J9 F$ T* a
item.Remove(); //否则干掉.2 e: f: u! L; M
_changed = true; //做个标志,有修改./ ` h' X$ C! S5 P( I
}
$ N/ F( A$ G B$ w }
" P, \: `: V) _ catch { }
7 O! h( v2 x% `" K6 y }
! C4 |: o5 I8 \7 J1 Y }% n1 z H+ z+ X
" l1 y( l! }; h
& Z5 g( o, C& x8 b9 p% J if (_changed) //如果发生了修改8 t6 W# t4 Z8 _
{% V* l5 t& z4 K$ j. f: F# E* {
_content = _doc.DocumentNode.WriteTo();" L$ ]: {% q5 b+ L
File.WriteAllText(requestMeta.OutputFilePath, _content);
6 H. S! N' U% x- h+ r& S& m. S//写回去.9 K/ Z* u1 K9 x) R$ K! ` _+ N
}7 |, Q$ k( [" \/ W6 `* v% y
2 ]4 D) T- p1 Z; S" Y) J: d0 S
_Result.ResultType = PluginResultType.Completed; //设置插件工作完成了.
9 f! R7 A/ f) Q0 o return _Result; //返回给SM继续处理 下一个.; C" E! i- w0 H$ } M$ p% K# i C
- | v2 D0 T# x+ a: z- @
}8 J* G: Q& |( T* P. b
catch{}, Z0 }' q' Y3 g) y
* @- ?) w' O7 E
return _Result; 搞定.
2 C8 j5 N( |/ j0 p% Y0 k |( o
6 [( b* }- W) n* J* _$ r2 R
- Q. u M# t' S3 C' l; Y* h
- J: ^3 U6 K. g8 ?, l0 w
2 E/ q! W4 g* L T. b- x! v
0 l) a+ w6 Q( |; W% A8 O0 A' g' t! T5 J4 D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|