2 * Inspired from Nicorank by rankingloid 2008 - 2009
6 import java.util.Arrays;
15 * 説明: ニコニコ動画の動画をコメントつきで保存
22 public class BrowserInfo {
24 public enum BrowserCookieKind {
26 NONE, MSIE, IE6, Firefox3, Firefox, Chrome,
27 Opera, Chromium, Other,}
28 private BrowserCookieKind validBrowser;
30 public String getBrowserName() {
31 if (validBrowser == BrowserCookieKind.NONE) {
33 } else if (validBrowser == BrowserCookieKind.MSIE) {
34 return "Internet Exploror";
36 return validBrowser.toString();
40 public BrowserInfo() {
41 validBrowser = BrowserCookieKind.NONE;
43 private static final String NICOVIDEO_URL = "http://www.nicovideo.jp";
50 public String getUserSession(BrowserCookieKind browserKind) {
51 String user_session = "";
52 switch (browserKind) {
54 user_session = GetUserSessionFromIE6(NICOVIDEO_URL);
57 user_session = GetUserSessionFromMSIE();
60 user_session = GetUserSessionFromFilefox4();
61 if (!user_session.isEmpty()) {
65 user_session = GetUserSessionFromFilefox3();
68 user_session = GetUserSesionChrome();
71 user_session = GetUserSesionChromium();
74 user_session = GetUserSessionOpera();
77 if (!user_session.isEmpty()) {
78 validBrowser = browserKind;
85 * @param fileOrDir fullname of file or directory
88 public String getUserSessionOther(String fileOrDir) {
89 String user_session = "";
91 if (Path.isDirectory(fileOrDir)) {
92 // Directory Type like MSIE
93 user_session = GetUserSessionFromDirectory(fileOrDir);
96 if (Path.isFile(fileOrDir)) {
97 // File Type like Firefox3
98 String dataStr = Path.ReadAllText(fileOrDir, "UTF-8");
99 user_session = CutUserSession(dataStr, fileOrDir);
103 } catch (Exception e) {
107 if (!user_session.isEmpty()) {
108 validBrowser = BrowserCookieKind.Other;
114 /// Firefox3 から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
116 /// <returns>user_session</returns>
117 private String GetUserSessionFromFilefox3() {
118 String user_session = "";
120 String app_dir = System.getenv("APPDATA");
121 if (app_dir == null || app_dir.isEmpty()) {
124 String sqlist_filename = app_dir + "\\Mozilla\\Firefox\\Profiles\\cookies.sqlite";
125 if (!Path.isFile(sqlist_filename)) {
128 String dataStr = Path.ReadAllText(sqlist_filename, "US-ASCII");
129 user_session = CutUserSession(dataStr, sqlist_filename);
131 } catch (Exception e) {
138 /// Firefox4, 5 から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
140 /// <returns>user_session</returns>
141 private String GetUserSessionFromFilefox4() {
142 String user_session = "";
144 String app_dir = System.getenv("APPDATA");
145 if (app_dir == null || app_dir.isEmpty()) {
148 String[] userLists = Path.GetFiles(app_dir + "\\Mozilla\\Firefox\\Profiles\\");
149 for (String user_dir : userLists) {
150 String sqlist_filename = user_dir + "\\cookies.sqlite";
151 if (Path.isFile(sqlist_filename)) {
152 String dataStr = Path.ReadAllText(sqlist_filename, "US-ASCII");
153 user_session = CutUserSession(dataStr, sqlist_filename);
154 if (!user_session.isEmpty()) {
160 return ""; // not found
161 } catch (Exception e) {
168 /// IE6 から user_session を取得
170 /// <param name="url">サイト(ニコニコ動画)のURL</param>
171 /// <returns>user_session</returns>
172 private String GetUserSessionFromIE6(String url) {
173 return CutUserSession(GetCookieFromIE6(url), "");
179 /// <param name="url">取得するクッキーに関連づけられたURL</param>
180 /// <returns>クッキー文字列</returns>
181 private String GetCookieFromIE6(String url) {
183 byte[] dummy = new byte[size];
184 Arrays.fill(dummy, (byte) ' ');
185 StringBuilder buff = new StringBuilder(new String(dummy));
186 int[] ref_size = new int[1];
188 //InternetGetCookie(url, null, buff, /*ref*/ ref_size);
189 return buff.toString().replace(';', ',');
192 * [DllImport("wininet.dll")]
193 * private extern static bool InternetGetCookie(string url, string name, StringBuilder data, ref uint size);
195 * shuold use NLink.win32
199 * IE7/IE8/IE9 から user_session を取得。<br/>
200 * エラーが起こった場合、例外を投げずに空文字を返す
202 * @return user_session
204 private String GetUserSessionFromMSIE() {
205 String user_session = "";
207 String profile_dir = System.getenv("USERPROFILE");
208 if (profile_dir == null || profile_dir.isEmpty()) {
211 String search_dir = profile_dir + "\\AppData\\Roaming\\Microsoft\\Windows\\Cookies\\Low\\";
212 user_session = GetUserSessionFromDirectory(search_dir);
213 if (user_session.isEmpty()) {
214 search_dir = profile_dir + "\\AppData\\Roaming\\Microsoft\\Windows\\Cookies\\";
215 user_session = GetUserSessionFromDirectory(search_dir);
217 if (user_session.isEmpty()) {
218 search_dir = profile_dir + "\\Cookies\\";
219 user_session = GetUserSessionFromDirectory(search_dir);
225 * dir_name ディレクトリから MSIE のクッキーを見つけて user_session を返す
229 private String GetUserSessionFromDirectory(String dir_name) {
230 String user_session = "";
232 if (Path.isDirectory(dir_name)) {
233 String[] files = Path.GetFiles(dir_name);
234 for (String fullname : files) {
235 user_session = CutUserSession(Path.ReadAllText(fullname, "MS932"), fullname);
236 if (!user_session.isEmpty()) {
240 /* obsolate after WindowsUpdate Aug 2011
241 String name = Path.GetFileName(fullname);
242 if (name.indexOf("nicovideo") >= 0 && name.indexOf("www") < 0)
244 user_session = CutUserSession(Path.ReadAllText(fullname, "MS932"), "");
245 if (!user_session.isEmpty()){
246 System.out.println("Found cookie in " + fullname.replace("\\", "/"));
254 } catch (Exception e) {
261 * Chrome から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
263 * @return user_session
265 private String GetUserSesionChrome() {
266 String user_session = "";
267 String cookie_file = "";
268 String googleChrome = "\\Google\\Chrome\\User Data\\Default\\Cookies";
270 String local_Appdir = System.getenv("LOCALAPPDATA");
271 if (local_Appdir != null && !local_Appdir.isEmpty()) {
273 cookie_file = local_Appdir + googleChrome;
274 if (Path.isFile(cookie_file)) {
275 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
276 user_session = CutUserSession(dataStr, cookie_file);
277 if (!user_session.isEmpty()) {
282 String profile_dir = System.getenv("USERPROFILE");
283 if (profile_dir != null && !profile_dir.isEmpty()) {
285 cookie_file = profile_dir
286 + "\\Local Settings\\Application Data" + googleChrome;
287 if (Path.isFile(cookie_file)) {
288 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
289 user_session = CutUserSession(dataStr, cookie_file);
293 String app_dir = System.getenv("APPDATA");
294 if (app_dir != null && !app_dir.isEmpty()) {
296 cookie_file = app_dir + googleChrome;
297 if (Path.isFile(cookie_file)) {
298 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
299 user_session = CutUserSession(dataStr, cookie_file);
304 } catch (Exception e) {
311 * Chromium から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
313 * @return user_session
315 private String GetUserSesionChromium() {
316 String user_session = "";
317 String cookie_file = "";
318 String chromium = "\\Chromium\\User Data\\Default\\Cookies";
320 String local_Appdir = System.getenv("LOCALAPPDATA");
321 if (local_Appdir != null && !local_Appdir.isEmpty()) {
323 cookie_file = local_Appdir + chromium;
324 if (Path.isFile(cookie_file)) {
325 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
326 user_session = CutUserSession(dataStr, cookie_file);
330 String profile_dir = System.getenv("USERPROFILE");
331 if (profile_dir != null && !profile_dir.isEmpty()) {
333 cookie_file = profile_dir
334 + "\\Local Settings\\Application Data" + chromium;
335 if (Path.isFile(cookie_file)) {
336 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
337 user_session = CutUserSession(dataStr, cookie_file);
342 } catch (Exception e) {
349 * Opera から user_session を取得。エラーが起こった場合、例外を投げずに空文字を返す
351 * @return user_session
353 private String GetUserSessionOpera() {
354 String user_session = "";
355 String cookie_file = "";
357 String app_dir = System.getenv("APPDATA");
358 if (app_dir != null && !app_dir.isEmpty()) {
360 cookie_file = app_dir + "\\Opera\\Opera\\cookies4.dat";
361 if (Path.isFile(cookie_file)) {
362 String dataStr = Path.ReadAllText(cookie_file, "UTF-8");
363 user_session = CutUserSession(dataStr, cookie_file);
368 } catch (Exception e) {
375 /// 文字列から user_session_ で始まる文字列を切り出して返す。数字とアンダーバー以外の文字で切れる。
377 /// <param name="str">切り出す対象文字列</param>
378 /// <returns>user_session 文字列。見つからなければ空文字を返す</returns>
379 private String CutUserSession(String str, String filename) {
381 int start = str.indexOf("user_session_");
383 int index = start + "user_session_".length();
384 while (index < str.length() && ('0' <= str.charAt(index) && str.charAt(index) <= '9'
385 || str.charAt(index) == '_')) {
388 ret = str.substring(start, index);
389 // C# の string.SubString( , ) と Java の String.substring( , ) は違うので注意!
390 if (!ret.isEmpty() && !filename.isEmpty()) {
391 System.out.println("Cookie found: " + filename);