Πριν μερικές μέρες μου δημιουργήθηκε η ανάγκη να μπορώ να ανεβάζω εικόνες στο imgbb.com, ένα site για δωρεάν ανέβασμα εικόνων/φωτογραφιών. Συνήθως τις ανεβάζω εκεί γιατί είμαι σε ένα chat room ενός ραδιοφωνικού σταθμού όπου πρέπει να βάλεις διεύθυνση εικόνας, αλλά η διαδικασία είναι χρονοβόρα κάθε φορά που θέλω να ανεβάσω μια φωτογραφία στο imgbb, οπότε προσπάθησα να την απλοποιήσω με ένα bash σκριπτάκι.
Τα προγράμματα που χρειαζόμαστε στον υπολογιστή μας είναι: xclip, curl, zenity, sed. Τα περισσότερα υπάρχουν ήδη στις διανομές linux, αν δεν έχεις κάποιο από αυτά, να το εγκαταστήσεις.
Κατ’αρχάς, πριν ξεκινήσουμε το σκριπτάκι σε bash, πρέπει να κάνουμε λογαριασμό, πηγαίνοντας στο Create account — ImgBB
Στη συνέχεια πρέπει να φτιάξουμε ένα API Key για το σκριπτάκι μας.
Αφού φτιάξουμε πρώτα τον λογαριασμό μας και κάνουμε verify μέσω του email που θα έρθει, πάμε στην σελίδα https://api.imgbb.com/ και κάνουμε Add Key, ώστε να μας βγάλει ένα κλειδί με γράμματα και αριθμούς που θα χρησιμοποιήσουμε για το ανέβασμα των εικόνων.
Στην συνέχεια θα φτιάξουμε το σκριπτάκι μας. Χρησιμοποίησα 2 διαφορετικά σκριπτάκια, ένα για όταν κάνουμε Copy Image την εικόνα από τον browser (Chrome, Firefox κτλ) και ένα για όταν θέλουμε να ανεβάσουμε μια εικόνα που έχουμε ήδη στον υπολογιστή (θα χρειαστούμε το πρόγραμμα zenity γι’αυτό). Στο τελικό σκριπτάκι τα συνδύασα και τα δυο σε ένα!
1η περίπτωση (ανέβασμα αρχείων με Copy Image από τον browser):
#!/bin/bash
API_KEY=ΕΔΩ_ΒΑΖΟΥΜΕ_ΤΟ_API_KEY_ΠΟΥ_ΦΤΙΑΞΑΜΕ
# Δίνουμε ένα τυχαίο όνομα στο αρχείο που θα δημιουργηθεί
img_filename="$(cat /dev/urandom | tr -cd 'a-f0-9' | head -c 8).jpg"
# Σώζουμε την εικόνα από το clipboard σε ένα αρχείο στον φάκελο /tmp με το τυχαίο όνομα που δημιουργήσαμε
xclip -selection clipboard -t image/jpeg -o > "/tmp/$img_filename"
# Αντιγράφουμε την διαδρομή και το όνομα του αρχείου ξανά στο clipboard για να το χρησιμοποιήσουμε ως παράμετρο
clipboard_file="/tmp/$img_filename"
# Αυτή είναι η εντολή curl που χρειάζεται για να ανέβει η εικόνα στο imgbb
# Σημείωση: η παράμετρος "expiration=3600" λέει στο σάιτ να σβήσει την εικόνα μετά από 1 ώρα (3600 δευτερόλεπτα). Αν δεν θέλουμε να την σβήσουμε, αφαιρούμε το κομμάτι "expiration=3600&" (μαζί με το &) από τον κώδικα
RESPONSE=$(curl -s --location --request POST "https://api.imgbb.com/1/upload?expiration=3600&key=${API_KEY}" --form "image=@$clipboard_file")
# Αυτή η παράμετρος θα μας δώσει τελική διεύθυνση από το imgg.com όπου ανέβηκε η εικόνα
URL=$(echo $RESPONSE | sed 's/^.*"display_url":"//' | sed 's/",.*$//' | sed 's#\\/#/#g')
# Τυπώνουμε στο τερματικό την διεύθυνση όπου ανέβηκε η εικόνα.
echo $URL
2η περίπτωση (ανέβασμα εικόνας από φάκελο στον υπολογιστή):
#!/bin/bash
API_KEY=ΕΔΩ_ΒΑΖΟΥΜΕ_ΤΟ_API_KEY_ΠΟΥ_ΦΤΙΑΞΑΜΕ
# Επιλέγουμε ένα αρχείο από τον υπολογιστή μας με zenity
saved_file=`zenity --file-selection --title="Select a File"`
# Αυτή είναι η εντολή curl που χρειάζεται για να ανέβει η εικόνα στο imgbb
# Σημείωση: η παράμετρος "expiration=3600" λέει στο σάιτ να σβήσει την εικόνα μετά από 1 ώρα (3600 δευτερόλεπτα). Αν δεν θέλουμε να την σβήσουμε, αφαιρούμε το κομμάτι "expiration=3600&" (μαζί με το &) από τον κώδικα
RESPONSE=$(curl -s --location --request POST "https://api.imgbb.com/1/upload?expiration=3600&key=${API_KEY}" --form "image=@$saved_file")
# Αυτή η παράμετρος θα μας δώσει τελική διεύθυνση από το imgg.com όπου ανέβηκε η εικόνα
URL=$(echo $RESPONSE | sed 's/^.*"display_url":"//' | sed 's/",.*$//' | sed 's#\\/#/#g')
# Τυπώνουμε στο τερματικό την διεύθυνση όπου ανέβηκε η εικόνα.
echo $URL
Συνδυάζοντας και τις δυο περιπτώσεις σε ένα αρχείο bash, στο οποίο επιλέγεις μια από τις δυο, έχουμε το εξής σκριπτάκι:
#!/bin/bash
API_KEY=ΕΔΩ_ΒΑΖΟΥΜΕ_ΤΟ_API_KEY_ΠΟΥ_ΦΤΙΑΞΑΜΕ
operations=("clipboard_image" "saved_image")
select operation in "${operations[@]}"; do
case $operation in
"clipboard_image")
img_filename="$(cat /dev/urandom | tr -cd 'a-f0-9' | head -c 8).jpg"
xclip -selection clipboard -t image/jpeg -o > "/tmp/$img_filename"
clipboard_file="/tmp/$img_filename"
RESPONSE=$(curl -s --location --request POST "https://api.imgbb.com/1/upload?expiration=3600&key=${API_KEY}" --form "image=@$clipboard_file")
URL=$(echo $RESPONSE | sed 's/^.*"display_url":"//' | sed 's/",.*$//' | sed 's#\\/#/#g')
echo $URL
sleep 10s
exit;;
"saved_image")
saved_file=`zenity --file-selection --title="Select a File"`
RESPONSE=$(curl -s --location --request POST "https://api.imgbb.com/1/upload?expiration=3600&key=${API_KEY}" --form "image=@$saved_file")
URL=$(echo $RESPONSE | sed 's/^.*"display_url":"//' | sed 's/",.*$//' | sed 's#\\/#/#g')
echo $URL
sleep 10s
exit;;
esac
done