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为conn.open()
上的firefox方法抛出一个连接,该连接显示“已打开的文件不是数据库文件”。文件就在那里和所有内容。
有人能告诉我为什么会这样吗?
以下是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;
}