Охуенный блять совет в консоли!

Увидел сегодня в твиттере что у сайта охуенный блять совет появилось приложение для iphone/ipad/android. Полез посмотреть, а там и скрипт на bash.
Но он мне ужасно не понравился, ибо использует lynx (которого у меня в системе нет) и парсящий целых 2 страницы сайта. Такой достаточно многословный скрипт, в общем по заветам KISS решил упростить.
В итоге получился простой однострочник получающий рандомный совет
echo -e `curl -s  http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'
Теперь я это в своем zsh вместо фортунок пользую!
В баше может не работать =)

UP и правда в баше не работало, пофиксил. теперь и в bash и в zsh работает

UP2 если у кого-то возникают проблемы и вместо руских букв видны странные последовательности, то можно использовать такой код
/usr/bin/printf "$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` | sed 's/\ / /g')"\\n 

UP3 Нелюбители курла могут заменить curl -s на wget -q -O -
muhas 11-04-2011
выяснилось что скрипт на баше парсящий 2страницы писался ещё до того как на сайте появилось api
http://pastebin.com/L1Va4Fyx - тот же самый скрипт без апилок парсящий две страницы, но в одну строку и без lynx
Livid 11-04-2011
На правах примера как это сделать более канонiчно (в данном случае в смысле "честного" разбора json):
curl -s http://fucking-great-advice.ru/api/random | perl -MHTML::Entities -MJSON::PP -CSDL -lne '$VAR1=decode_json($_); decode_entities($VAR1->{"text"}); print($VAR1->{"text"})'
Алекс 11-04-2011
А там не появится совета вида $'; rm -rf / ? :-)
Anonymous 11-04-2011
в седозамене флага g не хватает
landgraf 11-04-2011
выводит строку вида
\u0414\u0443\u043c\u0430\u0439 \u0431\u043b\u044f\u0442\u044c \u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u0445!

bash, ru_RU.UTF-8
dr4g0n 11-04-2011
Кр. — сес. тал., бл!
Не лезь блять с советом!
2 совета вышли так, остальные нормально, спасибо!
muhas 11-04-2011
@Livid Ъ, только в каком перломодуле JSON/PP.pm? без него ни как? а то я из-за lynx взялся переделать, а тут неведомые мне перломодули

@Алекс да даже и появится, всё-равно не исполняется а только выводится

@Anonymous, ох да... горе мне горе

@landgraf bash --version
GNU bash, version 4.2.8(2)-release (i686-pc-linux-gnu)
echo -e - работает
Livid 11-04-2011
http://search.cpan.org/~makamaka/JSON-PP-2.27105/
Еще сойдет JSON::XS
http://search.cpan.org/~mlehmann/JSON-XS-2.3/
Он-то JSON и разбирает, есличо (decode_json)
Если нет, то как-то так:
curl -s http://fucking-great-advice.ru/api/random | perl -MHTML::Entities -lpe '$_=~s/.*['"'"'"]?text['"'"'"]?\s*:\s*['"'"'"]([^'"'"'"]+)['"'"'"].*/\1/; decode_entities($_)' | echo -e `cat`
Вряд ли Encode::Escape::Unicode найдется, да? Его decode можно было бы вместо echo -e...

Есть засада: если в самом тексте попадутся одинарные/двойные кавычки, то регексп сломается. Но по идее они должны быть html-escape'нутыми, так что в целом должно работать.
muhas 11-04-2011
echo -e `curl -s http://fucking-great-advice.ru/api/random | perl -MHTML::Entities -lpe '$_=~s/.*['"'"'"]?text['"'"'"]?\s*:\s*['"'"'"]([^'"'"'"]+)['"'"'"].*/\1/; decode_entities($_)'`
с таким регекспом в zsh работает, в старом баше видимо не будет ибо utf последовательность (собственно как и у меня, но без перла) - в свежих же башах будет работать

за модули спасибо
conf 11-04-2011
Если есть php, то можно так:
php -r 'echo html_entity_decode(json_decode(file_get_contents("http://fucking-great-advice.ru/api/random"))->text, null, "UTF-8") . PHP_EOL;'
pilat 11-04-2011
У меня zsh, но не работает: тупо пустая строка.

P.S.: PHP версия от conf работает.
Von 11-04-2011
Спасибо, поселил в .bashrc. :3
Von 11-04-2011
Ещё бы неплохо дописать туда sed 's/\—/—/g', тире попадаются. :)
Von 11-04-2011
Да, бложек обработал & # 151; в моём коменте совершенно правильно, как тире, лол.
muhas 11-04-2011
ещё и кавычки обработать не помешает. сейчас твой комент подредактирую
Von 11-04-2011
А имеет ли смысл на длинное тире заменять, если в терминале моноширинный шрифт всё равно?
muhas 11-04-2011
echo "—--—"(длинный короткий короткий длинный) — разница есть, а вот тут в бложике выглядит не очень.
Pavel Vyazovoi 11-05-2011
И зачем это читать? Среднестатистическая надпись на заборе и то больше смысла несет, ещё и без матов бывает.
muhas 11-05-2011
Не нравится — не читай, не заставляют же =)
а меня эти советы улыбают и радуют
rics 11-05-2011
Еще решение, без хитрых регулярок:
/usr/bin/printf "$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" {'print $8'}` | sed 's/\ / /g')"\\n
muhas 11-05-2011
годно! для тех у кого bash/zsh не свежие...
Livid 11-05-2011
Хитрые регулярки нужны чтобы извлекать не 8-й элемент с разделителем "двойные кавычки", а json-элемент "text". Потому что api может с чистой совестью поменять местами элементы или добавить что-то еще, а скрипты от этого сломаются. Правда по-хорошему регулярка не разбирает json, а просто выделяет кусок text:".*", но хоть что-то.
printf же -- это хорошая идея, мне не подумалось.

И кстати cut быстрее awk, а для данного скрипта его с лихвой.
365advices 11-05-2011
нихерасебе (8
решение всё обтачивается?
muhas 11-05-2011
@365advices это линукс, тут иожет быть милион вариантов решения одной задачи =)
вот уже и на php и на perl и смеси есть, так что каждый найдет что хочет =)
тут идея проскочила иметь возможность вообще все советы в фортунках иметь, аля http://lorquotes.ru/fortunes.php

@Livid а для обработки json в sh нету ничего? только регулярками?
Livid 11-05-2011
В sh точно ничего нету. А вообще есть конечно всякие https://github.com/micha/jsawk (который кстати использует javascript, и следовательно требует движка для оного) и подобное -- но их же ставить надо. В таких условиях проще перломодуль прикрутить и им парсить. Альтернативный вариант -- изобретать велосипед с awk и sed, но поскольку необходимость htmldecode никто не отменял, от perl или подобного все равно особо никуда не денешься -- так что и регулярку можно в нем написать, для минимизации числа пайпов. Еще один альтернативный вариант -- python/ruby/php/haskell/java. Опять же, во всех надо ставить модули поддержки, как и в perl, так что это шило на мыло. Да, в php он по умолчанию вроде ставится (хотя не факт что везде), но у кого есть php не на веб-сервере?
В итоге, либо нормальный язык с соответствующим модулем, либо регулярка в том или ином виде (perl/sed/awk), либо специально ради этого программу ставить (что немного странно). А встроенного в шелл (или приравненного) ничего нет.
pilat 11-05-2011
С /usr/bin/printf вариант тоже не работает... Опять на выходе пустая строка. Хотя если убрать awk и sed (оставить только echo и curl), то есть вывод вроде {"id":"50","text":"Работай быстро, ёбта!"}

P.S.:
GNU sed версия 4.2.1
GNU Awk 3.1.8
muhas 11-05-2011
версии такие же
echo '{"id":"50","text":"Работай быстро, ёбта!"}' | awk -F \" {'print $8'} (твой результат полученный курлом и дальше уже awk)
выдает Работай быстро, ёбта!, так что видимо у тебя awk не отрабатывает, хотя должен... странно, у тя мож там какие опции в zsh включены для обработки кавычек и слешей? ибо только в этом я вижу возможные проблемы, попробуй пайп с awk заменить на cut -d \" -f 8 (ну и со слешем поиграйся может \\")
pilat 11-05-2011
Работает, если вместо {'print $8'} набрать '{print $8}' (кстати, а почему кавычки вообще внутри скобок?
muhas 11-05-2011
а фиг знает, привычка что ли... поправил на всякий случай код в посте, мало ли...
fat763 11-05-2011
Второй вариант работает великолепно (ось Linux Mint 10).
Подскажите, как добавить в bashrc?

sudo gedit /etc/bash.bashrc
Первой строчкой добавил
alias adv="/usr/bin/printf "$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` | sed 's/\ / /g')"\\n"

После перезапуска консоли набираю adv. В ответ мне летит следующее:
u0421u043eu0445u0440u0430u043du044fu0439u0441u044f/usr/bin/printf: предупреждение: избыточные аргументы проигнорированы, начиная с `u0431u043bu044fu0442u044c'

Я грешу на ковычки. Как можно пофиксить, подскажите пожалуйста
Livid 11-05-2011
@fat763 Экранировать надо все кавычки кроме внешних. И операторы подстановки тоже. И непонятно, зачем printf и echo -e в одной команде. И вообще, проще нарисовать одинарные внешние кавычки, например так:
alias adv='/usr/bin/printf "$(curl -s http://fucking-great-advice.ru/api/random | cut -d\" -f8 | sed "s/ / /g")\n"'
Livid 11-05-2011
Только конечно же
alias adv='/usr/bin/printf "$(curl -s http://fucking-great-advice.ru/api/random | cut -d\" -f8 | sed "s/ / /g")\n"'

Парсер лох, заменил   на пробел :)
Von 11-05-2011
Вот как-то так, там ещё тире и кавычки бывают: http://vdrandom.org/_random/advice.sh
Ну и дебиан со старой убунтой учтены: никаких непонятных /u####.
Livid 11-05-2011
@Von ну зачем, зачем 4 раза вызывать sed?! Оптимизатор во мне неудержимо фалломорфирует. Можно же разделять команды точкой с запятой.
Von 11-05-2011
Это какбэ иллюстрирует моё владение седом, да. Пойду попробую разобраться.
kolebas 11-05-2011
а как бы это дело в motd присобачить?
Livid 11-05-2011
@kolebas Два варианта. Либо по крону писать вывод в /etc/motd.
Либо засунуть себе его в конец .bashrc, .zshrc или .что-то-тамrc

Скрипты в motd вроде как почти нигде не поддерживаются.
altay 11-06-2011
для тех, кому тупо впадлу ставить curl для получения охуенного блять совета:
/usr/bin/printf "$(wget -q -O - fucking-great-advice.ru/api/random | awk -F \" '{print $8}' | sed 's/\ / /g')\n"
muhas 11-07-2011
понравилось
охуенный блять совет в яндексе
Хитрый Вован 11-07-2011
echo -e `curl -s http://fucking-great-advice.ru/api/latest/5 | sed 's/},/},\\\n/g'`|cut -d'"' -f8|sed 's/\ / /g'
muhas 11-07-2011
Последние 5 советов. годно. в идеале хотелось бы все выкачать и в фортунки =)
У них кстати уже софтина написана голосом произносящая советы - сидит в трее и с заданной периодичностью или внезапностью говорит совет
Восьминог 11-07-2011
Сообщайте блять авторам старых версий скриптов.
0ff 11-08-2011
чёй то все варианты в bash на Mac OS выдают хрень типо "\u0435\u043b\u0430\u0439 \u0431\u043b\u044f\u0442\u044c"
вариант с пхп работает, прикрутил к growl по cron
Ejz 11-08-2011
Lynx нету, зато Curl установлен =) Посмеялся...
muhas 11-08-2011
зря, curl используется для разных целей, у lynx таких целей нету :(тем у кого нету курла можно wget -O - юзать, но курл как-то мне роднее...
Восьминог 11-08-2011
curl и lynx немного разные вещи, не? =))
lynx — консольный браузер, часто бывает полезным. минимум можно на удалённом серваке баш почитать ;)
muhas 11-08-2011
вот мне lynx и не нужен, поэтому и не стоит =) а курл в у меня скриптах часто используется
ntldr 11-11-2011
import json
import httplib

conn = httplib.HTTPConnection("fucking-great-advice.ru")
conn.request("GET","/api/random")
res = conn.getresponse()
if res.status == 200:
#print res.read()
advice_json = json.loads(res.read())
print advice_json['text'].replace(" ", " ").replace("", "-")
Прохожий 12-07-2012
Можно сделать так, чтобы не выводилась пустая строка при неактивном интернет-соединении?
muhas 12-07-2012
\\n в upd2 убрать, правда тогда и при активном переноса не будет =)
а так если только проверку какую написать
Прохожий 12-07-2012
Напишите проверочку, пожалуйста. Я сам не справлюсь. (:
muhas 12-07-2012
FUCKING=$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g')
if [ "$FUCKING" != "" ];then
echo "$FUCKING"
fi
как-то так
Прохожий 12-07-2012
muhas, спасибище! То что нужно.
19N4T0V 12-08-2012
Немножко модернизируем для наглядности.

1.Установим пакет cowsay.
2.Далее добавляем команду в башрц
sudo emacs /etc/bash.bashrc
# где-нибудь между комментариями вставляем строчку
alias gimmeadvice="/usr/bin/printf "$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` | sed 's/\ / /g')"\\n"
3.Сохраняем, закрываем.
//Зачем? Чтобы использовать впреть как функцию.
4.Делаем конвейер, stdout нашей gimmeadvice шлем в stdin свежеустановленной cowsay:
nya@DebianLinux:~$ gimmeadvice | cowsay -tf tux
____________________
< Верь в себя, ёбта! >
--------------------
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
5. Убедившись в работоспособности, добавляем новую комнду-конвейер в башрц как в шаге 2.
19N4T0V 12-08-2012
пардон муа, забыл про пробелы. Вот как выглядит вывод:

nya@DebianLinux:~$ advice
nya@DebianLinux:~$ advice
 ___________________________
< Не бойся блять ошибаться! >
 ---------------------------
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/
Kein 14-04-2014
Добавил в PS1
TERM=xterm-256color

function great_advice {
echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'
}

PS1='\[\e[0;32m\]\u\[\e[m\]\[\e[0;32m\]@\H\[\e[m\] \[\e[0;36m\][\t]\[\e[m\] \[\e[0;33m\]$(great_advice)\[\em\] \n\[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;37m\]'
Dexel 14-07-2014
У меня 2 совета, и всё :(
Ну что блядь за хуйня?

$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'
Найми блять фотографа!
$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'
Говори блять грамотно!
$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'

$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'

$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'

$ echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` |sed 's/\ / /g'
muhas 14-07-2014
у меня работает
Vit 14-10-2014
Да вы заебали тут писать на албанско-инопланетянском, нихуя же не понятно обычному человеку! Скажите мне лучше как вставить эти высказывания на сайт на wordpress!