Newsgroup: it.comp.os.linux.iniziare
Titolo: Homepage cancale youtube con wget o curl

Vorrei scaricare il contenuto della home di un canale youtube in modo
non interattivo, qualcosa del tipo:
 
canaleyoutube.sh 
https://www.youtube.com/@examplechannel
 
 
L'obiettivo in realtà sarebbe ricavarne la stringa del channel_id, per
cui l'idea sarebbe che in outout mi saltasse fuori la seguente stringa:
 
UC8picqZkFo_Pr5PVsjxWAYA
 
Il canale d'esempio lì sopra infatti in realtà esiste davvero e ha
quell'ID.
Questa era la parte banale, basta provare ad aprire con il browser
il canale, visualizzare il sorgente pagina e cercare la stringa:
 
https://www.youtube.com/channel/
 
 
da cui si recupera tra gli altri il seguente risultato che ovviamente
contiene l'ID da estrarre.
 
https://www.youtube.com/channel/UC8picqZkFo_Pr5PVsjxWAYA
 
 
Quindi niente di ché.
Il problema però è che aprendo quella pagina da una finestra in incognito
per esempio di firefox o chrome, viene richiesta l'accettazione cookies ecc
ecc... dal browser è banalmente superabile accettando e proseguendo, ma
volendo invece approcciare la questione in modo non interattivo, appunto
con wget o curl mi interessava capire come bypassare quella richiesta di
accettazione e raggiungere la vera home page del canale.
 
Forse con wget si può fare qualcosa in due tempi con save-cookies e load-cookies.
 
Ne sapete niente?

 
 
 
nel tuo motere di ricerca preferito inserisci la seguente chiave:
 
linux youtube downloader
 
dopo vi sul sito :     
https://pkgs.org
 


Leggi meglio la domanda, è piuttosto precisa.


Segui i suggerimenti che ti vengono dati, e scopriresti che almeno il 99% di quello che desideri è già stato fatto.
Per il restante 1% .... probabilmente basta cercare la giusta combinazione tra le vrie opzioni, al limite basta chiedere
all'autore,.
 
Mi dispiace ma la pappa pronta costa, e visti gli scontrini che girano il conto sarà salato. 


Non è che avessi troppe speranze di ricevere risposte utili in effetti,
i tempi in cui usenet era frequentata da utenti curiosi e inclini a
condividere le proprie conoscenze sembrano lontani, ma non è un fatto
di convenienza quanto una questione di ignoranza... tutti ben coccolati
da applicazioni già pronte e pochissimi che vadano a vedere cosa gira
sotto il cofano. Il senso della mia domanda invece era proprio quello:
avete aperto il cofano? come gira?
 
Tra l'altro la questione tecnica del topic non è così trascendentale,
non serve nessuna app, basta sapere come funziona la sessione di
accettazione di youtube. Ma senza passare da librerie già pronte, a
me interessa farlo con wget o curl proprio perché sono abbastanza
convinto che sia fattibile facilmente. Forse va fatto in due tempi,
al primo giro si scarica la pagina di accettazione giusto per salvare
i cookie e al giro successivo si riutilizzano in qualche modo per
bypassarla.
 
Al netto di questo per come hai risposto tu, potevi tranquillamente
risparmiarti la fatica. A me un app pronta non interessa, l'ho spiegato
nella domanda se l'avessi almeno letta per intero.
Se invece avevi indicazioni più precise per prendere spunto da app
libere come ad esempio yt-dlp o youtue-dl che macinano il tubo senza
problemi, a quel punto potevi essere più esplicito e mettere anche
qualche link spiegando quale parte di codice è adibita alla funzione
inerente la domanda. Altrimenti, cercare in google ho cercato anch'io
e qualcosa ho anche trovato, ma siccome non mi è riuscita la prova in
pratica, ho provato a chiedere anceh qui, ripeto senza troppe speranze.
 
Sui costi e pappa pronta e scontrini, mi spiace sono le classiche
puttanate di chi non sa rispondere alla domanda. Dal canto mio, sarò
più che felice di condividere la soluzione se la troverò autonomamente
e non arriverà prima la risposta di qualche altro utente più
collaborativo. Il tutto senza scontrini e senza conti salati.
 
D'altra parte alla fine era più per curiosità che altro... l'ID di
un canale youtube si può tranquillamente trovare e copiare via browser,
andando nella sezione "about" e vicino a "stats" si trova la freccina
"share", cliccandoci saltano fuori le opzioni "share channel" e
"copy chanel ID". Farlo con wget e curl, gestendo la sessione a mano
era più uno sfizio che una reale necessità, ma col vantaggio di avere
a portata di mano il botta e risposta col server yuotube.

 puttanate di chi non sa rispondere alla domanda. 
 
Uhm, no. Direi che è la risposta di chi sa che una data domanda non ha una 
risposta immediata ma richiede di indagare, e non ha tempo ne voglia di 
farlo al posto tuo. 
D'altra parte vorresti ti indicasse il punto esatto del codice che 
risponde alla tua richiesta, giusto? Beh non è che tutti ce l'hanno sulla 
punta della lingua.
 

 contiene l'ID da estrarre.
 
Quindi? Stai praticamente descrivendo tu stesso a parole questo:
 
$ curl -s '
https://www.youtube.com/@examplechannel
' | \
  grep '
https://www.youtube.com/channel/
'
 
Leggendo un po' di man grep, c'è l'opzione -o che ci porta già un po'
avanti (e con una conoscenza elementare di regexp):
 
$ curl -s '
https://www.youtube.com/@examplechannel
' | \
  grep -o '
https://www.youtube.com/channel/[
^"]*'
 
Se non sai continuare da solo da qui (come ho detto è un comando
derivabile dalla tua stessa spiegazione, quindi avresti dovuto poterlo fare
tu) allora hanno veramente ragione le altre risposte.
 
-- 
Ciò che si vede, è.
 

 punta della lingua.
 
Allora bastava non rispondere.
Di solito non sono incline alla polemica, ma chiedere è lecito,
rispondere è cortesia. Non pretendo che mi si dia una risposta,
va bene se mi si risponde "non saprei come fare", non è utile ma
ci può stare come supporto morale.
Non va bene se mi si indica una ricerca con google che ovviamente
ho già fatto senza nenache aver letto la domanda, e con il tono di
chi sa la risposta ma non la dice perché serve lo scontrino. In quel
caso meglio non rispodere, perdiamo meno tempo tutti e l'utilità è la
stessa.
Fine polemica.
Se riuscirò a venire ad una soluzione la posterò senz'altro, che poi
sia utile o meno non sta a me giudicarlo comunque per lo meno il topic
avrà una conclusione potenzialmente almeno sensata.

 tu) allora hanno veramente ragione le altre risposte.
 
 
Non è che non so continuare... ho fatto la prova con curl e mi sa
che c'è un equivoco... colpa mia che ho provato solo con wget, e lo
scaricamento della home page del canale non avviene. Infatti se provi
l'equivalente del tuo comando curl:
 
wget -qO- '
https://www.youtube.com/@examplechannel
'
 
Vedrai che quella non è la homepage del canale bensì la pagina
d'accettazione cookies. Si legge un "title" con scritto:
 
"Prima di continuare su YouTube"
 
È come se wget si bloccasse lì, mentre curl riesce a raggiungere
la homepage vera. Che infatti contiene anche l'ID del canale ecc.
Estrarre la stringa non è un problema, l'inghippo, direi curioso
a sto punto è che con wget l'operazione non riesce. Mentre con curl
sì.
 
Se hai esperienza di sessioni web server client e sai perché wget
si blocca all'accettazione mentre curl raggiunge la pagina target,
benvenga. Grazie della risposta.

 Fine polemica.
 
Io credo quando ti ha risposto di cercare un downloader su google sarebbe 
stato più "educato" dire semplicemente che non cercavi un downloader e 
magari riformulare in modo più chiaro la richiesta, invece di partire in 
quarta con la sparata. Si può fraintendere anche in buona fede, a me ad 
esempio non risulta mica così limpido quello che vuoi fare.

 benvenga. Grazie della risposta.
 
Non ne ho idea, comunque generalmente la prima cosa (o una delle prime
cose) da guardare in questi casi è la stringa di user-agent, se forzo wget
ad identificarsi come curl funziona:
 
$ wget -U 'curl/8.2.1' -qO- '
https://www.youtube.com/@examplechannel
' |\
 grep -o '
https://www.youtube.com/channel/[
^"]*'
https://www.youtube.com/channel/UC8picqZkFo_Pr5PVsjxWAYA
 
https://www.youtube.com/channel/UC8picqZkFo_Pr5PVsjxWAYA
 
...
 
Forzando invece un user-agent di un vero browser, dà la pagina di
accettazione, come a te in origine:
 
$ wget -U 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/
116.0.0.0
 Safari/537.36' -qO-
'
https://www.youtube.com/@examplechannel
' 
<!doctype html><html lang="en-GB" dir="ltr"><head><base
href="
https://consent.youtube.com/
">...
 
Quindi i signori di youtube (e anche altri siti che ho visto in
passato) rispondono diversamente a seconda dello user-agent (comportamento
generalmente stupido e inutile, perlomeno se lo user-agent è l'unica
discriminante, visto che è facilissimo da falsificare).
 
Per procedere ugualmente e simulare l'accettazione dei cookie bisognerebbe
vedere cosa fa il browser quando clicchi "accetta" (visibile facilmente coi
dev tools del browser) e poi riprodurre quella richiesta (probabilmente un
POST) con wget. In generale, ho sempre preferito curl a wget, che trovo
piuttosto limitato. Tra l'altro coi dev tools puoi fargli produrre già la
richiesta curl che puoi usare poi direttamente nel tuo script (tasto destro
sulla richiesta, copy as curl).


 sulla richiesta, copy as curl).
 
Ecco questa roba è qualcosa che così su due piedi non so come sfruttare,
se per caso avessi un link ad un esempio pratico di come di analizza la
sessione coi devtools e poi la si può riutilizare nel "formato curl"...
Grazie mille in ogni caso.


È molto semplice, e se rileggi il mio primo post mi sembra che non si
possa descrivere in altri termini. Comunque al netto dell'equivoco
dovuto allo user-agent di wget come evidenziato da "Marco", te lo
ripeto:
 
INPUT:  
https://www.youtube.com/@nomecancale
 
OUTPUT: ChAnnEl_Id_delCanale
 
Per lo scopo devi scaricare la homepage dell'url di partenza (input)
e greppare la stringa che contiene il channel_id in modo da farne il
parse ed estrarlo per poi mandarlo in output.
 
Il difficile stava nel fatto che usando wget, youtube lo inchioda e
gli restituisce non la homepage del canale, ma solo una generica pagina
di accettazione cookies o simile. Cosa che preclude il funzionamento
dell'operazione.
 
Spero sia più chiaro, non è che ci sia tanto di più da spiegare.
Può essere che non sia stato educato nella mia replica, pazienza...
ad ogni modo dalla risposta non mi sembra neanche che ci fosse tutta
questa volontà di contribuire, al punto che ripeto, era meglio non
rispondere. Poi ognuno faccia del suo tempo quello che meglio crede.

 discriminante, visto che è facilissimo da falsificare).
 
Non è "stupido e inutile", visto che il consenso è necessario chiederlo 
all'utente-persona. Sarebbe stupido e inutile semmai lo chiedessero anche 
ad un bot che fa semplicemente scraping e di cui ovviamente non raccolgono 
dati di profilazione.
 

 Grazie mille in ogni caso.
 
Azz, te l'ho anche detto, tasto destro -> copy -> copy as curl, poi lo
incolli dove ti pare. Per aprire dev tools usa ctrl + shift + i (ma sono
sicuro che con google l'hai già trovato, vero?).



Il consenso possono anche chiederlo in un banner o in un angolo dello
schermo, come fanno molti altri siti, senza perforza mostrarti una pagina
che blocca il proseguimento. Ed è stupido perché se io configuro il mio
browser per identificarsi come curl in teoria non vedo quella finestra (non
ho provato, comunque).


 ripeto:
 
Non è un equivoco, ti ha dato la soluzione. Tramite lo User-Agent il tuo 
script dice al sito di essere un bot e non un utente che naviga con il 
browser e il sito non chiede il consenso dei cookie. 
Questa è la risposta, punto. Ringrazia Marco.

 finestra (non ho provato, comunque).
 
Non vedi quella finestra ma probabilmente non ti funzionerà neanche la 
navigazione. Per dire, prova con la pagina 
www.google.com
 usando wget sia 
impostando lo User-Agent di curl che non impostandolo, e vedi la 
differenza.
 

 Questa è la risposta, punto. Ringrazia Marco.
 
Sì, però prima di mettere il punto è sempre buona cosa andarci coi piedi
di piombo soprattutto quando si ha a che fare con un sito come youtube,
di cui alla fine non si ha la sicurezza di cosa faccia esattamente con
le richieste e come le filtri e le elabori.
 
Di certo c'è che usando lo user-agent di curl entrambi i "bot" funzionano.
 
Per il resto arrivi tardi ho già ringraziato Marco. Puoi vederlo nella mia
risposta a lui. Sempre in quel ramo andrò a mettere anche una risposta
conclusiva, magari potrà chiarirti ancor meglio quello che cercavo di
fare... se interessa la trovi là.

 sicuro che con google l'hai già trovato, vero?).
 
Sì ma dev tools è un indizio, quando non lo si sa usare dice molto ma
non tutto, per quello cercare un esempio è sempre utile, me lo cercherò
alla bisogna.
Non ho cercato perché funziona con curl liscio.
Metto sotto la riga di comando con relativo output desiderato:
 
-----------------------------------------------
curl -s 
https://www.youtube.com/@examplechannel
 \
        | sed -n '/channel_id/s/^.*channel_id=\([^"]*\)".*$/\1/p'
-----------------------------------------------------------------
UC8picqZkFo_Pr5PVsjxWAYA
------------------------
 
A me serviva solo questo... come avevo scritto, niente di ché. Il
difficile era quell'inghippo e curl ne era la soluzione, errore mio
ripeto, ad aver provato solo con wget.
Grazie del suggerimento e grazie delle risposte, soprattuto per aver
chiarito che il discrimine era lo user agent. Penso sia un'informazione
di utilità un po' a tutti, se mai qualcuno si chiedesse come
interloquire con youtube o siti simili.
Grazie ancora ciao.

 funzionano.
 
Quindi l'accendiamo?
 
 

 Quindi l'accendiamo?
 
Già risposto con soluzione in oneliner, c'è poco da accendere.

 punto.
 
Quant’è bella giovinezza,
che si fugge tuttavia!
chi vuol esser lieto sia:
del doman non v’è certezza.

 Forse con wget si può fare qualcosa in due tempi con save-cookies e load-cookies. 
 
io ho da qualche parte uno script cucinato in casa che cerca in un file html tutti i link che cominciano con 
youtube.com/
 e crea uno script wget.
Pero' devi entrare nella pagina che ti serve, scorrere fino al fondo e poi salvarla.
ti puo' servire?


No grazie, per lo scopo le topic avevo riportato quanto bastava:
 
-----------------------------------------------
curl -s 
https://www.youtube.com/@examplechannel
 \
         | sed -n '/channel_id/s/^.*channel_id=\([^"]*\)".*$/\1/p'
-----------------------------------------------------------------
UC8picqZkFo_Pr5PVsjxWAYA
------------------------
 
In seguito ad alcuni test l'ho un attimo rivisto però il succo
è quello, ovvero "curl" presenta uno user-agent a cui youtube
non propone la pagina di accettazione cookies rendendo l'operazione
fattibile. Usavo wget il cui user-agent viene tratto diversamente da
youtube, intercettato e rediretto verso quella pagina, quindi non
raggiunge il canale contenente l'ID da ritornare in output.
 
Poi va be' il parse era abbastanza lisco. Grazie comunque :)