1
Joomla! 4.x / [RISOLTO] Come fare un import massivo di articoli da file
« il: 17 Apr 2024, 17:29:56 »
Salve a tutti.
Come dai post precedenti ho trovato come fare un caricamento massivo in moto automatico.
Con (grande) soddisfazione sono partito da circa 12.000 vecchi file DOC e sono ondati aonline in circa 4 ore!!!
Condivido il processo di conversione e caricamento qui di seguito nella speranza che possa essere utile a qualcuno.
# PREMESSA
Ho operato da una postazione Linux desktop (Linux Mint 21) ed ho impiegato i seguenti software:
Il caricamento è stato fatto attraverso le web API di Joomla e ho usaato il token di un utente come elemento di autenticazione.
NB: se si usa il dato user+password va attivato il plugin dentro Joomla: di default è disattivo!
Il processo per il caricamento automatico consta di 3 passi:
La conversione è fatta con uniconv che invoca, in background, Libreoffice.
Lo script rende automatico l'invocazione di "uniconv nomefile.doc".
Tutti i file si trovano tutti in una directory.
Codice dello script:
# 2 Trattamento degli HTML
Totti gli HTML ottenuti li ho spostati un una nuova directory.
Libreoffice produce un HTML completo, ma anche bruttino. Infatti cerca di mantenere le impostazioni del file da stampare.
Pertanto ho proceduto con:
Questo terzo script crea òe chiamate web API partendo dai file HTML. Per ogni file HTML viene creato un file .sh che contiene la chiamata.
Nota:
Per velocizzare l'upload in Joomla e per operare in sicurezza migliore ho proceduto esenguendio gli .sh da dentro il server (infatti puntano tutti su "http://localhost/"):
La seconda riga è un comando che esegue automaticamente tutti i file contenuti nella cartella articoli uno ad uno.
# Wegrafia
Joomla Core APIs, https://docs.joomla.org/J4.x:Joomla_Core_APIs#Get_Single_Article
Joomla 4 API Introduction – Manage Articles via Joomla API, https://www.joomdev.com/joomla-4-api-introduction/
Spero possa essere di aiuto a qualcuno.Un saluto a tutti
Come dai post precedenti ho trovato come fare un caricamento massivo in moto automatico.
Con (grande) soddisfazione sono partito da circa 12.000 vecchi file DOC e sono ondati aonline in circa 4 ore!!!
Condivido il processo di conversione e caricamento qui di seguito nella speranza che possa essere utile a qualcuno.
# PREMESSA
Ho operato da una postazione Linux desktop (Linux Mint 21) ed ho impiegato i seguenti software:
- Libreoffice
- unoconv
- sed
- find
- curl
- bash (per gli script di automazione).
Il caricamento è stato fatto attraverso le web API di Joomla e ho usaato il token di un utente come elemento di autenticazione.
NB: se si usa il dato user+password va attivato il plugin dentro Joomla: di default è disattivo!
Il processo per il caricamento automatico consta di 3 passi:
- conversione DOC -> HTML
- trattamento degli HTML
- caricamento degli file.
- per chi usa Windows o MAC basta usare i porting o software "equivalneti";
- script:
- in Windows possiamo usare i preistorici batch o, meglio, scipt PowerShell
- in mac sono supportati gli script shell
- il codice degli script riportato di seguito è esemplificativo per dare un traccia guida.
- in Joomla va carito un codice parziale non un codice //completo//. Es:
Codice: [Seleziona]
<h1>Titolo</h1>
<p>Testo</p>
<p>fine</p>
- il caricamento via web API bypassa il check del codice HTML, pertanto va //pulito// a mano;
- per le regole di parser bash nel metodo seguente:
- + gli apici ( " ) sono stati escappati in quanto devono restare per parte della sintassi HTML
- + gli apostrofi ( ' ) gli ho trasformati nella rappresentazione html in quanto parte del testo
- + non ho //filtrato// altri possibili caratteri o sequenze pericolosi: fate attenzione!
- infine l'HTML da sotoporre a Joomla via web API non deve avere ritorni a capo, ma essere una riga unica con la sequenza "\r\n" al posto del ritorno a capo.
La conversione è fatta con uniconv che invoca, in background, Libreoffice.
Lo script rende automatico l'invocazione di "uniconv nomefile.doc".
Tutti i file si trovano tutti in una directory.
Codice dello script:
Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_docx2html.sh {} \;
#
#
# VAR
VINP=$1
VPATH=
VFILE=$(basename -- "$VINP")
VNAME=
VEXTORG=
VEXTLOW=
#
# conversione
# echo "unoconv -d document -f html $VINP 2> /dev/null"
unoconv -d document -f html $VINP 2> /dev/null
# 2 Trattamento degli HTML
Totti gli HTML ottenuti li ho spostati un una nuova directory.
Libreoffice produce un HTML completo, ma anche bruttino. Infatti cerca di mantenere le impostazioni del file da stampare.
Pertanto ho proceduto con:
- rimozione dei tag inutili;
- escaping e sostituzione dei caratteri equivoci, pericolosi e dei ritorni a capo
- trasforma degli html in chiamate web API.
Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html0-removehtml.sh {} \;
#
# VAR
VINP=$1
#
# sostituzioni e cancellazioni HTML
sed -i "/<!DOCTYPE.*/d" $VINP
sed -i "/<html>/d" $VINP
sed -i "/<head>/d" $VINP
sed -i "/<meta\ /d" $VINP
sed -i "/<title>/d" $VINP
sed -i "/<style type=\"text\/css\">/d" $VINP
sed -i "/@page\ {/d" $VINP
sed -i "/p\ {\ color:/d" $VINP
sed -i "/p\.western\ {/d" $VINP
sed -i "/p\.cjk\ {/d" $VINP
sed -i "/p\.ctl\ {/d" $VINP
sed -i "/<\/style>/d" $VINP
sed -i "/<\/head>/d" $VINP
sed -i "s/<body\ .*/<p>/" $VINP
sed -i "s/<p\ class=\"western\"\ style=\"line-height:\ 100\%;\ margin-bottom:\ 0cm\">/<p>/" $VINP
sed -i "/<\/body>/d" $VINP
sed -i "/<\/html>/d" $VINP
sed -i "s/\ \ /\ \ /g" $VINP
sed -i "s/\t/\ /g" $VINP
Questo secondo script, invece, escape gli " e sosituisce i caratteri equivoci:Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html1-2html.sh {} \;
#
#
# VAR
VINP=$1
#
# - conversione ritorni a capo:
# - eliminazione ritorno a capo
# - codifica in "\r\n"
# -------------------------------------------
sed -i 's/\"/\\\"/g' $VINP
sed -ri "s/'/\'/g" $VINP
sed -zi 's/\n/\\r\\n/g' $VINP
Questo terzo script crea òe chiamate web API partendo dai file HTML. Per ogni file HTML viene creato un file .sh che contiene la chiamata.
Nota:
- il server del sito indicato è di fantasia ed anche il token (ovviamente)!!
- possiamo usare l'indirizzo pubblico del sito per caricare dal proprio PC al server: questa procedura è più lenta;
- possiamo usare l'indirizzo interno del server, ma in questo caso dobbiamo poter accedere al server e avere una console magari via ssh. Molto più veloce e sicuro.
Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html2-2api.sh {} \;
#
#
# VAR set STATIC
VAUTOR="Autore"
VCATID="14"
VARTINTRO="<hr id=\"system-readmore\" />"
#
# VAR GLOBAL
VINP=$1
VPATH=
VFILE=$(basename -- "$VINP")
VNAME=
VEXTORG=
VEXTLOW=
VCATEGORIA=
#
# popolamento variabili FILE
VPATH="$(dirname "${VINP}")"
VFILE="$(basename -- "${VINP}")"
VNAME="${VFILE%.*}"
VEXTORG="${VFILE##*.}"
VEXTLOW="${VEXTORG,,}"
VFILEOUT="${VPATH}/${VNAME}.sh"
#
# popolamento variabili per API
VTITLE="${VNAME^^}"
VALIAS="${VNAME,,}"
#
# NO SILENT mode: stampa solo un rapporto di upload ed errori
echo "curl --location --request POST 'http://localhost/api/index.php/v1/content/articles' \
--header 'Content-Type: application/json' \
--header 'X-Joomla-Token: c2hhMjU2EyMzhhNipiotrusyadflrtYjYxaAsdE 3YzFjZjQw' \
--data-raw '{
\"title\": \"$VTITLE\",
\"catid\": $VCATID,
\"created_by_alias\": \"$VAUTOR\",
\"language\": \"*\",
\"metadesc\": \"\",
\"metakey\": \"\",
\"state\": 1,
\"articletext\": \"$VARTINTRO<hr id=\\\"system-readmore\\\" />$(cat $VPATH/$VFILE)\"}'" > $VFILEOUT
chmod +x $VFILEOUT
Spiegazione delle variabili:- VTITLE: titolo dell'articolo
- VAUTOR: da popolare con il nome dell'autore che vogliamo compaia;
- VCATID: l'ID numeri della categoria in cui voglio inserire l'articolo;
- VARTINTRO: testo fisso iniziale dell'articolo
- "chmod +x $VFILEOUT": valido per linux e Mac rente il file di output .sh eseguibile.
Per velocizzare l'upload in Joomla e per operare in sicurezza migliore ho proceduto esenguendio gli .sh da dentro il server (infatti puntano tutti su "http://localhost/"):
- ho zippato tutti gli .sh
- ho fatto l'upload nel server
- mi sonbo collegato al server ed ho estratto lo zip in nella directory "articoli".
Codice: [Seleziona]
chmod +x articoli/*.sh
find articoli -type f -exec {} 2>&1 /dev/null \;
La prima riga è una ripetizione perchè i pacchetti zip fanno perdere alcune proprietà unix ai file.La seconda riga è un comando che esegue automaticamente tutti i file contenuti nella cartella articoli uno ad uno.
# Wegrafia
Joomla Core APIs, https://docs.joomla.org/J4.x:Joomla_Core_APIs#Get_Single_Article
Joomla 4 API Introduction – Manage Articles via Joomla API, https://www.joomdev.com/joomla-4-api-introduction/
Spero possa essere di aiuto a qualcuno.Un saluto a tutti