cp ~/.config/falkon/profiles/default/Cookies /tmp/falkon_cookies.sqlite
sqlite3 -separator $'\t' -noheader /tmp/falkon_cookies.sqlite "SELECT host_key,
 CASE WHEN host_key LIKE '.%' THEN 'TRUE' ELSE 'FALSE' END,
 path,
 CASE WHEN is_secure=1 THEN 'TRUE' ELSE 'FALSE' END,
 CAST((expires_utc/1000000.0 - 11644473600) AS INTEGER),
 name,
 value
FROM cookies;" > ~/cookies_netscape.txt
curl -v -L -b ~/cookies_netscape.txt -c ~/cookies_out.txt "https://inv.nadeko.net/" -o /tmp/forum.html && w3m /tmp/forum.html
curl -v -L -b ~/cookies_out.txt  "https://inv.nadeko.net/" -o /tmp/forum.html && w3m /tmp/forum.html

#### Ahora usamos las cookies para descargar videos o el instagram de una persona.

$ yt-dlp --cookies cookies_out.txt
$ gallery-dl --cookies ~/cookies_out.txt https://instagram.com/user
Para iniciarlo con startx (twm)

echo “exec twm” > .xinitrc

w3m no usa un formato de netscape si queres cargar las cookies de Falkon a netscape: (lo que está abajo no me funcionó).

Perfecto — gracias por la aclaración. Te doy una solución práctica (lista para ejecutar) que hace esto:

  1. localiza la base de datos de cookies de Falkon,
  2. extrae las cookies de la tabla SQLite (formato Chromium/QtWebEngine),
  3. las convierte al formato tipo w3m (una línea por cookie: URL NAME VALUE EXPIRY DOMAIN PATH HTTPONLY),
  4. y te deja el fichero listo para copiar a ~/.w3m/cookie.

También incluyo notas importantes (cookies cifradas, cerrar Falkon, cómo convertir la marca de tiempo).


1) Buscar el fichero de cookies de Falkon

En muchos navegadores basados en QtWebEngine/Chromium las cookies están en un fichero SQLite llamado Cookies o cookies. Busca así:

# busca en ~/.config y ~/.local por ficheros que se llamen "Cookies" o "cookies*"
find ~/.config ~/.local -type f \( -iname Cookies -o -iname 'cookies*' \) 2>/dev/null

Si aparece algo como ~/.config/falkon/Default/Cookies o ~/.local/share/falkon/Network/Cookies ese es el fichero que necesitamos.

Consejo: cierra Falkon antes de trabajar con la base de datos (está bloqueada mientras el navegador corre).


2) Script Python que extrae y convierte a formato w3m

Crea un archivo falkon_cookies_to_w3m.py con este contenido (usa Python 3):

#!/usr/bin/env python3
# falkon_cookies_to_w3m.py
#
# Extrae cookies desde una DB tipo Chromium (tabla `cookies`) y emite líneas:
# <url>\t<name>\t<value>\t<expiry_unix>\t<domain>\t<path>\t<httponly_flag>\n
#
# Uso:
#   python3 falkon_cookies_to_w3m.py /ruta/al/fichero/Cookies > cookies_w3m.txt

import sys, sqlite3, os, urllib.parse, datetime

if len(sys.argv) != 2:
    print("Uso: python3 falkon_cookies_to_w3m.py /ruta/al/fichero/Cookies", file=sys.stderr)
    sys.exit(2)

dbpath = sys.argv[1]
if not os.path.exists(dbpath):
    print("No existe:", dbpath, file=sys.stderr)
    sys.exit(3)

def webkit_to_unix(webkit_us):
    # Chrome/WebKit timestamps son microsegundos desde 1601-01-01
    try:
        us = int(webkit_us)
    except:
        return 0
    if us == 0:
        return 0
    return int(us/1_000_000 - 11644473600)

con = sqlite3.connect(dbpath)
con.text_factory = lambda b: b.decode(errors='ignore')
cur = con.cursor()

# Intenta columnas comunes en 'cookies' de Chromium: host_key, name, value, path, expires_utc, secure, httponly, encrypted_value
cols_try = ["host_key","name","value","path","expires_utc","secure","httponly","encrypted_value"]
# Query defensiva: selecciona sólo columnas que existan
cur.execute("PRAGMA table_info(cookies)")
tblinfo = [r[1] for r in cur.fetchall()]
present = [c for c in cols_try if c in tblinfo]

select_cols = ", ".join(present)
q = f"SELECT {select_cols} FROM cookies"
for row in cur.execute(q):
    # mapear por orden
    d = dict(zip(present, row))
    host = d.get("host_key","")
    name = d.get("name","")
    # si 'value' vacío, intentar 'encrypted_value' (no intentamos descifrar aquí)
    value = d.get("value") or d.get("encrypted_value") or ""
    path = d.get("path") or "/"
    expires = webkit_to_unix(d.get("expires_utc") or 0)
    secure = 1 if d.get("secure") else 0
    httponly = 1 if d.get("httponly") else 0

    # construir URL base (scheme asumido https si secure, sino http)
    scheme = "https" if secure else "http"
    # si host no empieza por dominio, limpiarlo
    host_clean = host.lstrip(".")
    url = f"{scheme}://{host_clean}{path}"
    # escape tabs/newlines en name/value
    safe_name = name.replace("\t","\\t").replace("\n","\\n")
    safe_value = value.replace("\t","\\t").replace("\n","\\n")

    print(f"{url}\t{safe_name}\t{safe_value}\t{expires}\t{host_clean}\t{path}\t{httponly}")

con.close()

Haz ejecutable y ejecútalo:

chmod +x falkon_cookies_to_w3m.py
./falkon_cookies_to_w3m.py /ruta/al/fichero/Cookies > cookies_w3m.txt

3) Resultado y prueba con w3m

El fichero cookies_w3m.txt tendrá líneas similares a tu ejemplo (pero con path y httponly al final). Para usarlo con w3m:

# copia al fichero que w3m usa (~/.w3m/cookie)
mkdir -p ~/.w3m
cp cookies_w3m.txt ~/.w3m/cookie
# prueba
w3m https://inv.nadeko.net

Si w3m usa exactamente la columna final como en tu ejemplo (5 0), y prefieres tener esos valores fijos, modifica el print(...) en el script para imprimir \t5\t0 en lugar de \t{path}\t{httponly}.


4) Notas importantes / problemas comunes

  • No abrir la DB con el navegador en ejecución. Copia el fichero Cookies antes de leerlo si no quieres cerrar Falkon:

    cp /ruta/al/Cookies /tmp/Cookies.copy
    ./falkon_cookies_to_w3m.py /tmp/Cookies.copy > cookies_w3m.txt
    
  • Valores en encrypted_value: algunos navegadores (Chromium en Linux/Windows) guardan el valor cifrado en encrypted_value y la columna value puede estar vacía. El script copia encrypted_value si value está vacío — pero no lo descifra. Descifrarlo requiere acceder a la clave de cifrado del sistema (DPAPI / Keyring) y código adicional (platform-specific). Si ves valores binarios / no legibles, probablemente estén cifrados.

  • Conversión de fecha: Chromium usa microsegundos desde 1601-01-01 (WebKit time). El script convierte expires_utc a UNIX epoch (segundos). Fuentes: explicación sobre expires_utc y conversión. (Stack Overflow)

  • Formato exacto de w3m: en tu ejemplo la última columna era 5 0. Hay ligeras variantes entre versiones/compilaciones; por eso el script emite path y httponly. Si w3m en tu sistema requiere exactamente dos números al final (ej. 5 0), dime y ajusto el print() para que produzca ese patrón fijo.


5) Si quieres, hago esto por vos ahora

Puedo:

  • darte la versión del script que forza el formato exactamente igual a tu ejemplo (con 5 0),
  • o modificarlo para intentar descifrar encrypted_value si usás Linux (requiere pycryptodomex y leer la clave de GNOME/ KDE keyring — puedo darte pasos).

¿Cuál preferís? ¿Que genere las líneas con 5 0 fijas (para que coincida exactamente con tu ejemplo), o que use path+httponly como en el script?


Cómo Extraer Cookies de Falkon y Postear en Foros 3DGames

Resumen

Este tutorial explica cómo extraer cookies del navegador Falkon (QtWebEngine) y usarlas con curl para interactuar con foros vBulletin como foros.3dgames.com.ar.


Paso 1: Cerrar Falkon

Antes de extraer las cookies, es importante cerrar el navegador para evitar problemas de concurrencia:

pkill -f falkon
sleep 2

Paso 2: Extraer Cookies de Falkon (SQLite)

Las cookies de Falkon se encuentran en formato SQLite:

~/.config/falkon/profiles/default/Cookies

Schema de la tabla cookies

CREATE TABLE cookies(
  creation_utc INTEGER NOT NULL,
  host_key TEXT NOT NULL,
  name TEXT NOT NULL,
  value TEXT NOT NULL,
  encrypted_value BLOB NOT NULL,
  path TEXT NOT NULL,
  expires_utc INTEGER NOT NULL,
  ...
);

Paso 3: Extraer Cookies y Convertir a Formato Netscape

El formato que funciona con curl es el formato Netscape (el mismo que usa yt-dlp).

Extraer cookies de 3dgames

sqlite3 ~/.config/falkon/profiles/default/Cookies \
  "SELECT host_key, name, value, path, expires_utc FROM cookies WHERE host_key LIKE '%3dgames%';" \
  | awk -F'|' 'BEGIN {print "# Netscape HTTP Cookie File"} {
    expires=int($5/1000000-11644473600); 
    if(expires<0) expires=0; 
    print $1"\tTRUE\t"$4"\tFALSE\t"expires"\t"$2"\t"$3
  }' > /tmp/3dgames_cookies.txt

Extraer TODAS las cookies (importante!)

El problema clave: solo extraer cookies de 3dgames NO funciona. Se necesitan TODAS las cookies porque vBulletinvalida la sesión mediante JavaScript y necesita cookies adicionales (probablemente de profiles.3dgames.com.ar o del dominio principal).

sqlite3 ~/.config/falkon/profiles/default/Cookies \
  "SELECT host_key, name, value, path, expires_utc FROM cookies;" \
  | awk -F'|' 'BEGIN {print "# Netscape HTTP Cookie File"} {
    expires=int($5/1000000-11644473600); 
    if(expires<0) expires=0; 
    print $1"\tTRUE\t"$4"\tFALSE\t"expires"\t"$2"\t"$3
  }' > /tmp/all_cookies.txt

Fórmula de conversión de expiry:

  • Chrome/Chromium usa microsegundos desde Unix (1601-01-01)
  • Unix timestamp = microsegundos / 1,000,000 - 11644473600

Paso 4: Verificar Sesión Iniciada

Antes de postear, verificar que la sesión está activa:

curl -sL "https://foros.3dgames.com.ar/" \
  -b /tmp/all_cookies.txt \
  -c /tmp/session.txt \
  | grep -oP "LOGGEDIN = \d+"

Debería mostrar LOGGEDIN = 919561 (o cualquier número != 0).

Si muestra LOGGEDIN = 0, las cookies no tienen la sesión válida.


Paso 5: Obtener Formulario de Respuesta

Obtener el token de seguridad y formulario

curl -sL "https://foros.3dgames.com.ar/newreply.php?do=newreply&t=1034102" \
  -b /tmp/all_cookies.txt \
  -c /tmp/session.txt

Buscar:

  • securitytoken - necesario para POST
  • action="newreply.php?do=postreply&t=ID" - URL del formulario

Extraer el securitytoken:

grep -oP 'name="securitytoken" value="[^"]*"' | grep -oP 'value="\K[^"]+'

Paso 6: Publicar Respuesta

Estructura del POST

curl -sL "https://foros.3dgames.com.ar/newreply.php?do=postreply&t=1034102" \
  -b /tmp/all_cookies.txt \
  -c /tmp/session.txt \
  -X POST \
  -d "do=postreply" \
  -d "t=1034102" \
  -d "securitytoken=TU_TOKEN_AQUI" \
  -d "message=TU MENSAJE AQUi" \
  -d "iconid=0"

Verificar publicación

curl -sL "https://foros.3dgames.com.ar/threads/1034102-programacion-ya-esta-saturado?goto=newpost" \
  -b /tmp/session.txt \
  | grep -i "tu mensaje"

Problemas Comunes y Soluciones

1. LOGGEDIN = 0 aunque las cookies existen

Causa: Solo se extrajeron cookies de 3dgames, faltando cookies de otros dominios.

Solución: Extraer TODAS las cookies, no solo las del dominio objetivo.

2. El formulario de respuesta redirige a login

Causa: La sesión no está validada correctamente o falta alguna cookie.

Solución:

  • Usar todas las cookies
  • Hacer una petición inicial a la página principal para establecer sesión
  • Usar -c para guardar las cookies actualizadas

3. Security token expirado

Causa: El token tiene vigencia limitada.

Solución: Obtener un nuevo token de la página de respuesta cada vez.

4. vBulletin usa JavaScript para validar sesión

Causa: El login se activa al hacer clic en “Responder”, no al cargar la página.

Solución:

  • La sesión se establece al hacer curl a newreply.php?do=newreply&t=ID
  • Luego de eso, las cookies actualizadas sirven para postear

Comandos Útiles

Verificar cookies extraídas

cat /tmp/all_cookies.txt | grep 3dgames

Ver tamaño de cookies

wc -l /tmp/all_cookies.txt

Proxies y headers adicionales (si es necesario)

curl -sL "https://foros.3dgames.com.ar/" \
  -b cookies.txt \
  -c cookies.txt \
  -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
  -H "Accept-Language: es-ES,es;q=0.9"

Notas

  • Las cookies de Falkon usan el schema de Chromium/Chrome
  • El formato Netscape es compatible con curl, wget, yt-dlp, etc.
  • La sesión de vBulletin se renueva automáticamente al interacturar con el sitio
  • El securitytoken cambia en cada request de respuesta