Ανέβασμα εικόνων σε imgbb από command line

Πριν μερικές μέρες μου δημιουργήθηκε η ανάγκη να μπορώ να ανεβάζω εικόνες στο 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
5 «Μου αρέσει»

Επόμενα βήματα, να γίνει σε XFCE droplet, σε gnome extension κλπ

Να μπορεί ο οποιαδήποτε να κάνει copy από clipboard απευθείας με ένα keyboard shortcut και άλλα πολλά :wink::blush:

1 «Μου αρέσει»

Στο δικό μου λάπτοπ το έχω κάνει ήδη σε XFCE, κάνω δεξί κλικ την εικόνα, Copy Image, πατάω το κουμπί και μετά απλά paste στο chat room. 4 κλικ όλα και όλα.

Πριν έπρεπε να κάνω: Δεξί Κλικ → Αποθήκευση Εικόνας Ως → Να ανοίξω το imgbb.com → να κάνω Upload → στην σελίδα που μου βγάζει να πατήσω Copy στο λινκ → Να το ανοίξω σε νέο Tab → να κάνω Copy την διεύθυνση και τέλος, να πάω στο chat και να κάνω Paste. Σύνολο σχεδόν καμιά 10αριά κλικ! Απαράδεκτο! :joy:

2 «Μου αρέσει»

Για το key δεν θα βόλευε αν ήταν μέσω env var?

Πολύ πιθανό, αλλά σιγά το σημαντικό key για να μην στο χακάρουν… Χεχε.