Discussion:
Firefox Cookie auslesen (sqlite3)
(zu alt für eine Antwort)
Robin Koch
2014-06-23 23:07:18 UTC
Permalink
Hallo,

ich bin neu in der Gruppe und habe keine FAQ zu ihr gefunden, daher
hoffe ich gegen keine lokalen Gepflogenheiten zu verstoßen. :-)

Mein Problem:

Ich möchte mit Python 2.7.6 den Wert eines bestimmten Cookies aus
Firefox (v30.0) auslesen.
Firefox speichert seine Cookies in der SQLite-Datei 'cookies.sqlite'.

Mein erster Ansatz war natürlich(?) Pythons sqlite3-Module zu benutzen:

---
import sqlite3

dblocation = r'd:\temp\sqlite\cookies.sqlite'
query = r"""SELECT value FROM moz_cookies
WHERE baseDomain LIKE 'website.com' AND name = 'userid'"""

db = sqlite3.connect(dblocation)
cur = db.cursor()

cur.execute(query)
---

Der execute-Aufruf führt leider zu folgendem Fehler:

---
DatabaseError: file is encrypted or is not a database
---

Internetrecherche auf zu diesem Problem hat mich nicht viel
weitergeführt. Entweder hieß es die Datei wäre durch Firefox gegen
Zugriff gesperrt oder die SQLite-Version wäre veraltet.

Nun, die Datei ist in Ordnung, es wird nicht darauf zugegriffen und mit
dem SQLite Manager aus Firefox sowie direkt mit dem
sqlite3-Kommandozeilentool kann ich problemlos darauf zugreifen.[1]

Die SQLite-Versionsnummer lauten:
sqlite.version_info = 2.6.0
sqlite3.sqlite_version_info = 3.6.21

Wie ich das genau updaten soll ohne irgendwas neu zu compilieren weiß
ich nicht. Allerdings scheint mir die Datenbank nicht besonders
ausgefallen. Ich weiß nicht, ob das wirklich schon ein Versionskonflikt
sein kann.

Zum Vergleich dennoch die Versionsnummern der anderen Tools:

sqlite3.exe: 3.8.5
SQLite Manager: SQLite 3.8.3.1

Sollten da wirklich solch dramatische Änderungen passiert sein, dass die
Abwärtskompatibilität leidet..?

[1] In der Tat löse ich das Problem im Moment durch

subprocess.check_output(["sqlite3.exe", dblocation, query])

Aber so richtig gut finde ich das nicht. %-)

Any thoughts?
--
Robin Koch
Stefan Schwarzer
2014-06-24 04:09:39 UTC
Permalink
Hi Robin,
Post by Robin Koch
ich bin neu in der Gruppe
herzlich willkommen! :-)
Post by Robin Koch
---
import sqlite3
dblocation = r'd:\temp\sqlite\cookies.sqlite'
query = r"""SELECT value FROM moz_cookies
WHERE baseDomain LIKE 'website.com' AND name = 'userid'"""
db = sqlite3.connect(dblocation)
cur = db.cursor()
cur.execute(query)
---
---
DatabaseError: file is encrypted or is not a database
---
Zuerst habe ich mich gewundert, dass der Fehler erst bei
`execute` auftritt. Ein Test mit einer Nicht-Datenbank führt
aber bei mir auch erst beim `execute` zur Exception.
Post by Robin Koch
Internetrecherche auf zu diesem Problem hat mich nicht viel
weitergeführt. Entweder hieß es die Datei wäre durch Firefox gegen
Zugriff gesperrt oder die SQLite-Version wäre veraltet.
Um das Problem einzugrenzen, könntest du eine Datenbank aus
dem Kommandozeilen-Client frisch anlegen und testen, ob du
`SELECT`s auf dieser Datenbank laufen lassen kannst. Wenn
das geht, liegt es schon mal sehr nahe, dass es etwas mit
der Firefox-Datenbank-Datei zu tun hat.

Ich kann meine `cookies.sqlite` (unter Fedora Linux)
problemlos öffnen und mit `SELECT` Werte auslesen. Dafür
habe ich die Datei in ein gesondertes Verzeichnis kopiert.
Post by Robin Koch
Nun, die Datei ist in Ordnung, es wird nicht darauf zugegriffen und mit
dem SQLite Manager aus Firefox sowie direkt mit dem
sqlite3-Kommandozeilentool kann ich problemlos darauf zugreifen.[1]
sqlite.version_info = 2.6.0
Ich nehme an, dass sollte `sqlite3.version_info` sein? Oder
wo kommt der Wert sonst her?
Post by Robin Koch
sqlite3.sqlite_version_info = 3.6.21
Zum Vergleich: Bei mir sind die Werte

sqlite3.version_info -> (2, 6, 0)
sqlite3.sqlite_version_info -> (3, 8, 3)
Post by Robin Koch
[1] In der Tat löse ich das Problem im Moment durch
subprocess.check_output(["sqlite3.exe", dblocation, query])
Das spricht ja auch stark dafür, dass es nicht mit der
Datenbank-Datei zu tun hat. Noch "sicherheitshalber" die
Frage: Handelt es sich bei den Zugriffen aus Python und über
die Kommandozeile um ein und dieselbe Datenbank-Datei
(gleiche Position im Dateisystem) oder könnte die von Python
aus genutzte Datei bei einem Kopiervorgang beschädigt worden
sein?

Viele Grüße
Stefan
Robin Koch
2014-06-24 15:37:02 UTC
Permalink
Post by Stefan Schwarzer
Post by Robin Koch
ich bin neu in der Gruppe
herzlich willkommen! :-)
Danke. :-)
Post by Stefan Schwarzer
Post by Robin Koch
---
import sqlite3
dblocation = r'd:\temp\sqlite\cookies.sqlite'
query = r"""SELECT value FROM moz_cookies
WHERE baseDomain LIKE 'website.com' AND name = 'userid'"""
db = sqlite3.connect(dblocation)
cur = db.cursor()
cur.execute(query)
---
---
DatabaseError: file is encrypted or is not a database
---
Um das Problem einzugrenzen, könntest du eine Datenbank aus
dem Kommandozeilen-Client frisch anlegen und testen, ob du
`SELECT`s auf dieser Datenbank laufen lassen kannst.
Gute Idee. Das funktioniert in der Tat problemlos.
Post by Stefan Schwarzer
Ich kann meine `cookies.sqlite` (unter Fedora Linux)
problemlos öffnen und mit `SELECT` Werte auslesen.
Unter Python oder mit dem CLI-Client?
Ich arbeite übrigens unter Windows 7, falls ich das noch nicht erwähnt
hatte.
Post by Stefan Schwarzer
Dafür habe ich die Datei in ein gesondertes Verzeichnis kopiert.
Ja, ich habe die cookie.sqlite für die Tests bei geschlossenem Firefox
in ein temporäres Verzeichnis kopiert.
Post by Stefan Schwarzer
Post by Robin Koch
sqlite.version_info = 2.6.0
Ich nehme an, dass sollte `sqlite3.version_info` sein? Oder
wo kommt der Wert sonst her?
Korrekt.
Post by Stefan Schwarzer
Post by Robin Koch
sqlite3.sqlite_version_info = 3.6.21
Zum Vergleich: Bei mir sind die Werte
sqlite3.version_info -> (2, 6, 0)
sqlite3.sqlite_version_info -> (3, 8, 3)
Aha. Das ist interessant.
Ich habe Python 2.7.6 vor einem Monat installiert.
Und 3.6.21 ist noch von 2009![1]

Ah, ich merke gerade, dass eine Woche später v2.7.7 veröffentlicht wurde
in dem scheinbar etwas in die Richtung getan wurde:

| Issue #20026: Fix the sqlite module to handle correctly invalid
| isolation level (wrong type).

Mal sehen, ob das was hilft.
Post by Stefan Schwarzer
Das spricht ja auch stark dafür, dass es nicht mit der
Datenbank-Datei zu tun hat. Noch "sicherheitshalber" die
Frage: Handelt es sich bei den Zugriffen aus Python und über
die Kommandozeile um ein und dieselbe Datenbank-Datei
(gleiche Position im Dateisystem) oder könnte die von Python
aus genutzte Datei bei einem Kopiervorgang beschädigt worden
sein?
Nein, es ist die selbe Datei.

Nebenbei: Ich habe gestern abend noch versucht das sqltie3-Module zu
aktualisieren, gemäß [2], aber das endete mit einem

| error: Unable to find vcvarsall.bat

:-(
Ich hoffe das 2.7.7 was hilft.

Danke auf jeden Fall schonmal für Deine Mühe!

[1] http://sqlite.org/changes.html#version_3_6_21
[2]
http://blog.rodolfocarvalho.net/2012/07/upgrade-sqlite-version-python-webfaction.html
--
Robin Koch
Robin Koch
2014-06-24 15:42:49 UTC
Permalink
Post by Robin Koch
Ah, ich merke gerade, dass eine Woche später v2.7.7 veröffentlicht wurde
| Issue #20026: Fix the sqlite module to handle correctly invalid
| isolation level (wrong type).
[...]
Post by Robin Koch
Ich hoffe das 2.7.7 was hilft.
Nope. Gleiches Problem. (Und gleiche SQLite3-Version.)
--
Robin Koch
Peter Otten
2014-06-24 20:17:22 UTC
Permalink
Post by Robin Koch
Post by Robin Koch
Ah, ich merke gerade, dass eine Woche später v2.7.7 veröffentlicht wurde
| Issue #20026: Fix the sqlite module to handle correctly invalid
| isolation level (wrong type).
[...]
Post by Robin Koch
Ich hoffe das 2.7.7 was hilft.
Nope. Gleiches Problem. (Und gleiche SQLite3-Version.)
Wie wär's denn mit Python 3.4?
Robin Koch
2014-06-27 09:17:18 UTC
Permalink
Post by Peter Otten
Post by Robin Koch
Post by Robin Koch
Ich hoffe das 2.7.7 was hilft.
Nope. Gleiches Problem. (Und gleiche SQLite3-Version.)
Wie wär's denn mit Python 3.4?
Mir wurde von mehreren Seiten empfohlen lieber mit 2.* zu arbeiten. Was
wäre z.B. in Unternehmen verbreiteter.
--
Robin Koch
Stefan Behnel
2014-06-27 11:07:12 UTC
Permalink
Post by Robin Koch
Post by Peter Otten
Post by Robin Koch
Post by Robin Koch
Ich hoffe das 2.7.7 was hilft.
Nope. Gleiches Problem. (Und gleiche SQLite3-Version.)
Wie wär's denn mit Python 3.4?
Mir wurde von mehreren Seiten empfohlen lieber mit 2.* zu arbeiten. Was
wäre z.B. in Unternehmen verbreiteter.
Hängt halt davon ab, wer deinen Code verwenden soll. Der Auftraggeber
bestimmt üblicherweise (oder darf es zumindest).

Ansonsten spricht einiges für Python 3 - unter anderem ja auch, dass es
dein Problem löst. :) Für neuen Code würde ich erstmal mit Py3 anfangen.
Zurück portieren geht dann immer noch, aber wenn's nicht nötig ist, sparst
du dir die Arbeit. Wenn du mit Py2 anfängst, wirst du irgendwann nach Py3
portieren wollen, und das ist tendenziell mehr Arbeit (und oft ganz
wesentlich mehr).

Stefan
Stefan Behnel
2014-06-27 10:59:07 UTC
Permalink
Post by Peter Otten
Post by Robin Koch
Post by Robin Koch
Ah, ich merke gerade, dass eine Woche später v2.7.7 veröffentlicht wurde
| Issue #20026: Fix the sqlite module to handle correctly invalid
| isolation level (wrong type).
[...]
Post by Robin Koch
Ich hoffe das 2.7.7 was hilft.
Nope. Gleiches Problem. (Und gleiche SQLite3-Version.)
Wie wär's denn mit Python 3.4?
Sieht so aus, als würde es das Problem unter Windows und MacOS-X lösen:

http://bugs.python.org/issue20465

Die mitinstallierte SQLite-Version sollte dort jetzt 3.8.3.1 sein.

Unter Linux gibt es das Problem so nicht, da üblicherweise die
Systembibliothek verwendet wird.

Stefan
Robin Koch
2014-06-27 13:29:22 UTC
Permalink
Post by Peter Otten
Wie wär's denn mit Python 3.4?
Jepp. Das Script läuft jetzt.
Leider scheint PyScripter damit wiederum nicht (mehr) kompatibel zu
sein. :-/ Offenbar ist die letzte Version von 2012. Wieso es Python
3.4.1 nicht erkennt erschließt sich mir deswegen nicht, aber das habe
ich bei sqlite3 ja uch schon nicht eingesehen. ;-)

Gibt es eine ähnlich "leichte" IDE (die Installationsdatei von
PyScripter ist keine 5MB groß) die dennoch signifikant mehr ist als ein
Editor?

Auto-Vervollständigung finde ich gerade als Einsteiger immer sehr
praktisch, Dokumentationen anzeigen und Definitionen anspringen ebenso.

Debugging konnte PyScripter auch, das wäre nicht schlecht. Refactoring
wäre ein netter Zusatz.

Ich habe hier noch die Installationsdatei für PyCharm, aber das sind
120 MB, das klingt schon schwergewichtiger. Und PyDev für Eclipse will
ich vielleicht auch noch mal ausprobieren. Aber das ist natürlich (mit
300 MB Speicherbelastung) auch schon keine Kleinigkeit.

Das entspricht irgendwie nicht ganz meiner Vorstellung von einer
Skriptsprache. :-)

Aber *nur* Syntax-Highlightning aus Notepad++ muss es dann ja auch nicht
sein.
--
Robin Koch
Christopher Arndt
2014-06-27 13:55:25 UTC
Permalink
Post by Robin Koch
Gibt es eine ähnlich "leichte" IDE (die Installationsdatei von
PyScripter ist keine 5MB groß) die dennoch signifikant mehr ist als ein
Editor?
Wie wäre es mit Geany? Der Windows-Installer enthält die benötigte
GTK-Runtime ist damit aber auch "nur" gut 8 MB groß.

http://www.geany.org/Download/Releases


Chris
Stefan Behnel
2014-06-27 15:46:39 UTC
Permalink
Ich habe hier noch die Installationsdatei für PyCharm, aber das sind >120
MB, das klingt schon schwergewichtiger.
Aber die 120MB sind es auch wert (Java halt...). Jedenfalls die beste
Python-IDE, die ich bisher verwendet habe.

Stefan
Robin Koch
2014-06-30 12:42:57 UTC
Permalink
Post by Stefan Behnel
Ich habe hier noch die Installationsdatei für PyCharm, aber das sind >120
MB, das klingt schon schwergewichtiger.
Aber die 120MB sind es auch wert (Java halt...). Jedenfalls die beste
Python-IDE, die ich bisher verwendet habe.
Ok, nach Geany, das mir nicht so wirklich gefallen hat und PyDev, dass
ja auch einen ganz schönen Overhead erzeugt, habe ich PyCharm jetzt mal
ausprobiert und bin auch einigermaßen angetan.

Eine IDE mit allem drum und dran.
(Das Refactoring bezieht sogar Dateinamen in Strings mit ein.)

Die Pythonversionen muss man zwar einmal halbautomatisch auswählen, aber
dann beliebig wechseln.
Und es gibt (für jede Pythoninstallation seperat) eine Modul-Verwaltung!
Etwas rudimentär, aber besser als alles, was ich bisher gewehen habe.
Man sieht was installiert wurde und kann auch ohne Browser nach Modulen
suchen.

Ist zwar auch relativ speicherhungrig (200-300 MB), aber auf dem neuen
Rechner ist das zum Glück nicht so das technische Problem. (Auf dem
Netbook würde ich ich dann wahrscheinlich doch was schlankeres bevorzugen.)

Immerhin kann man Skripte bearbeiten ohne, dass diese einem Projekt
zugeordnet sind. Leider kann man nicht komplett ohne angelegtes Projekt
arbeiten. Aber vielleicht zwingt mich das ja ein bisschen zur Ordnung ;-)

Nur das Ausführen des *offenen* Skripts ist etwas "umständlich".
Das geht offenbar nur mit per Tastenkombination oder über das
Kontextmenü. Der Button in der Toolbar startet immer das zuletzt
gestartete Skript. Das entbehrt ja auch nicht einer gewissen Logik, aber
es hat mich vor gewisse Probleme gestellt, als ich zum *ersten* Mal ein
Skript starten wollte und die History halt noch leer war. %-)

Danke für eure Antworten!
--
Robin Koch
Robin Koch
2014-06-30 13:54:14 UTC
Permalink
Post by Robin Koch
Immerhin kann man Skripte bearbeiten ohne, dass diese einem Projekt
zugeordnet sind. Leider kann man nicht komplett ohne angelegtes Projekt
arbeiten. Aber vielleicht zwingt mich das ja ein bisschen zur Ordnung ;-)
Oh, man kann auch nur *ein* Projekt pro Fenster offenhaben? Also ähnlich
wie die Workspaces in Eclipse.
Ok, daran muss ich mich gewöhnen.

Wird wohl dann auf ein großes "Projekt" namens "Skripte" oder so
hinauslaufen. ;-)
--
Robin Koch
Wolfgang Keller
2014-07-01 10:20:39 UTC
Permalink
Post by Robin Koch
Gibt es eine ähnlich "leichte" IDE (die Installationsdatei von
PyScripter ist keine 5MB groß) die dennoch signifikant mehr ist als
ein Editor?
Wingware 101 ist zwar im zweistelligen MB-Bereich, aber trotzdem immer
noch eine ganze Größenordnung leichter als PyCharm oder PyDev.

MfG,

Wolfgang
David Krause
2014-07-01 15:21:49 UTC
Permalink
Hallo Folks, hi Robin,


Ich habe alle genannten IDEs/Editoren durch und bin bei Sublime Text 2
hängen geblieben.
Ich war schon viel gewohnt aber dieses Ding hat so viele interessante
Ansätze:
(
* Volle Tastatur Bedienung,
* mehrere Cursor
* in Python gebaut
* Packetverwaltung ( https://sublime.wbond.net/ )
* jedi python completion (die zweitbeste intelli sense die ich
kenne, pycharme und damals noch komodo waren imho ein bisschen besser)
* plugin emmet html Zauberei... ganze html seite erstellen mit:
html>(head+body>(.blub+.blub2 )) + tab
https://sublime.wbond.net/packages/Emmet
* eigene completion snippets erstellen. (ganze Sprach Konstrukte per
Tab Completion einfügbar)
* jeden Tag was anderes neues entdecken...
)

Da macht das Arbeiten echt Spaß :)



Mit freundlichen Grüßen / With best regards / Met vriendelijke groet

David Krause
Markus Zapke-Gründemann
2014-07-01 15:36:36 UTC
Permalink
Post by David Krause
Ich habe alle genannten IDEs/Editoren durch und bin bei Sublime Text 2
hängen geblieben.
Ich war schon viel gewohnt aber dieses Ding hat so viele interessante
(
* Volle Tastatur Bedienung,
* mehrere Cursor
* in Python gebaut
AFAIK ist Sublime Text 2 in C++ geschrieben. Aber es hat eine Plugin-API, die
Post by David Krause
Sublime Text has a powerful, Python based plugin API. Along with the API,
it comes with a built in Python console to interactively experiment in
real time.
Ansonsten stimme ich dir zu: Sublime Text 2/3 ist ein toller Editor!


Viele Grüße

Markus

Stefan Schwarzer
2014-06-24 04:09:39 UTC
Permalink
Hi Robin,
Post by Robin Koch
ich bin neu in der Gruppe
herzlich willkommen! :-)
Post by Robin Koch
---
import sqlite3
dblocation = r'd:\temp\sqlite\cookies.sqlite'
query = r"""SELECT value FROM moz_cookies
WHERE baseDomain LIKE 'website.com' AND name = 'userid'"""
db = sqlite3.connect(dblocation)
cur = db.cursor()
cur.execute(query)
---
---
DatabaseError: file is encrypted or is not a database
---
Zuerst habe ich mich gewundert, dass der Fehler erst bei
`execute` auftritt. Ein Test mit einer Nicht-Datenbank führt
aber bei mir auch erst beim `execute` zur Exception.
Post by Robin Koch
Internetrecherche auf zu diesem Problem hat mich nicht viel
weitergeführt. Entweder hieß es die Datei wäre durch Firefox gegen
Zugriff gesperrt oder die SQLite-Version wäre veraltet.
Um das Problem einzugrenzen, könntest du eine Datenbank aus
dem Kommandozeilen-Client frisch anlegen und testen, ob du
`SELECT`s auf dieser Datenbank laufen lassen kannst. Wenn
das geht, liegt es schon mal sehr nahe, dass es etwas mit
der Firefox-Datenbank-Datei zu tun hat.

Ich kann meine `cookies.sqlite` (unter Fedora Linux)
problemlos öffnen und mit `SELECT` Werte auslesen. Dafür
habe ich die Datei in ein gesondertes Verzeichnis kopiert.
Post by Robin Koch
Nun, die Datei ist in Ordnung, es wird nicht darauf zugegriffen und mit
dem SQLite Manager aus Firefox sowie direkt mit dem
sqlite3-Kommandozeilentool kann ich problemlos darauf zugreifen.[1]
sqlite.version_info = 2.6.0
Ich nehme an, dass sollte `sqlite3.version_info` sein? Oder
wo kommt der Wert sonst her?
Post by Robin Koch
sqlite3.sqlite_version_info = 3.6.21
Zum Vergleich: Bei mir sind die Werte

sqlite3.version_info -> (2, 6, 0)
sqlite3.sqlite_version_info -> (3, 8, 3)
Post by Robin Koch
[1] In der Tat löse ich das Problem im Moment durch
subprocess.check_output(["sqlite3.exe", dblocation, query])
Das spricht ja auch stark dafür, dass es nicht mit der
Datenbank-Datei zu tun hat. Noch "sicherheitshalber" die
Frage: Handelt es sich bei den Zugriffen aus Python und über
die Kommandozeile um ein und dieselbe Datenbank-Datei
(gleiche Position im Dateisystem) oder könnte die von Python
aus genutzte Datei bei einem Kopiervorgang beschädigt worden
sein?

Viele Grüße
Stefan
Loading...