Unix-way → Создаем QR code в LINUX (bash скрипт)

Здрасти всем! Возможно вы уже видели эти черно-белые изображение раньше, которые можно читать через смартфон. Хочу представить простой GUI скрипт для того чтобы создавать этот самый QR code.

Ссылка на статью из wikipedia QR code

Немного отойду от темы по поводу консоли. Многие говорят «За чем мне консоль?» и таму подобное, этот скрипт так же наглядно покажет эти ваши GUI и то же самое, но из консоли. Потом скажите что проще? Ок? Поехали…

QR code в LINUX (bash — консоль)

Для создания QR есть пакет под названием qrencode он нам и поможет. Сначала его нужно установить

$ sudo apt-get install qrencode

Потом выполнить команду для создания QR изображения

$ qrencode -s 5 -o ~/filename.png "bla-bla-bla"

Где:
-s 5 — «5» это размер пикселя, чем он больше, тем больше изображение
~/filename.png — путь куда сохранять
bla-bla-bla — контент, который мы хотим зашифровать в QR code

Получаем вот такую картинку


Не правда ли все просто?

QR code в LINUX (bash — скрипт)

1. создаем файл qr.sh
2. даем права на исполнение
$ chmod +x qr.sh

Или ставим галку: правой кнопкой мыши на qr.sh ->> свойства ->> вкладка права ->> позволять выполнять файл как программу

3. Открываем файл блокнотом (текстовым редактором)
4. Вставляем код и сохраняем
Показать код
#!/bin/bash

# проверяем есть ли пакет qrencode, если есть, продолжаем...
if [ -f /usr/bin/qrencode ] ; then

	# берем переменную path (путь).
	path=`zenity --entry --title="Куда сохранять?" --text="Куда сохранять QR CODE?  По умолчанию "$HOME", или напишите свой путь."`
		# проверяем, если ответ = 0 (ок) выполняем...
		if [ $? = 0 ];then
			# проверяем, если не заполненно поле, то вписываем переменную $HOME - /home/ваш_пользователь.
			if [ -z $path ];then
			path="$HOME"
			fi
		# иначе вырубаем скрипт, и информируем в консоль об отмене.
		else
			echo "Отмена"
			exit 1
		fi

	# берем переменную name (имя).
	name=`zenity --entry --title="Имя файла?" --text="Введите имя нового QR, по умолчанию: filename"`
		# проверяем, если ответ = 0 (ок) выполняем...
		if [ $? = 0 ];then
			# проверяем, если имя не заполненно, передаем переменной "name" дефолтное имя "filename".
			if [ -z $name ];then
			name="filename"
			fi
		# иначе вырубаем скрипт, и информируем в консоль об отмене.
		else
			echo "Отмена"
			exit 1
		fi

	# берем переменную width (длинна, размер).
	width=`zenity --entry --title="Какой размер?" --text="Введите размер пикселя для нового QR, по умолчанию = 3."`
		# проверяем, если ответ = 0 (ок) выполняем...
		if [ $? = 0 ];then
			# проверяем, если размер не заполнен, передаем переменной "width" дефолтный размер = 3.
			if [ -z $width ];then
			width=3
			fi
		# иначе вырубаем скрипт, и информируем в консоль об отмене.
		else
			echo "Отмена"
			exit 1
		fi

	# берем переменную content (текст который преобразовываем в QR).
	content=`zenity --entry --title="Контент" --text="Введите текст, который хотите преобразовать в QR"`
		# проверяем, если ответ = 0 (ок) выполняем преобразование...
		if [ $? = 0 ];then
				# проверяем, если не заполненно вырубаем скрипт.
				if [ -z $content ];then
					echo "Отмена"
					exit 1
				fi

			# выполняем преобразования в QR командой: qrencode -s "$размер" -o "$путь"/"$имя".png "$текст".
			qrencode -s "$width" -o "$path"/"$name".png "$content"

			# информируем в консоль и через GUI окно о завершении преобразования.
			echo "Сохроненно в $path, имя нового QR: $name.png"
			zenity --info --window-icon='info' --title="Завершено!" --text="Сохроненно в $path, имя нового QR: $name.png"
		# иначе вырубаем скрипт, и информируем в консоль об отмене.
		else
			echo "Отмена"
			exit 1
		fi

# если файла /usr/bin/qrencode нет (пакет qrencode не установлен), устанавливаем.
else
	# включаем прогресс бар
	(
        echo "10" ; sleep 1
	echo "50" ; sleep 1
	# устанавливаем пакет qrencode, если установка с su не будет работать (*ubuntu) меняем gksu на gksudo.
        gksu 'apt-get install qrencode -y' ; sleep 1
        echo "100" ;
        ) |
        zenity --progress \
          --title="Установка" \
          --text="Установка пакета qrencode..." \
          --percentage=0

	# информируем в консоль и через GUI окно о завершении установки.
	echo "Установка завершена, перезапустите скрипт."
	zenity --info --window-icon='info' --title="Установка завершена!" --text="Установка завершена, перезапустите скрипт."
fi


5. запускаем скрипт: два щелчка на файле qr.sh ->> запустить, далее следуем инструкции. При первом запуске будет установлен пакет qrencode для преобразования текста в QR code.

Cкриншоты под спойлером








На этом все!

Каждое действие в скрипте прокомментировано, ну что проще и быстрей?

P.S. Как всегда экспериментирую, пинки и критика приветствуется! Чуть не забыл, вот сервис для считывания QR из изображени, а это считывает QR при помощи веб-камеры.
  • avatar
  • itshnic
  • 5288
  • +25
  • 04 апреля 2011, 17:39

Комментариум (29)

RSS свернуть / развернуть
+
+5
avatar

terra

  • 04 апреля 2011, 17:55

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Зачетно, даже не знал, что это за «квадратики с мусором»
Однако почему не применил zenity --file-selection? Так-же проще выбирать папку да и диалог один вместо двух.

path="$(zenity --file-selection --title="Выберите папку и введите имя файла").png"
[ "$path" = ".png" ] && path="~/filename.png"
+
+4
avatar

itshnic

  • 04 апреля 2011, 18:10

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо! Завтра сделаю с --file-selection! А почему, просто экспериментирую ))
+
+4
avatar

makenskiy

  • 04 апреля 2011, 19:55

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Гуд, спасибо :) Я как-то этими QR баловался, только делал через расширение для хрома
+
+4
avatar

terra

  • 04 апреля 2011, 20:38

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
А я за пару часов уже уморил смарт с андроидом, все штрих и QR коды, найденные в доме и в тырнете прочитал:))
+
+4
avatar

makenskiy

  • 04 апреля 2011, 20:45

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Хе-хе :) А штрихи чем читал? У меня где-то была «таблица товароведа» я как то по ней давно переводил как ископаемое :p
+
+5
avatar

terra

  • 04 апреля 2011, 21:25

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Поставил сразу три проги QR-Droid, NeoReader и Barcode Scaner. Все они читают и штрихи и QR, но больше понравилась NeoReader, QR налету читает, даже прицеливаться не надо, тока покажи хоть на горизонте:)!
+
+4
avatar

makenskiy

  • 04 апреля 2011, 21:30

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо на заметку
+
+4
avatar

pashtuun

  • 04 апреля 2011, 23:57

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо! И отдельное спасибо за комментарии в скрипте!
+
+4
avatar

terra

  • 05 апреля 2011, 20:27

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Нашел практическое применение этому скрипту — быстро перекидывать небольшие тексты (смс-ки) с компа на смартфон:))) Правда немного упростил скриптик;)
#!/bin/bash

# проверяем есть ли пакет qrencode, если нет устанавливаем...
[ ! -f /usr/bin/qrencode ] && gksu 'apt-get install qrencode -y'

#  Запрашиваем путь
path="$(zenity --file-selection --title="Выберите папку и введите имя файла").png"
[ "$path" = ".png" ] && path="/tmp/tmp.png"

# Запрашиваем размер ячейки
width=$(zenity --scale --min-value "1" --max-value "10" --step "1" --title "Размер \"пикселя\"?" --text "Введите размер пикселя для нового QR" --value "3")
[ $? = 0 ] || exit 1

# Запрашиваем контент
content="$(zenity --entry --entry-text="`cat /etc/issue`" --title="Контент" --text="Введите текст, который нужно перекодировать в QR")"

# Если все "ОК", выполняем преобразование...
if [ $? = 0 ];then
	# проверяем, если контент пустой вырубаем скрипт.
    [ -z "$content" ] && exit 1
    # выполняем преобразования в QR командой: qrencode -s "размер" -o "путь" "текст"
    qrencode -s "$width" -o "$path" "$content"

    # выводим информацию о завершении преобразования.
    mes="Файл \"$path\" сохранен."
    echo "$mes"
    zenity --info --window-icon='info' --title='Завершено!' --text="$mes" --timeout=5 &
    
    # Натравливаем джимп на образованный рисунок
    [ -f /usr/bin/gimp ] && gimp "$path" &

# иначе вырубаем скрипт, и информируем в консоль об отмене.
else
	echo "Отмена"
    exit 1
fi
+
+5
avatar

Anonymous

  • 07 апреля 2011, 22:53

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Так можно?
[ -f /usr/bin/qrencode ] || gksu 'apt-get install qrencode -y'

Дайте ссылку где написано про "!". Почему он так меняет скрипт?
+
+5
avatar

Anonymous

  • 07 апреля 2011, 22:55

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
И зачем ставить слеши Файл \"$path\" сохранен
+
+5
avatar

terra

  • 07 апреля 2011, 23:23

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Восклицательный знак означает отрицание, т.е.:
[ -f /usr/bin/opera ] - истина если файл существует
[ ! -f /usr/bin/opera ] - истина если файл НЕ сущеcтвует!

[ -f /usr/bin/qrencode ] || gksu 'apt-get install qrencode -y'
и
[ ! -f /usr/bin/qrencode ] && gksu 'apt-get install qrencode -y'
работают абсолютно идентично просто второй вариант более логично-читаемый.

Слеши \"$path\" нужны, чтобы экранировать символы кавычек (") от парсинга, т.е. чтобы они присутствовали в выводимом тексте! Т.е. надпись в окне будет такой:
Файл "/tmp/tmp.png" сохранен.
а если слеши не ставить будет так:
Файл /tmp/tmp.png сохранен.
+
+5
avatar

Anonymous

  • 07 апреля 2011, 23:31

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Ничего себе как быстро спасибо все понятно! Пользуясь случаем можно еще вопрос?

Почему вы пишите

переменная=$(zenity.............)

а ТС пишет

переменная=`zenity..............`

В чем различие?
+
+5
avatar

dnsi

  • 08 апреля 2011, 00:17

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
x=`команда` и x=$(команда) делают одно и то же. ИМХО вариант с $() более читаемый.
+
+5
avatar

terra

  • 08 апреля 2011, 00:51

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Выражение заключенное в косые одинарные кавычки (`) вычисляется в первую очередь и результат работы этого выражения подставляется в команду, яркий пример использования:
sudo apt-get install linux-headers-`uname -r`
здесь команда uname -r возвращает версию ядра, которая образует полное имя пакета для установки!!!
$() — скорее приведение типов, хотя типизация переменных в баше крайне путана и туманна;))
+
+4
avatar

pashtuun

  • 10 апреля 2011, 10:34

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо вам за ответы! Мне тоже некоторые моменты не понятны. Понял одно скриптовый язык он гибкий можно так сяк с одним и тем же результатом
+
+6
avatar

terra

  • 05 апреля 2011, 23:08

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Еще одна вариация на ту-же тему!
Скрипт читает текст из первичного буфера обмена(того, что принимает непосредственно выделяемый текст и вставляет его кликом по средней кл.мыши) преобразует его в QR и выводит на экран без лишних вопросов.
Подвесив его на хоткей(я выбрал F12), получение QR-кода на экране сводится к выделению нужного текста и нажатию на хоткей;)

#!/bin/bash

# проверяем есть ли пакет qrencode и xclip, если нет устанавливаем...
[ ! -f /usr/bin/qrencode ] && gksu 'apt-get install qrencode -y'
[ ! -f /usr/bin/xclip ] && gksu 'apt-get install xclip -y'

# путь к временному файлу
path="/tmp/tmp.png"

# Считываем контент из первичного буфера
content="`xclip -o`"

# проверяеми контент на пустоту.
[ -z "$content" ] && exit 1

# проверяем длину стринга
STRMAX=1023
StrLen=$(expr length "$content")
if [ "$StrLen" -gt "$STRMAX" ]; then
	content=$(echo "$content"|head -c $STRMAX)
	echo "$titl" "$content"
	titl="Ограничение в "$STRMAX" символов, укорачиваю:"
	zenity --info --title="$titl" --text="$content" --timeout=10
fi

# выполняем перекодирование
qrencode -s "3" -o "$path" "$content"

# Открываем "гномьим глазом" образованный рисунок
[ -f /usr/bin/eog ] && eog "$path" &


Ввел ограничение на 1023 символа, большее количество мой смарт выводит в виде крякозабров:((
+
+4
avatar

makenskiy

  • 06 апреля 2011, 17:01

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Прикольно, спасибо сохранил :)
+
+4
avatar

pashtuun

  • 07 апреля 2011, 14:49

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо!
+
+5
avatar

dnsi

  • 08 апреля 2011, 00:39

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Кстати, вместо «гномьего глаза» можно использовать предпочитаемое пользователем (user preferred) приложение, воспользовавшись командой xdg-open, кончно же только если она имеется в системе.
# Открываем "предпочитаемым приложением" образованный рисунок
xdg-open "$path"
+
+5
avatar

dnsi

  • 08 апреля 2011, 00:41

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
забыл вставить проверку на существование xdg-open
[ -f /usr/bin/xdg-open ] && xdg-open "$path"
+
+6
avatar

terra

  • 08 апреля 2011, 01:57

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Да, xdg-open будет правильней!
+
-2
avatar

bill_god

  • 09 апреля 2011, 00:07

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
очередной велосипед пингвина! нафига?! это уже сто раз придумали… или у вас мания к велосипедам?
+
+3
avatar

raxp

  • 09 апреля 2011, 16:32

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
«Мы создадим новую оболочку для MS-DOS и назовем ее Windows.»
«Мы создадим новый браузер, и назовем его Internet Explorer.»
«Мы сделаем Windows операционной системой.»
«Мы создадим новый медиаплеер и назовем его Windows Media.»
«Мы признаем свою ошибку при создании Windows 95/98/ME. Поэтому мы создаем новую ОС Windows 2000, она будет совмещать безопасность NT и дружелюбность 9x»
«Стандартные средства программирования не удовлетворяют нашим требованиям. Мы создадим .NET»
«Мы внедряем в XP систему активации, надо бороться с пиратством.»
«Мы создадим новый сервис Live.»
«Мы решили, что Longhorn не удовлетворяет нашим требованиям. Поэтому мы переделываем его в висту.»
«Надо бороться с пиратством среди компьютерных игр. Мы создадим Games For Windows Live»
«Vista не оправдала наших ожиданий. Мы выпускаем Windows 7, только она будет оптимизированной вистой.»
«Аудитория Live Search слишком низкая. Мы создадим Bing.»
«Windows Mobile отжила свое. Мы создадим Windows Phone.»
«Flash отжил свое. Мы создадим Silverlight.»

Так кто у нас главный по велосипедам? :)
+
-4
avatar

bill_god

  • 09 апреля 2011, 23:16

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
+
+4
avatar

pashtuun

  • 10 апреля 2011, 10:31

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Сам хоть что нибудь сделал для людей в этом мире? Дай ссылки
+
+4
avatar

raxp

  • 10 апреля 2011, 12:03

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Ну то тысячи-миллионы чудаков.
Другое дело — один (Балмер не в счет).
+
+1
avatar

itshnic

  • 11 апреля 2011, 20:21

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Как удачно подметили, выложи что сделал ты
+
+1
avatar

Anonymous

  • 25 июля 2011, 20:42

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/makenskiy/www/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Много интересной инфы о QR кодах можно почитать здесь: http://www.qrcode.by

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.