http://www.codeproject.com/Articles/330142/Cookie-Quest-A-Quest-to-Read-Cookies-from-Four-Pop
我从上面的链接中实现了代码来读取 Firefox、Internet Explorer 和 chrome 的 cookie。Internet Explorer 和 chrome 的方法都有效。但是,sqlite 正在为 firefox 方法抛出一个连接,该连接conn.open()
显示“打开的文件不是数据库文件”。文件在那里,一切都在那里。
谁能告诉我为什么会发生这种情况?
以下是 Firefox 使用的引发异常的方法:
private static bool GetCookie_FireFox(string strHost, string strField, ref string Value)
{
Value = string.Empty;
bool fRtn = false;
string strPath, strTemp, strDb;
strTemp = string.Empty;
// Check to see if FireFox Installed
strPath = GetFireFoxCookiePath();
if (string.Empty == strPath) // Nope, perhaps another browser
return false;
try
{
// First copy the cookie jar so that we can read the cookies from unlocked copy while
// FireFox is running
strTemp = strPath + ".temp";
strDb = "Data Source=" + strTemp + ";pooling=false";
File.Copy(strPath, strTemp, true);
// Now open the temporary cookie jar and extract Value from the cookie if
// we find it.
using (SQLiteConnection conn = new SQLiteConnection(strDb))
{
using (SQLiteCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT value FROM moz_cookies WHERE host LIKE '%" +
strHost + "%' AND name LIKE '%" + strField + "%';";
conn.Open();
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Value = reader.GetString(0);
if (!Value.Equals(string.Empty))
{
fRtn = true;
break;
}
}
}
conn.Close();
}
}
}
catch (Exception)
{
Value = string.Empty;
fRtn = false;
}
// All done clean up
if (string.Empty != strTemp)
{
File.Delete(strTemp);
}
return fRtn;
}
private static string GetFireFoxCookiePath()
{
string s = Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData);
s += @"\Mozilla\Firefox\Profiles\";
try
{
DirectoryInfo di = new DirectoryInfo(s);
DirectoryInfo[] dir = di.GetDirectories("*.default");
if (dir.Length != 1)
return string.Empty;
s += dir[0].Name + @"\" + "cookies.sqlite";
}
catch (Exception)
{
return string.Empty;
}
if (!File.Exists(s))
return string.Empty;
return s;
}
以下是可用的 chrome 方法:
private static bool GetCookie_Chrome(string strHost, string strField, ref string Value)
{
Value = string.Empty;
bool fRtn = false;
string strPath, strDb;
// Check to see if Chrome Installed
strPath = GetChromeCookiePath();
if (string.Empty == strPath) // Nope, perhaps another browser
return false;
try
{
strDb = "Data Source=" + strPath + ";pooling=false";
using (SQLiteConnection conn = new SQLiteConnection(strDb))
{
using (SQLiteCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT value FROM cookies WHERE host_key LIKE '%" +
strHost + "%' AND name LIKE '%" + strField + "%';";
conn.Open();
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Value = reader.GetString(0);
if (!Value.Equals(string.Empty))
{
fRtn = true;
break;
}
}
}
conn.Close();
}
}
}
catch (Exception)
{
Value = string.Empty;
fRtn = false;
}
return fRtn;
}
private static string GetChromeCookiePath()
{
string s = Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData);
s += @"\Google\Chrome\User Data\Default\cookies";
if (!File.Exists(s))
return string.Empty;
return s;
}