2009-06-03 13 views
7

con C#, ho bisogno di ottenere tutti i segnalibri di Firefox per loro importazione nel nostro database. Come posso fare questo?Leggi segnalibri di Firefox utilizzando C#

Sono a conoscenza della domanda SO, Read FF 3 bookmarks in Java, ma le risposte sembrano girare intorno ai driver di database Java e non sono sicuro che alcune di quelle risposte non siano specifiche di Java.

La mia domanda principale è, "Come posso leggere i segnalibri di Firefox in C#?"

Domande secondarie: vedo \% profilo utente% \ dati applicazioni \ mozilla \ firefox \ profiles \ bookmarkbackup \ bookmarks- [data] .json files - posso solo analizzarlo? Se è così, ci sono dei parser esistenti per quello?

retorica domanda lamentarsi: Perché non può questo essere facile come IE, dove ho appena letto i file .url in \% profilo utente% \ preferiti? Bah.

+0

non è così facile come IE perché i segnalibri in Firefox sono più complicate di AIE ND perché Firefox deve essere cross-platform. Requisiti più complessi => codice più complesso. –

+3

IE li memorizza in formato di testo normale come file normali. Come mai non è cross-platform? –

+0

IE modo di fare le cose non è migliore di quello di FF per almeno una ragione. Un nome file non può contenere caratteri speciali come una barra (/). Per non parlare del fatto che FF supporta anche il tagging sui segnalibri. –

risposta

7

Utilizzare il driver SQLite per .Net e accedere al file places.sqlite può essere trovato alla
Application Data/Mozilla/Firefox/Profiles/$this_varies/places.sqlite
sul mio computer. Non dovrebbe essere difficile per te localizzarlo sui tuoi computer di destinazione.


Edit 1:
Ecco un elemento di cattura di codice che stampa gli URL dal database:

using System.Data.SQLite; // downloaded from http://sourceforge.net/projects/adodotnetsqlite 

namespace sqlite_test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var path_to_db = @"C:\places.sqlite"; // copied here to avoid long path 
      SQLiteConnection sqlite_connection = new SQLiteConnection("Data Source=" + path_to_db + ";Version=3;New=True;Compress=True;"); 

      SQLiteCommand sqlite_command = sqlite_connection.CreateCommand(); 

      sqlite_connection.Open(); 

      sqlite_command.CommandText = "select * from moz_places"; 

      SQLiteDataReader sqlite_datareader = sqlite_command.ExecuteReader(); 

      while (sqlite_datareader.Read()) 
      { 
       // Prints out the url field from the table: 
       System.Console.WriteLine(sqlite_datareader["url"]); 
      } 
     } 
    } 
} 

Edit 2:
Come punta. Devo davvero raccomandare il plugin SQLite Manager per firefox. È molto utile per lavorare con database SQLite.

+0

Grazie, ho contrassegnato questo come la risposta corretta. Sembra che i file di backup siano archiviati nel formato .json, ma solo per FF3 e versioni successive. Per chi legge questo, la linea di fondo è questa: -FF3 utilizza SQLLite per memorizzare i segnalibri. Usa i file .json per archiviare i backup dei segnalibri. -FF2 utilizza il file bookmarks.html per memorizzare i segnalibri. –

+1

Vale la pena ricordare che il vero sito web ufficiale per la lib di SQLite è http://sqlite.phxsoftware.com - un prodotto straordinario, così raffinato e di dominio pubblico! –

+1

FYI, il provider SQLite ADO.NET che hai citato non viene più gestito. Raccomando invece questo: http://sqlite.phxsoftware.com/. È molto completo e supporta persino Entity Framework. –

1

C'è un driver SQLite per .Net. Una volta capito, la soluzione sarebbe la stessa in entrambi .Net e Java.

+0

Che ne dici di analizzare solo i file di backup del segnalibro .json? Sarebbe più facile? –

+0

Inoltre, diciamo che io vado con autista SqlLite per NET, dove si trova il file di database SqlLite? –

+0

Dai un'occhiata a questo articolo del blog che spiega di più sui segnalibri FF e dove sono memorizzati: http://www.lytebyte.com/2008/06/19/understanding-how-and-where-firefox-3- i segnalibri sono salvati/ –

2

Sicuramente funziona come suggerito nella domanda Java, basta prendere il SQLite .NET provider e utilizzarlo per accedere al file del database FF.

+0

Che ne dici di analizzare solo i file di backup del segnalibro .json? Sarebbe più facile? –

1

ho dovuto rielaborare questo un po 'per il mio progetto http://www.codertakeout.com. Spero che questa revisione aiuti a chiarire alcune cose grazie ad alcuni suggerimenti da tutto il web.

using System.Data.SQLite; // need to install sqlite .net driver 

String path_to_db = @"C:\Documents and Settings\Jeff\Application Data\Mozilla\Firefox\Profiles\yhwx4xco.default\places.sqlite"; 
String path_to_temp = System.IO.Path.GetTempFileName(); 

System.IO.File.Copy(path_to_db, path_to_temp, true); 
SQLiteConnection sqlite_connection = new SQLiteConnection("Data Source=" + path_to_temp + ";Version=3;Compress=True;Read Only=True;"); 

SQLiteCommand sqlite_command = sqlite_connection.CreateCommand(); 

sqlite_connection.Open(); 

sqlite_command.CommandText = "SELECT moz_bookmarks.title,moz_places.url FROM moz_bookmarks LEFT JOIN moz_places WHERE moz_bookmarks.fk = moz_places.id AND moz_bookmarks.title != 'null' AND moz_places.url LIKE '%http%';"; 

SQLiteDataReader sqlite_datareader = sqlite_command.ExecuteReader(); 

while (sqlite_datareader.Read()) 
    { 
     System.Console.WriteLine(sqlite_datareader[1]); 
    } 
sqlite_connection.Close(); 
System.IO.File.Delete(path_to_temp); 
1

Visita http://myexps.blogspot.com per l'implementazione in java.

import java.sql.*; 

public class helloWorld { 
    public static void main(String[] args) throws Exception { 
     Class.forName("org.sqlite.JDBC"); 
     Connection conn = DriverManager.getConnection("jdbc:sqlite:/home/deepak/.mozilla/firefox/yvf7p20d.default/places.sqlite//"); 
    if(conn==null) 
    { 
    System.out.println("ERROR"); 
    } 
    System.out.println(conn.toString()); 

    Statement stat = conn.createStatement(); 

    ResultSet rs = stat.executeQuery("select * from moz_bookmarks;"); 
    while (rs.next()) { 
     System.out.println("id = " + rs.getString("id")); 
     System.out.println("keyword = " + rs.getString("keyword_id")); 
     System.out.println("title = " + rs.getString("title")); 
    } 
    rs.close(); 
    conn.close(); 
    } 
} 

Questo sarà l'implementazione Java