Import java. util. regex .*;
Import java. SQL .*;
Import java.net. URLDecoder;
Import java. io .*;
Public class GetKeyword {
Public static void main (String [] arg ){
String referer = "http://search.yahoo.com/search;_ylt=A2oKi4fmukZQu1oAZ22bvZx4? P = % E4 % BD % A0 % E5 % A5 % BD % E5 % 95% 8A & toggle = 1 & cop = mss & ei = UTF-8 & fr = yfp-t-701 ";
If (arg. length! = 0 ){
Referer = arg [0];
}
GetKeyword getKeyword = new GetKeyword ();
String searchEngine = getKeyword. getSearchEngine (referer );
System. out. println ("searchEngine:" + searchEngine );
System. out. println ("keyword:" + getKeyword. getKeyword (referer ));
}
Public String getKeyword (String refererUrl ){
StringBuffer sb = new StringBuffer ();
If (refererUrl! = Null ){
Sb. append ("(google \. [a-zA-Z] +/. + [\\& |\?] Q = ([^ \ &] *) "). append (
"| Iask \. [a-zA-Z] +/. + [\\& |\?] K = ([^ \ &] *) "). append (
"| Iask \. [a-zA-Z] +/. + [\\& |\?] _ Searchkey = ([^ \ &] *) ")
. Append ("| sogou \. [a-zA-Z] +/. + [\\& |\?] Query = ([^ \ &] *) ")
. Append ("| 163 \. [a-zA-Z] +/. + [\\& |\?] Q = ([^ \ &] *) "). append (
"| Yahoo \. [a-zA-Z] +/. + [\\& | \\?] P = ([^ \ &] *) ")
. Append ("| baidu \. [a-zA-Z] +/. + [\\& |\?] Wd = ([^ \ &] *) ")
. Append ("| baidu \. [a-zA-Z] +/. + [\\& |\?] Word = ([^ \ &] *) ")
. Append ("| lycos \. [a-zA-Z] +/. * [\\& |\?] Query = ([^ \ &] *) ")
. Append ("| aol \. [a-zA-Z] +/. + [\\& |\?] Encquery = ([^ \ &] *) ")
. Append ("| 3721 \. [a-zA-Z] +/. + [\\& |\?] P = ([^ \ &] *) "). append (
"| 3721 \. [a-zA-Z] +/. + [\\& |\?] Name = ([^ \ &] *) ")
. Append ("| search \. [a-zA-Z] +/. + [\\& |\?] Q = ([^ \ &] *) ")
. Append ("| soso \. [a-zA-Z] +/. + [\\& |\?] W = ([^ \ &] *) "). append (
"| Zhongsou \. [a-zA-Z] +/. + [\\& |\?] W = ([^ \ &] *) ")
. Append ("| alexa \. [a-zA-Z] +/. + [\\& |\?] Q = ([^ \ &] *) ")
. Append (")");
Pattern p = Pattern. compile (sb. toString ());
Matcher m = p. matcher (refererUrl );
Return decoderKeyword (m, refererUrl );
}
Return null;
}
Public String decoderKeyword (Matcher m, String refererUrl ){
String keyword = null;
String encode = "UTF-8 ";
String searchEngine = getSearchEngine (refererUrl );
If (searchEngine! = Null ){
If (checkCode ("3721 | iask | sogou | 163 | baidu | soso | zhongsou ",
SearchEngine) | (checkCode ("yahoo", searchEngine )&&! CheckCode (
"Ei = UTF-8", refererUrl. toLowerCase ())))){
Encode = "GBK ";
}
If (m. find ()){
For (int I = 2; I <= m. groupCount (); I ++ ){
If (m. group (I )! = Null) // The keyword group is used here.
{
Try {
Keyword = URLDecoder. decode (m. group (I), encode );
} Catch (UnsupportedEncodingException e ){
System. out. println (e. getMessage ());
}
Break;
}
}
}
}
Return keyword;
}
Public String getSearchEngine (String refUrl ){
If (refUrl. length ()> 11 ){
// P is a regular expression that matches various search engines.
Pattern p = Pattern
. Compile ("http :\\/\\/. *\\. (google \\. com (: \ d {1,}) {0, 1} \/|"
+ "Google \\. cn (: \ d {1,}) {0, 1} \/| baidu \\. com (: \ d {1,}) {0, 1} \/|"
+ "Yahoo \\. com (: \ d {1,}) {0, 1} \/| iask \\. com (: \ d {1,}) {0, 1} \/|"
+ "Sogou \\. com (: \ d {1,}) {0, 1} \/| 163 \\. com (: \ d {1,}) {0, 1} \/|"
+ "Lycos \\. com (: \ d {1,}) {0, 1} \/| aol \\. com (: \ d {1,}) {0, 1} \/|"
+ "3721 \\. com (: \ d {1,}) {0, 1} \/| search \\. com (: \ d {1,}) {0, 1} \/|"
+ "Soso.com (: \ d {1,}) {0, 1} \/| zhongsou \\. com (: \ d {1,}) {0, 1} \/|"
+ "Alexa \. com (: \ d {1,}) {0, 1 }\\/)");
Matcher m = p. matcher (refUrl );
If (m. find ()){
Return insteadCode (
M. group (1 ),
"(\\. Com (: \ d {1,}) {0, 1} \/| \\. cn (: \ d {1,}) {0, 1} \/| \\. org (: \ d {1,}) {0, 1 }\\/)",
"");
}
}
Return "no search engine found ";
}
Public String insteadCode (String str, String regEx, String code ){
Pattern p = Pattern. compile (regEx );
Matcher m = p. matcher (str );
String s = m. replaceAll (code );
Return s;
}
Public boolean checkCode (String regEx, String str ){
Pattern p = Pattern. compile (regEx );
Matcher m = p. matcher (str );
Return m. find ();
}
}