OSDN Git Service

default cookie処理クラス
[coroid/inqubus.git] / frontend / src / saccubus / net / BrowserInfo.java
1 /**
2  * Inspired from Nicorank by rankingloid 2008 - 2009
3  */
4 package saccubus.net;
5
6 import java.util.Arrays;
7
8 /**
9 /**
10  * <p>
11  * タイトル: さきゅばす
12  * </p>
13  *
14  * <p>
15  * 説明: ニコニコ動画の動画をコメントつきで保存
16  * </p>
17  *
18  * @version 1.22r3e
19  * @author orz
20  *
21  */
22 public class BrowserInfo {
23
24     public enum BrowserCookieKind {
25
26         NONE, MSIE, IE6, Firefox3, Firefox, Chrome,
27         Opera, Chromium, Other,}
28     private BrowserCookieKind validBrowser;
29
30     public String getBrowserName() {
31         if (validBrowser == BrowserCookieKind.NONE) {
32             return "さきゅばす";
33         } else if (validBrowser == BrowserCookieKind.MSIE) {
34             return "Internet Exploror";
35         } else {
36             return validBrowser.toString();
37         }
38     }
39
40     public BrowserInfo() {
41         validBrowser = BrowserCookieKind.NONE;
42     }
43     private static final String NICOVIDEO_URL = "http://www.nicovideo.jp";
44
45     /**
46      *
47      * @param browserKind
48      * @return
49      */
50     public String getUserSession(BrowserCookieKind browserKind) {
51         String user_session = "";
52         switch (browserKind) {
53             case IE6:
54                 user_session = GetUserSessionFromIE6(NICOVIDEO_URL);
55                 break;
56             case Chromium:
57                 user_session = GetUserSesionChromium();
58                 break;
59             case Opera:
60                 user_session = GetUserSessionOpera();
61                 break;
62         }
63         if (!user_session.isEmpty()) {
64             validBrowser = browserKind;
65         }
66         return user_session;
67     }
68
69     /// <summary>
70     /// IE6 から user_session を取得
71     /// </summary>
72     /// <param name="url">サイト(ニコニコ動画)のURL</param>
73     /// <returns>user_session</returns>
74     private String GetUserSessionFromIE6(String url) {
75         return CutUserSession(GetCookieFromIE6(url), "");
76     }
77
78     /// <summary>
79     /// IE6 からクッキーを取得
80     /// </summary>
81     /// <param name="url">取得するクッキーに関連づけられたURL</param>
82     /// <returns>クッキー文字列</returns>
83     private String GetCookieFromIE6(String url) {
84         int size = 4096;
85         byte[] dummy = new byte[size];
86         Arrays.fill(dummy, (byte) ' ');
87         StringBuilder buff = new StringBuilder(new String(dummy));
88         int[] ref_size = new int[1];
89         ref_size[0] = size;
90         //InternetGetCookie(url, null, buff, /*ref*/ ref_size);
91         return buff.toString().replace(';', ',');
92     }
93     /*
94      *  [DllImport("wininet.dll")]
95      *  private extern static bool InternetGetCookie(string url, string name, StringBuilder data, ref uint size);
96      *
97      *  shuold use NLink.win32
98      */
99
100
101     /** <p>
102      *  Chromium から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
103      *  </p>
104      *  @return user_session
105      */
106     private String GetUserSesionChromium() {
107         String user_session = "";
108         String cookie_file = "";
109         String chromium = "\\Chromium\\User Data\\Default\\Cookies";
110         try {
111             String local_Appdir = System.getenv("LOCALAPPDATA");
112             if (local_Appdir != null && !local_Appdir.isEmpty()) {
113                 // Win7 32bit
114                 cookie_file = local_Appdir + chromium;
115                 if (Path.isFile(cookie_file)) {
116                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
117                     user_session = CutUserSession(dataStr, cookie_file);
118                     return user_session;
119                 }
120             }
121             String profile_dir = System.getenv("USERPROFILE");
122             if (profile_dir != null && !profile_dir.isEmpty()) {
123                 // XP 32bit
124                 cookie_file = profile_dir
125                         + "\\Local Settings\\Application Data" + chromium;
126                 if (Path.isFile(cookie_file)) {
127                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
128                     user_session = CutUserSession(dataStr, cookie_file);
129                     return user_session;
130                 }
131             }
132             return user_session;
133         } catch (Exception e) {
134             e.printStackTrace();
135             return user_session;
136         }
137     }
138
139     /** <p>
140      *  Opera から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
141      *  </p>
142      *  @return user_session
143      */
144     private String GetUserSessionOpera() {
145         String user_session = "";
146         String cookie_file = "";
147         try {
148             String app_dir = System.getenv("APPDATA");
149             if (app_dir != null && !app_dir.isEmpty()) {
150                 // Win7/XP 32bit
151                 cookie_file = app_dir + "\\Opera\\Opera\\cookies4.dat";
152                 if (Path.isFile(cookie_file)) {
153                     String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
154                     user_session = CutUserSession(dataStr, cookie_file);
155                     return user_session;
156                 }
157             }
158             return "";
159         } catch (Exception e) {
160             e.printStackTrace();
161             return "";
162         }
163     }
164
165     /// <summary>
166     /// 文字列から user_session_ で始まる文字列を切り出して返す。数字とアンダーバー以外の文字で切れる。
167     /// </summary>
168     /// <param name="str">切り出す対象文字列</param>
169     /// <returns>user_session 文字列。見つからなければ空文字を返す</returns>
170     private String CutUserSession(String str, String filename) {
171         String ret = "";
172         int start = str.indexOf("user_session_");
173         if (start >= 0) {
174             int index = start + "user_session_".length();
175             while (index < str.length() && ('0' <= str.charAt(index) && str.charAt(index) <= '9'
176                     || str.charAt(index) == '_')) {
177                 ++index;
178             }
179             ret = str.substring(start, index);
180             // C# の string.SubString( , ) と Java の String.substring( , ) は違うので注意!
181             if (!ret.isEmpty() && !filename.isEmpty()) {
182                 System.out.println("Cookie found: " + filename);
183                 return ret;
184             }
185         }
186         return "";
187     }
188 }