Ceci est une ancienne révision du document !
IMPORTANT: cette idée et le code qui en résulte ont été pondus un samedi soir 23h30 après deux verres d'alcool à 21° en conjoncture avec un certain ennui et seulement 2 heures de code/test. Bref c'est une horreur, mais l'idée à la base n'est pas mauvaise. Soyez libres de développer ça
- machine Debian/Ubuntu
- cutycapt
- xvfb
- php5-cli
- php5-cgi
Structure des fichiers:
- /
- /db/
- /work/
- /index.php
- /webcapt.run
Principe de base: on appelle index.php avec une URL en paramètre GET, index.php passe l'URL via fichier dans /work/ à webcapt, ce dernier génère des captures d'écran PNG et SVG avec cutycapt, renomme selon hash sha1 de l'URL et déplace dans /db/, index.php enfin redirige vers le fichier s'il existe.
Intérêt: combiné à un Autoblog, fournir un instantané en image de la page autobloguée (permettant ainsi de sauvegarder le design et extraire d'autres éléments de la page grâce au SVG ouvert dans Inkscape)
Bémols:
- ça bouffe pas mal de ressources, la génération de captures d'écran.. d'où le forbidden qui limite les IP pouvant appeler le script
- un entrecroisement PHP/Bash assez moche avec une passation de données ridicule (via nom d'un fichier avec un “for file in *”)
- vous en connaissez beaucoup, vous, d'hébergeurs mutualisés qui autorisent exec() ? Niveau sécu c'est assez horrible
- …
** Le code**
- index.php
<?php if($_SERVER['REMOTE_ADDR'] === '8.8.8.8') { } else { header('HTTP/1.1 403 Forbidden');die('forbidden');} if(isset($_GET['url'])) { } else {header('HTTP/1.1 403 Forbidden');die('no url given');} $request = $_GET['url']; if(isset($_GET['svg'])) { $type="svg";} else {$type="png";} $filename = base64_encode($request); $urlhash = sha1($request); if(file_exists("db/$urlhash.$type")) { header("Location: db/$urlhash.$type");die; } else { file_put_contents("work/$filename", ''); exec('./webcapt.run'); if(file_exists("db/$urlhash.$type")) { header("Location: db/$urlhash.$type");die; } else {die('error');} } ?>
- webcapt.run
#!/bin/bash mkdir -p "work" mkdir -p "db" cd "work/" for file in *; do url=$(echo "$file" | base64 -d); urlhash=$(php -r "echo sha1(\"$url\");") xvfb-run --server-args="-screen 0, 1280x720x24" cutycapt --url=$url --private-browsing=on --user-agent="Mozilla/5.0 (X11; U; Linux x86_64; C) CutyCapt" --header=DNT:1 --min-width=1280 --min-height=720 --out="$file.svg" xvfb-run --server-args="-screen 0, 1280x720x24" cutycapt --url=$url --private-browsing=on --user-agent="Mozilla/5.0 (X11; U; Linux x86_64; C) CutyCapt" --header=DNT:1 --min-width=1280 --min-height=720 --out="$file.png" rm "$file" mv "$file.svg" "../db/$urlhash.svg" mv "$file.png" "../db/$urlhash.png" done