[macOS] Automatyczny upload zrzutów ekranu

W Dogtronic korzystamy z konwencji, według której do udostępniania zrzutów ekranu lub nagrań między członkami zespołu służy serwer. Każdy programista posiada własny katalog, do którego może przesyłać pliki i udostępniać je na świat. Preferowanym narzędziem automatyzującym ten proces jest zwykle ShareX. Jest to świetne narzędzie, które całą ciężką robotę załatwia za nas, jednak ma swoją wadę – działa tylko pod Windowsem.

Kiedy parę miesięcy temu przechodziłem na MacOS okazało się, że proste udostępnianie zrzutów ekranu kolegom stanowi spore wyzwanie. Sprawdzałem takie programy jak CloudApp czy Skitch, ale niestety nie spełniały one moich oczekiwań. 

Wpadłem więc na szalony pomysł – a co gdyby zrobić wszystko samemu?

Cel i narzędzia

Wyzwanie zacząłem od postawienia sobie celów, które pozwolą mi na sprecyzowanie własnych wymagań do tworzonego narzędzia. Są one następujące:

  • użycie natywnego skrótu klawiszowego Cmd + Shift + 4
  • przełączanie między trybami 'zaznacz fragment' oraz 'zaznacz okno'
  • ustawianie własnej nazwy pliku z możliwością użycia daty lub wygenerowania losowej nazwy
  • automatyczne wysyłanie pliku na serwer i generowanie liku

Do wykonania zadania użyłem narzędzia Automator, które służy do automatyzacji zadań w systemie MacOS. Zaczynamy od utworzenia nowej aplikacji wybierając Plik -> Nowy -> Aplikacja.

Krok 1

Utworzenie zrzutu ekranu

W pierwszej kolejności musimy wykonać zrzut ekranu. Niesamowita niespodzianka. W celu zrobienia tego z poziomu powłoki używamy komendy screencapture. 

screencapture -i ~/Desktop/tmpScreenshot.png
Utworzenie zrzutu ekranu - krok 1

Z menu po lewej stronie w oknie Automatora przeciągamy opcje Uruchom skrypt powłoki. Wybieramy odpowiadającą nam powłokę (w moim przypadku jest to zsh) oraz wywołujemy w niej komendę, która zrobi zrzut ekranu i zapisze obraz na pulpicie.

Krok 2

Wybranie nazwy pliku

Drugim krokiem będzie napisanie prostego skryptu w języku AppleScript, który posłuży do wybrania nazwy pliku lub anulowania operacji.

on run
	set cryptname to do shell script "openssl rand -hex 10"
	set datename to do shell script "date -ju +%Y-%m-%d_%H.%M.%S"
	set cryptbutton to "Use \"" & cryptname & "\""
	display dialog "Filename (extension will be added automatically)" default answer datename buttons {"Cancel", cryptbutton, "OK"} default button "OK" cancel button "Cancel" with title "New screenshot"
	
	if button returned of result is cryptbutton then
		return cryptname & ".png"
	else
		return (text returned of result) & ".png"
	end if
end run
Wybranie nazwy pliku - krok 1/2

Nie będę się tutaj zagłębiać w samą składnie AppleScript, bo nie o tym jest ten artykuł, ale opiszę po krótce jak działa przedstawiony skrypt.

Zaczynamy od utworzenia losowej nazwy pliku z użyciem openssl oraz pobrania bieżącej daty przy użyciu date. AppleScript pozwala nam tutaj na wykonywanie skryptów na powłoce oraz przypisywanie ich wyników do zmiennych.

Następnie tworzymy dialog, który wyświetli się użytkownikowi. Prezentuje się on w następujący sposób:

Wybieranie nazwy pliku - krok 2/2

Na tym etapie możemy wybrać nazwę pliku lub anulować operację. Całość zaczyna nabierać kształtu.

Krok 3

Upload pliku na serwer

Przyznam, że tutaj miałem najwięcej problemów, ale to może dlatego, że postawiłem sobie za cel zrobienie skryptu w technologi, z którą styczność miałem praktycznie zerową. W związku z tym na pewno znajdzie się jakiś mistrzunio shellowy, który powie, że da się lepiej, ale jak to mówią działa to działa.

export PATH=/usr/local/bin:$PATH
HOST='0.0.0.0'
URL='url.com'
USER='user'
PASS='pass'
PORT=2252
REMOTEPATH="/remote/path/$1"
LOCALFILE="/Users/user/Desktop/tmpScreenshot.png"
sshpass -p $PASS scp -P $PORT $LOCALFILE $USER@$HOST:$REMOTEPATH
rm "$LOCALFILE"
echo "https://$URL/$USER/$1" | pbcopy
Upload pliku na serwer - krok 3

Ważne jest, aby przekazać dane wejściowe jako argumenty, dzięki czemu skorzystamy z podanej wcześniej nazwy pliku stosując zmienną $1. Podmieńcie wszystkie zmienne odpowiadającymi wam wartościami. Skorzystamy teraz z sshpass (którego prawdopodobnie będziecie musieli doinstalować) oraz scp, czyli standardowej komendy służącej do wysyłania plików przez ssh. Po wysłaniu pliku na serwer usuwamy tymczasowy plik z pulpitu oraz kopiujemy URL do schowka.

Krok 4

Wyświetlanie powiadomień

Ostatnim krokiem będzie wyświetlenie powiadomienia o powodzeniu operacji oraz skopiowaniu linku do schowka. Nie ma tu żadnej filozofii.

Była to ostatnia rzecz do zrobienia w Automatorze. Pozostało nazwać skrypt i go zapisać.

Krok 5

Przypisanie skrótu klawiszowego

Najtrudniejsze za nami. W celu przypisania skryptu pod skrót klawiszowy należy wejść w Preferencje systemowe -> Klawiatura -> Skróty. Tutaj najpierw należy odszukać natywne przypisanie skrótu Cmd + Shift + 4 i go zmienić. Ja dodałem po prostu do tego miksu control.

Następnie w usługach wybieramy nasz skrypt i przypisujemy go do wybranego skrótu klawiszowego.

Przypisanie skrótu klawiszowego - krok 5.2

I gotowe! Wszystko powinno działać bez zarzutów. W każdym razie u mnie działa.

Podsumowanie

Nie jest to na pewno perfekcyjne rozwiązanie, ale na moje potrzeby jest w zupełności wystarczające. Wykonanie całości zajęło mi 4 godziny – nie miałem wcześniej styczności z Automatorem ani AppleScript. Nie wiem czy to dobry wynik, ale finalnie jestem zadowolony,

Zapraszam do ulepszania i modyfikowania skryptu (jakiś error handling może, tej?) oraz dzielenia się wynikami swojej pracy w komentarzach. 

W Dogtronic kładziemy nacisk na wspólną naukę i wzajemne motywowanie się do samorozwoju, nawet w przypadku wyzwań typu ta to wyślij skrina na serwer. Jeżeli również lubisz eksperymentować i wykazywać się kreatywnością koniecznie zajrzyj w zakładkę Kariera.

Karol Ścibior

Full-Stack TypeScript Dev | Idealista Web3 | Pasjonat $MAGIC i TreasureDAO

Zostaw komentarz

1 × 1 =

Top