From 3fd647846b1cfcb3c78ce8514590a38d640feac1 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 12 Dec 2020 21:43:28 +0100 Subject: [PATCH] Added textcommand which lets you send anything via CLI you would otherwise say to Alexa --- README.md | 162 +++++++++++++++++----------------- alexa_remote_control.sh | 14 ++- alexa_remote_control_plain.sh | 16 ++-- 3 files changed, 104 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 12e0d7d..3726bbe 100755 --- a/README.md +++ b/README.md @@ -1,80 +1,82 @@ - -# alexa-remote-control -control Amazon Alexa from command Line - -The settings can now be controlled via environment variables. -``` -EMAIL - your login email -PASSWORD - your login password -BROWSER - the User-Agent your browser sends in the request header -LANGUAGE - the Accept-Language your browser sends in the request header -AMAZON - your Amazon domain -ALEXA - the URL you would use for the Alexa Web App -CURL - location of your cURL binary -OPTS - any cURL options you require -TMP - location of the temp dir -OATHTOOL - command line for oathtool MFA -MFA_SECRET- the MFA secret -SPEAKVOL - the volume for speak messages ( if set to 0, volume levels are left untouched) -NORMALVOL - if no current playing volume can be determined, fall back to normal volume -VOLMAXAGE - max. age in minutes before volume is re-read from API -DEVICEVOLNAME - a list of device names with specific volume settings (space separated) -DEVICEVOLSPEAK - a list of speak volume levels - matching the devices above -DEVICEVOLNORMAL - a list of normal volume levels- matching the devices above - (current playing volume takes precedence for normal volume) -USE_ANNOUNCEMENT_FOR_SPEAK - Announcements can be made to multiple devices, while - regular SPEAK cannot but the announcement feature has - to be turned on for those devices. Also supports SSML! -``` -You will very likely want to set the language to: -``` -export LANGUAGE='de,en-US;q=0.7,en;q=0.3' -``` - -``` -alexa-remote-control [-d |ALL] -e > | - -b [list|<"AA:BB:CC:DD:EE:FF">] | -q | -n | -r <"station name"|stationid> | - -s | -t | -u | -v | - -w | -i | -p | -P | -S | -a | -z | -l | -h | - -m [device_1 .. device_X] | -lastalexa | -lastcommand - - -e : run command, additional SEQUENCECMDs: - weather,traffic,flashbriefing,goodmorning,singasong,tellstory, - speak:'',automation:',sound:' - -b : connect/disconnect/list bluetooth device - -q : query queue - -n : query notifications - -r : play tunein radio - -s : play library track/library album - -t : play Prime playlist - -u : play Prime station - -v : play Prime historical queue - -w : play library playlist - -i : list imported library tracks - -p : list purchased library tracks - -P : list Prime playlists - -S : list Prime stations - -a : list available devices - -m : delete multiroom and/or create new multiroom containing devices - -lastalexa : print device that received the last voice command - -lastcommand : print last voice command or last voice command of specific device - -login : Logs in, without further command (downloads cookie) - -z : print current volume level - -l : logoff - -h : help -``` - -There's also a "plain" version, which lacks some functionality (-z, -i, -p, -P, -S and no radio station names and no routines) but doesn't require 'jq' for JSON processing. - -In order to use MFA, one needs to obtain the MFA_SECRET from Amazon account: -1. You should have MFA using an App already working before proceeding -1. Add a new app -1. When presented with the QR-code select "can't scan code" -1. You will be presented with the MFA shared secret, something like `1234 5678 9ABC DEFG HIJK LMNO PQRS TUVW XYZ0 1234 5678 9ABC DEFG` -1. Now you have to generate a valid response code via `oathtool -b --totp ""` and enter that in the web form -1. Going from here the MFA shared secret becomes the MFA_SECRET for the alexa_remote_control script -*Treat that MFA_SCECRET just like your password - DO NOT share it anywhere!!!* - -It is assumed that MFA secured accounts are less likely to get a captcha response during login - that's why MFA might yield better results if the plain username/password didn't work for you. - -http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html + +# alexa-remote-control +control Amazon Alexa from command Line + +The settings can now be controlled via environment variables. +``` +EMAIL - your login email +PASSWORD - your login password +BROWSER - the User-Agent your browser sends in the request header +LANGUAGE - the Accept-Language your browser sends in the request header +AMAZON - your Amazon domain +ALEXA - the URL you would use for the Alexa Web App +CURL - location of your cURL binary +OPTS - any cURL options you require +TMP - location of the temp dir +OATHTOOL - command line for oathtool MFA +MFA_SECRET- the MFA secret +SPEAKVOL - the volume for speak messages ( if set to 0, volume levels are left untouched) +NORMALVOL - if no current playing volume can be determined, fall back to normal volume +VOLMAXAGE - max. age in minutes before volume is re-read from API +DEVICEVOLNAME - a list of device names with specific volume settings (space separated) +DEVICEVOLSPEAK - a list of speak volume levels - matching the devices above +DEVICEVOLNORMAL - a list of normal volume levels- matching the devices above + (current playing volume takes precedence for normal volume) +USE_ANNOUNCEMENT_FOR_SPEAK - Announcements can be made to multiple devices, while + regular SPEAK cannot but the announcement feature has + to be turned on for those devices. Also supports SSML! +``` +You will very likely want to set the language to: +``` +export LANGUAGE='de,en-US;q=0.7,en;q=0.3' +``` + +``` +alexa-remote-control [-d |ALL] -e > | + -b [list|<"AA:BB:CC:DD:EE:FF">] | -q | -n | -r <"station name"|stationid> | + -s | -t | -u | -v | + -w | -i | -p | -P | -S | -a | -z | -l | -h | + -m [device_1 .. device_X] | -lastalexa | -lastcommand + + -e : run command, additional SEQUENCECMDs: + weather,traffic,flashbriefing,goodmorning,singasong,tellstory, + speak:'',automation:'',sound:, + textcommand:'' + + -b : connect/disconnect/list bluetooth device + -q : query queue + -n : query notifications + -r : play tunein radio + -s : play library track/library album + -t : play Prime playlist + -u : play Prime station + -v : play Prime historical queue + -w : play library playlist + -i : list imported library tracks + -p : list purchased library tracks + -P : list Prime playlists + -S : list Prime stations + -a : list available devices + -m : delete multiroom and/or create new multiroom containing devices + -lastalexa : print device that received the last voice command + -lastcommand : print last voice command or last voice command of specific device + -login : Logs in, without further command (downloads cookie) + -z : print current volume level + -l : logoff + -h : help +``` + +There's also a "plain" version, which lacks some functionality (-z, -i, -p, -P, -S and no radio station names and no routines) but doesn't require 'jq' for JSON processing. + +In order to use MFA, one needs to obtain the MFA_SECRET from Amazon account: +1. You should have MFA using an App already working before proceeding +1. Add a new app +1. When presented with the QR-code select "can't scan code" +1. You will be presented with the MFA shared secret, something like `1234 5678 9ABC DEFG HIJK LMNO PQRS TUVW XYZ0 1234 5678 9ABC DEFG` +1. Now you have to generate a valid response code via `oathtool -b --totp ""` and enter that in the web form +1. Going from here the MFA shared secret becomes the MFA_SECRET for the alexa_remote_control script +*Treat that MFA_SCECRET just like your password - DO NOT share it anywhere!!!* + +It is assumed that MFA secured accounts are less likely to get a captcha response during login - that's why MFA might yield better results if the plain username/password didn't work for you. + +http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html diff --git a/alexa_remote_control.sh b/alexa_remote_control.sh index 87ef12f..0ab73ed 100755 --- a/alexa_remote_control.sh +++ b/alexa_remote_control.sh @@ -57,6 +57,8 @@ # 2020-06-15: v0.16b added "lastcommand" option # (thanks to Trinitus01 https://github.com/trinitus01) # 2020-07-07: v0.16c fixed NORMALVOL if USE_ANNOUNCEMENT_FOR_SPEAK is set +# 2020-12-12: v0.17 added textcommand which lets you send anything via CLI you would otherwise say to Alexa +# ( https://github.com/thorsten-gehrig/alexa-remote-control/issues/108 ) # ### # @@ -186,7 +188,8 @@ usage() echo echo " -e : run command, additional SEQUENCECMDs:" echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory," - echo " speak:'',automation:'',sound:" + echo " speak:'',automation:'',sound:," + echo " textcommand:''" echo " -b : connect/disconnect/list bluetooth device" echo " -q : query queue" echo " -n : query notifications" @@ -213,7 +216,7 @@ usage() while [ "$#" -gt 0 ] ; do case "$1" in --version) - echo "v0.16a" + echo "v0.17" exit 0 ;; -d) @@ -410,6 +413,11 @@ case "$COMMAND" in exit 1 fi ;; + textcommand:*) + SEQUENCECMD='Alexa.TextCommand\",\"skillId\":\"amzn1.ask.1p.tellalexa' + SEQUENCEVAL=$(echo ${COMMAND##textcommand:} | sed -r s/\"/\'/g) + SEQUENCEVAL=',\"text\":\"'${SEQUENCEVAL}'\"' + ;; speak:*) TTS=$(echo ${COMMAND##speak:} | sed -r s/\"/\'/g) if [ $USE_ANNOUNCEMENT_FOR_SPEAK -gt 0 ] ; then @@ -650,7 +658,7 @@ if [ -n "${SEQUENCECMD}" ] ; then ALEXACMD='{"behaviorId":"'${AUTOMATION}'","sequenceJson":"'${SEQUENCE}'","status":"ENABLED"}' else # SequenceCommands are generally not supported on WHA devices - if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|sound" ; then + if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|sound|textcommand" ; then if [ "${DEVICEFAMILY}" = "WHA" ] ; then echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}" return diff --git a/alexa_remote_control_plain.sh b/alexa_remote_control_plain.sh index 790c316..8876a14 100755 --- a/alexa_remote_control_plain.sh +++ b/alexa_remote_control_plain.sh @@ -3,7 +3,7 @@ # Amazon Alexa Remote Control (PLAIN shell) # alex(at)loetzimmer.de # -# 2020-07-07: v0.16c (for updates see http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html) +# 2020-12-12: v0.17 (for updates see http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html) # ### # @@ -57,7 +57,7 @@ SET_SPEAKVOL="0" SET_NORMALVOL="10" # Device specific volumes (overriding the above) -SET_DEVICEVOLNAME="EchoDot2ndGen Echo1stGen" +SET_DEVICEVOLNAME="EchoDot2ndGen Echo1stGen" SET_DEVICEVOLSPEAK="100 30" SET_DEVICEVOLNORMAL="100 20" @@ -121,7 +121,8 @@ usage() echo echo " -e : run command, additional SEQUENCECMDs:" echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory," - echo " speak:''sound:" + echo " speak:'',sound:," + echo " textcommand:''" echo " -b : connect/disconnect/list bluetooth device" echo " -q : query queue" echo " -n : query notifications" @@ -142,7 +143,7 @@ usage() while [ "$#" -gt 0 ] ; do case "$1" in --version) - echo "v0.16a" + echo "v0.17" exit 0 ;; -d) @@ -321,6 +322,11 @@ case "$COMMAND" in exit 1 fi ;; + textcommand:*) + SEQUENCECMD='Alexa.TextCommand\",\"skillId\":\"amzn1.ask.1p.tellalexa' + SEQUENCEVAL=$(echo ${COMMAND##textcommand:} | sed -r s/\"/\'/g) + SEQUENCEVAL=',\"text\":\"'${SEQUENCEVAL}'\"' + ;; speak:*) TTS=$(echo ${COMMAND##*:} | sed -r 's/["\\]/ /g') TTS=',\"textToSpeak\":\"'${TTS}'\"' @@ -625,7 +631,7 @@ set_var() run_cmd() { if [ -n "${SEQUENCECMD}" ] ; then - if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|speak|sound" ; then + if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|speak|sound|textcommand" ; then if [ "${DEVICEFAMILY}" = "WHA" ] ; then echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}" return