Screen Shot script

    image Всем доброго времени!
    В один прекрасный момент меня достало:
    1. Нажимать PrintScreen
    2. Искать место куда же его сохранить
    3. Открывать сервис imageshack\radikal\хабр-эффект
    4. Искать на диске, куда же я сохранил все таки именно этот скриншот
    5. Копировать полученную ссылку, и делать с ней .....

    Теперь я делаю:
    1. Нажимаю Ctrl+/
    2. Копирую полученную ссылку и делаю с ней .....

    Неправдо ли лучше? И вас это тоже достало? Тогда лезем под кат!

    А тут у нас нет ничего сложно, но сначала немного истории ;)
    Захотев сделать user-friendly инструмент, я честно скачал исходники gnome-utils в котором лежит gnome-screenshot, но поняв, что допиливание этого «чуда» будет куда сложнее, интерестнее и медленне чем написание очередного комманд-лайнера, я полез в man curl… Сразу скажу, что не стоит злоупотреблять этим скриптом. Мы ведь не хотим нагрузить наш сервис по самые уши, чтобы он стал тормозить, или еще чего нибудь хуже? Поэтому просто делаем скриншоты, и не злоупотребляем.
    Я написал реализацию для трех популярных и известных файлохостингов:
    radikal.ru
    ImageShack
    Хабр-Эффект

    Для работы этого детища нам понадобятся следующие утилиты:
    scrot curl xsel
    В Debian\Ubuntu подобных системах поставить их можно следующей коммандой:
    sudo aptitude install scrot curl xsel
    Далее, создаем файл
    sudo touch /usr/sbin/screen.sh
    Делаем его исполняемым
    sudo chmod +x /usr/sbin/screen.sh
    Открываем ваш любимый редактор, и вставляем слудщий код:
    #!/bin/bash
    scrot  /tmp/screen.png
    curl  -F "upload=yes" -F "filename=@/tmp/screen.png" http://www.radikal.ru/action.aspx | grep "input_link_1\"" | cut -d "\"" -f4 | tee -ai /var/log/screens.log | xsel -b -i ;
    tail -n 1 /var/log/screens.log |  xargs -I _ google-chrome _ ;
    notify-send "Загрузка скриншота" "Скриншот был успешно загружен" -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg -t 5000 ;
    
    curl  -F "upload=yes" -F "file=@/tmp/screen.png" -L http://habrastorage.org/storage/habraeffect/05/68/056805cc524b8f502bd06f517fb65059.pngupload.php  | grep -e "original-link" |  awk -F"\"" '{print $10}' | tee -ai /var/log/screens.log | xsel -b -i ;
    tail -n 1 /var/log/screens.log |  xargs -I _ google-chrome _ ;
    notify-send "Загрузка скриншота" "Скриншот был успешно загружен" -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg -t 5000 ; 

    ImageShack по какой то мне не ведомой причине не хочет принимать такие png'шки, поэтому для него используем jpg. Может подскажите?
    #!/bin/bash
    scrot /tmp/screen.jpg
    curl  -F "upload=yes" -F "fileupload=@/tmp/screen.jpg" http://www.imageshack.us/upload_api.php | grep "image_html" | awk -F"="" '{print $2}' | cut -d "&" -f1 | tee -ai /var/log/screens.log | xsel -b -i ;
    tail -n 1 /var/log/screens.log |  xargs -I _ google-chrome _ ;
    notify-send "Загрузка скриншота" "Скриншот был успешно загружен" -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg -t 5000 ;
    

    Выбираете для себе то что хотите, и оставляйте только ОДНУ строчку с curl'ом.

    Далее лепим в горячих клавишах, у меня в гноме, у вас это может быть по другому, открытие по кнопкам нашего скрипта.
    habrastorage.org/storage/habraeffect/05/68/056805cc524b8f502bd06f517fb65059.pngfiles/1a8/ef227f182/screen.png
    Вот пример для гнома.
    Вот теперь и все)
    P.S. Предлагаю Вам создать нечто подобное и для других фотохостингов. Обязательно включу в статью ;)

    UPD0. Добавил возможность копирования ссылки в буфер обмена с использованием xsel
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 83

      +4
      … или можно поставить clip2net для Linux…
      clip2net.com/linux.html
        +2
        Там идет подтверждение на отправку и не только, что заставляет выполнить несколько лишних действий ;)
          +2
          Код распространяется «как есть» — вы можете свободно использовать, редактировать и распространять программу или это руководство, указав автора.

          Мы с вами люди с прямыми руками ;) Можно и убрать подтверждение.

          В любом случае спасибо Вам за достаточно подробный мануал.
            0
            Я делал так, как удобно мне.
            Вы можете поменять исходный скрипт — там всё наглядно и просто ;)
            +2
            Можно сделать так и для мака — www.macosxhints.com/article.php?story=20090612164009491
            Тут описано как добавить кейчейн в скипт — macscripter.net/viewtopic.php?id=25536
              0
              для мака есть замечательный сервис www.droplr.com =)
                0
                у каждого свой путь.
                  0
                  а еще есть cloud.app
                    0
                +1
                Для своего удобства прошлым летом сделал shotpic.ru
                Делает тоже самое, только на мой сервер
                  +1
                  Юзаю clip2net и его скрипт. Только вот ограничения его не очень нравятся.

                  В последнее время присматриваюсь к хабраэффекту.
                  Спасибо за полезный скрипт.
                    0
                    А какие там ограничения? они разве на столько серьезные?
                      +1
                      Да нет, не очень то серьезные:
                          > 100 Mb дискового пространства для изображений и файлов
                          > 500 Mb интернет траффика ежедневно
                          > Загрузка до 50 изображений или файлов в день
                          > Хранение файлов до 30 дней с момента загрузки
                      

                      Не всегда просто бывает 50 штук в день не достаточно + ограничение в 30 дней тоже как-то не очень, пару раз 500 мб трафика не хватило. А покупать аккаунт как-то не хочется.

                      Поэтому когда надо на долго и много залить картинок/фоток юзал пискасу и/или дропбокс.

                      Кстати, на хаброэффекте вроде подобных ограничений нет (по крайней мере я не нашел).
                      0
                      Решение проблемы ограничения на clip2net — goo.gl/c2hL
                      0
                      И да, совсем забыл, что
                      | tee -ai /var/log/screens.log | 
                      далает запись ссылок в соотв. файл. Поэтому вы их никогда не потеряете))
                        +1
                        Что то он у меня не делает запись, несмотря на то что файл я создал…
                          +2
                          Поставьте права 777
                            +1
                            Спасибо, не сообразил.
                            +1
                            может прав пользователя не хватает?
                          +3
                          А есть еще Shutter :)
                            +2
                            Пользуюсь Shutter, когда надо сделать какие-нибудь пометки на скриншоте. К тому же можно загружать картинки на свой фтп-шник. По удобству почти как clip2net)
                            +1
                            Почему то не работает «Копировать в буфер обмена» если нажимаем через окно вызванное printscreen.

                            Так же я решил немного модифицировать ваш скрипт, я не хочу что бы каждый раз у меня открывался хром со скриншотом а просто копировалась ссылка в буфер обмена и появлялось уведомление о том что загрузка завершена, уведомление я уже сделал но в силу скудности своих знаний в области bash, я не знаю как реализовать копирование ссылки в буфер обмена, есть какие то способы?
                              +2
                              Например так:

                              Это:
                              ... |  xargs -I _ google-chrome _

                              Замените на:
                              ... | xsel  -b -i


                              Полный код для хаброэффекта:
                              #!/bin/bash
                              scrot /tmp/screen.png
                              curl  -F "upload=yes" -F "file=@/tmp/screen.png" -L http://habreffect.ru/upload.php  |\
                                grep -e "original-link" |  awk -F"\"" '{print $10}' | tee -ai /var/log/screens.log |\
                                xsel  -b -i

                                +1
                                Теперь и браузер не открывает и ссылку не копирует :(
                                  +1
                                  Тупой мудак! xsel поставил и всё заработало, спасибо.

                                  Осталось проблема с неработоспособности кнопочки «Копировать в буфер обмена» если нажимаем через окно вызванное printscreen.
                                    +2
                                    Бывает ;)

                                    Эта кнопка не линк копирует в буфер, а сам скриншот. К тому же это стандартная гномовая утилита, которая не имеет ни ккого отношения к скрипту.
                                      0
                                      Как то я раньше не замечал это :) В любом случае спасибо за помощь :)
                                        +1
                                        Не за что :)
                                    +1
                                    Вы же сказали:
                                    я не хочу что бы каждый раз у меня открывался хром со скриншотом а просто копировалась ссылка в буфер обмена


                                    Ссылка в буфер не копируется, скорее всего, потому что у вас xsel не установлен.
                                    Для Debian-Like:
                                    aptitude install xsel
                                      0
                                      Опечатался, хотел сказать что бы хром НЕ открывался :)
                                      Уже всё сделал, только с кнопкой осталась проблема и незнаю где копать…
                                        0
                                        Расскажите как, у меня не получилось(
                                        0
                                        Что вам с кнопками не понятно? Как сделать хоткей, чтобы по нему скрипт отрабатывал?
                                          0
                                          Игнорируйте меня :) Я начинаю нести бред, уже сделал всё что хотел.
                                  0
                                  К сожалению мне не удалось сделать копирование, пробовал xsel, xclip. Они копируют их, но после перехода обратно в хром, буфер меняется. Мне кажется, что эти утилиты работают с разными буферами
                                    +1
                                    xsel может с разными буферами работать:
                                    Selection options
                                      -p, --primary         Operate on the PRIMARY selection (default)
                                      -s, --secondary       Operate on the SECONDARY selection
                                      -b, --clipboard       Operate on the CLIPBOARD selection
                                    

                                    Я использовал "-b", чтобы в оба буфера засунуть линк.

                                    Почему после перехода в хром они менялись не знаю. Как вы это делали?
                                      0
                                      Косячек ;) я в праймари в обоих писал ;)
                                      Спасибо. Добавил в пост.
                                        0
                                        А… Я первый раз тоже на это наткнулся :)
                                        Не за что :)
                                          0
                                          Кстати, grep можно выкинуть из скрипта, его работу с легкостью делает awk:
                                          curl  -F "upload=yes" -F "file=@/tmp/screen.png" -L http://habreffect.ru/upload.php  |\
                                           awk -F"\"" '/original-link/ {print $10}'

                                    +2
                                    Ещё есть gyazo.
                                      0
                                      Пользовался им долгое время на винде, а вот на линуксе поднять не смог. Не хватает прямоты рук видимо. Но он мне нравится своей минималистичностью.
                                        0
                                        А что там поднимать? Это же просто скрипт на Ruby.
                                          0
                                          Та ясное дело, но у меня не заводился. Не помню почему.
                                          Попробую завтра еще раз:)
                                      –5
                                      Да, нас это достало! И по этому мы уже давно не рвём жопу в попытках написать свой велосипед, а давно используем готовые решения.

                                      Теперь каждый кого достало делать действия для публикации скриншота, будет писать свой велосипед и обязательно рассказывать о нём на хабре.
                                        +1
                                        Любой уважающий себя никсойд должен придумать свой велосипед в виде аплоудера картинок и файлов. Старо как мир к сожалению.
                                          0
                                          Dropbox?
                                            0
                                            Тоже много лишних действий будет.
                                            Хотя в теории можно всё автоматизировать…
                                              0
                                              По крайней мере необходимо иметь аккаунт. А вот для заливки я там видал веб морду. Что вам нужно туда запихнуть?)
                                              В принципе можно попробовать)
                                                0
                                                Не, я ручками в принципе без проблем делаю, можно к минимуму свести просто действия, сохранение в Dropbox напрямую… Но это я предложил просто как вариант.
                                                  0
                                                  У них для линукса есть клиент ;)
                                                  Я им пользуюсь, копирую в одну папку, и оно само все распихивает по серверам
                                                    0
                                                    Ну я так же, я имею в виду сохранение сразу в папку, а не копировать/вставлять.
                                                      0
                                                      Это-то да. Можно даже scrot/shutter/etc настроить, чтобы сохранял сразу в
                                                      ~/Dropbox/Public, чтобы автоматом заливалось.
                                                      Но линки-то в буфер автоматом не копируются… Приходится делать (для каждого файла):
                                                      $ dropbox puburl /home/USER/Dropbox/Public/filename.ext

                                                      Что уже не очень удобно.

                                                0
                                                Добавил уведомление :)

                                                notify-send «Загрузка скриншота» «Скриншот был успешно загружен» -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg -t 5000
                                                  –1
                                                  Предлагаю вашему вниманию Другой доработанный скрипт для радикала:
                                                  #!/bin/bash
                                                  scrot  /tmp/screen.png
                                                  curl  -F "upload=yes" -F "filename=@/tmp/screen.png" http://www.radikal.ru/action.aspx | grep "input_link_1\"" | cut -d "\"" -f4 | tee -ai /car/log/screens.log | xsel -b -i ;
                                                  tail -n 1 /var/log/screens.log |  xargs -I _ google-chrome _ ;
                                                  notify-send "Загрузка скриншота" "Скриншот был успешно загружен" -i usr/share/icons/gnome/scalable/emblems/emblem-default.svg -t 5000
                                                  

                                                  Данный скрипт, сохраняет в /var/log/screens.log картинку, копирует ссылку в буфер обмена, после чего открывает «хром», или ваш любимый браузер и показывает этот скриншот.
                                                  ЗЫ обновил пост
                                                    0
                                                    О ужас, а зачем в /usr/sbin? Если мне не изменяет память, программы оттуда запускаются только через sudo.
                                                    Правильнее уже будет сунуть свой скрипт в /usr/local/bin
                                                      0
                                                      Всетаки она вам изменяет))
                                                      Как хотите, туда и пихаете, я вас заставляю?) хоть в ~/ пихайте. Никого не держу))
                                                        +3
                                                        Всетаки она вам изменяет))
                                                        Не знаю какой у Вас дистр, но в моём такое не прокатит.
                                                        хоть в ~/ пихайте
                                                        И такой вопрос возникает: как из ~/ потом одной командой запускать?

                                                        Проще надо относиться к критике, а не грубить, стараясь показать свою самодостаточность.
                                                          0
                                                          Ubuntu 10.04 RC
                                                          /home/user/screen.sh
                                                          Я вам не грубил, а в шутку намекнул))
                                                            0
                                                            в файл ~/.bashrc
                                                            добавляем
                                                            PATH=$PATH:/home/sattellite/
                                                            export PATH
                                                            • UFO just landed and posted this here
                                                                0
                                                                Ну я тоже так делаю) Просто я предложил как именно домашний какталог добавить)
                                                        0
                                                        Ну и учимся подчищать за собой :)
                                                        rm -Rf /tmp/screen.png
                                                          0
                                                          Ненужно, по дефолту /tmp сам clean`тся
                                                            0
                                                            1. Не во всех дистрах.
                                                            2. Обычно это во время (пере)загрузки (а если ты комп не вырубаешь неделями?).
                                                            3. Убирать за собой это считается хорошим тоном, не только для человека, но и для программы.
                                                              0
                                                              1. Не во всех дистрах.

                                                              Можно пример? (тем кто это отключил ССЗБ)

                                                              2. Обычно это во время (пере)загрузки (а если ты комп не вырубаешь неделями?).

                                                              И сколько Вы сделаете screen`ов за это время? Неужели все свободное место на разделе с /tmp закончится из-за десятка screen`ов по ~200kb (при условии что Вы не адский QA :) )?

                                                              3. Убирать за собой это считается хорошим тоном, не только для человека, но и для программы.

                                                              Здесь нечего возразить. Идея правильная, случается ли так всегда — другой вопрос.

                                                              У меня уже очень долго используется следующая «схема»

                                                              vv@crusader ~ $ ls -l trash
                                                              lrwxrwxrwx 1 vv vv 4 лис 15 11:20 trash -> /tmp
                                                              vv@crusader ~ $ cat /usr/local/bin/make_screen 
                                                              #!/bin/sh
                                                              
                                                              # some thing copied from here
                                                              #http://forums.freebsd.org/archive/index.php/t-737.html
                                                              
                                                              DATE=$( date -u +%Y.%m.%d_%H-%M-%S ) 
                                                              DIR=/tmp
                                                              FILE=$DIR/"screenshot_"$DATE"UTC.png"
                                                              
                                                              imlib2_grab $FILE
                                                              
                                                              vv@crusader ~ $ 
                                                              


                                                              Никогда проблем не было
                                                                0
                                                                1. Сходу не приведу… Но точно помню, что у меня на слаке (года два ее уже не юзаю) /tmp не чистился автоматом (из коробки), настраивал сам. Какая слака была уже не вспомню. Но и в других наверняка тоже быть может такое. В генту вроде тоже из коробки не чистится (ручаться не могу, т.к. не юзал). Я понимаю, что этого меньшинство, но все же…

                                                                2. Спору нет. Но прикинь, заскринил ты переписку с девчонкой какой-нить, а потом твоя этот скрин увидит… Каково будет? (допустим, она IT'шник / просто любопытная / случайно)

                                                                В общем, все сказанное тут и комментом выше мое ИМХО и склонял я все к п.3.
                                                          +1
                                                          Немного переделал под себя скрипт для хаброэффекта. Может кому понравится:
                                                          #!/bin/bash
                                                          
                                                          trap "_exit" INT KILL TERM QUIT
                                                          _exit() {
                                                          	rm -f $SCREEN_FILE
                                                          	exit
                                                          }
                                                          
                                                          FINISH=""
                                                          LOG_FILE='/var/log/screenshots.log'
                                                          SCREEN_FILE="$(mktemp -q -t screenshot_XXXXXXXXXXXXXXXXXX).png"
                                                          
                                                          scrot $1 $SCREEN_FILE
                                                          [ $? -ne 0 ] && FINISH="[ FAIL ]"
                                                          
                                                          LOG_STR=$( curl -s -F "upload=yes" -F "file=@$SCREEN_FILE" -L http://habreffect.ru/upload.php |\
                                                           sed -ne '/original-link\|delete/s/^.*\(http.\+\)".*$/\1/gp' | tr '\n' ' ' |\
                                                           sed -e "s/'\ $/\ \]\n/;s/[\ \t]/\t\[del: /;s/^/$(date '+%x %R')\t/" |\
                                                           tee -ai $LOG_FILE | awk '{print $3}' )
                                                          [ $? -ne 0 ] && FINISH="[ FAIL ]"
                                                          
                                                          echo $LOG_STR | xsel -b -i
                                                          
                                                          notify-send -t 5000 -i dialog-information "$FINISH Скриншот загружен"\
                                                           "<a href=\"$LOG_STR\">Посмотреть...</a>"
                                                          
                                                          _exit
                                                          


                                                          Что тут другого?
                                                          1. Удаляет файл скриншота, т.е. чистит за собой.
                                                          2. В лог пишет дату и время создания скрина, урл скрина и урл для удаления скрина с хаброэффекта (мне так как-то спокойнее).
                                                          3. Уведомление о загрузке содержит ссылку, которая откроет скрин в браузере по дефолту, а если была ошибка, напишет в заголовке [ FAIL ].
                                                          4. Можно передать любую опцию scrot'а (например, "-s" будет ждать, пока ты выделишь кусок экрана и потом его заскринет).
                                                            0
                                                            У меня почему то не работает.

                                                            На выходе отдаёт лишь новую строку…
                                                              0
                                                              Сбросьте мне в личку, чтобы тут не захломлять, гляну:
                                                              $ bash -x /path/to/script.sh
                                                              
                                                                0
                                                                А… Туплю. У вас скорее всего нет файла /var/log/screenshots.log, а в /var/log/ юзер писать не может, поэтому скрипт не может создать этот файл. Поэтому надо вначале создать этот файл (сорри, заблыл):
                                                                $ sudo touch /var/log/screenshots.log
                                                                $ sudo chmod 777 /var/log/screenshots.log
                                                                
                                                                  0
                                                                  $ sudo chmod 666 /var/log/screenshots.log

                                                                  Однако…
                                                                    0
                                                                    Ах, да. Ступил я :) Спасибо, что поправили.
                                                              0
                                                              $ ~/screen.sh
                                                              sed: -e expression #1, char 45: unknown option to `s'

                                                              не заработало
                                                                +1
                                                                Для проверки скопипастил его себе, все работает.

                                                                У вас какой sed?
                                                                $ sed --version
                                                                GNU sed версия 4.2.1
                                                                  0
                                                                  странно, версия аналогичная:
                                                                  $ sed --version
                                                                  GNU sed version 4.2.1
                                                                    +1
                                                                    Да, все верно, это тут не причем. Благодаря багрепорту от Screatch понял в чем дело…
                                                                    У вас просто локальная дата отображается как «04/28/2010», из-за чего sed и ругается.

                                                                    Замените в строке 18 строку
                                                                    date '+%x %R'
                                                                    на
                                                                    date '+%d.%m.%Y %H:%M'
                                                                      +1
                                                                      Спасибо, помогло
                                                              0
                                                              а какие ещё фришные фото- и вообще файлохостинги имеют API для закачки изображений/файлов?
                                                                0
                                                                В принципе любые. Тут не используется апи, как таковое, тут юзается curl, который является, как бы, консольным браузером.
                                                                0
                                                                Для снятия скриншотов меня полностью устраивает клавиша PrintScreen и запущенная Picasa. Лучше и не придумаешь.
                                                                  0
                                                                  А автору не кажется, что уж сильно широкое окно для принтскрина? Может нужно с кнопочками внизу как-то иначе сделать?
                                                                    0
                                                                    А что вы предлагаете? и как вам мешает размер?
                                                                    –1
                                                                    sudo apt-get install shutter
                                                                    1. Живет в области уведомлений и перехватывает PrtSc, Shift+PrtScr
                                                                    2. Можно по щелчку на иконке выбрать область захвата: окно, экран, выбранная область
                                                                    3. Есть возможность обработки изображения (яркость, контраст, обрезка итд..) благодаря предустановленным плагинам
                                                                    4. Возможность экспорта на сервисы типа imageshack (и включая его)
                                                                    5. Скорость работы(реакции), удобство и простота в использовании.

                                                                    Only users with full accounts can post comments. Log in, please.