Avatar

Webex alert menuDo you remember the “Alert When Available” feature in the (old) Cisco Jabber chat menu? If not, here is a quick recap. The “Alert When Available” option configured Cisco Jabber to notify you when your contacts are available (i.e., online/active). This makes it easier to know if other people are available to respond to your messages.

For some reason, this option is missing from the Webex chat menu ?. So, without getting into a Jabber vs. Webex discussion, I wondered how I can enhance the Webex user experience and add that missing functionality?

What can we do.. Let’s think… ?

  1. Does Webex expose its API?… YES!
  2. Is there an API call to check the user connection status?… YES!
  3. Can I use a CLI command to trigger an API call?… YES!

Interesting! But…

  • How can I add a new option to the Webex chat menu?
  • What about the Webex API tokens limitation?
    • The personal access token is limited to 12 hours.
    • The guest user token cannot access the “status” data as it isn’t part of the organization.
    • The integration token (OAuth grant using a web browser) isn’t applicable for a simple script.

I got it! ?

  1. True, I cannot modify the Webex chat menu… but, can AppleScript execute a CLI (cURL) command?… YES!
  2. Since a WebEx Bot is part of the organization, can I create a new Bot and use its (permanent) API token?… YES!

Problem Solved! ?

So… I created a:

  1. cURL command & parsing statement to get the user status.
  2. New Webex Bot (for an “inside-org-permanent” API token).
  3. AppleScript to:
    1. Query (via dialog box) for the user CEC ID.
    2. Set a five seconds loop for the cURL command.
    3. Display a dialog box to notify when the user becomes active.

The Code (Mac OS only) ?‍?

1  set userName to text returned of (display dialog "Enter a CEC User Name (e.g., ymeloch)" default answer "" with title "Webex - Active User Notification" with icon file "Applications:Webex.app:Contents:Resources:webexteams.icns")
2  set theAlertText to "WebbEx Teams - Active User Notification"
3  set theAlertMessage to "" & userName & " User is now active"
4  ​
5  set n to 1
6  repeat
7     delay 5
8     set theName to do shell script "curl -s --request GET --url 'https://api.ciscospark.com/v1/people?email=" & userName & "%40cisco.com' --header 'Authorization: Bearer [webex-bot-token]' | json_pp | grep status | awk '{print $3}' | tr -dc '[:alnum:]'"
9  if theName = "active" then (display dialog theAlertMessage with title "Webex - Active User Notification" with icon file "Applications:Webex.app:Contents:Resources:webexteams.icns" buttons {"Exit"} default button "Exit" cancel button "Exit")
10 end repeat

The Code Explained

  • Line #1 – Define the “userName” variable (== AppleScript display dialog with an “userName” input request). BTW, see below for more information about the Webex icon path.
  • Line #2 – Define the “theAlertText” variable (== Fixed text, will be used in the main method).
  • Line #3 – Define the “theAlertMessage” variable (Includes the “userName” response and fixed text).
  • Line #5 & #6 – Start loop.
  • Line #7 – Define delay interval.
  • Line #8 – Define the “theName” variable (== The cURL command). Note the cURL GET command and parsing ?
curl -s --request GET --url 'https://api.ciscospark.com/v1/people?email=" & userName & "%40cisco.com' --header 'Authorization: Bearer [webex-bot-token]' | json_pp | grep status | awk '{print $3}' | tr -dc '[:alnum:]'
  • cURL Command Explained:
    • [REST API Call] -s – Silent operation (no cURL command output printouts).
    • [REST API Call] –request GET – Send a GET request.
    • [REST API Call] –url – The URL of the GET request.
      • Note the “& userName &” in the URL. That is where we leverage the “userName” variable from line #1.
      • Note the “%40cisco.com” string in the URL (I replaced the “@cisco.com” string with a parseable string “%40cisco.com”).
    • [REST API Call] –header ‘Authorization: Bearer [webex-bot-token]’ – The authorization method (Bearer) to execute the API call.
    • [Parsing Statment] | json_pp – Converert the API call output to a JSON format.
    • [Parsing Statment] | grep status – Search for (only) a line with the word “status”.
    • [Parsing Statment] | awk ‘{print $3}’ – If a line with the word “status” is found, print (only) the third word.
    • [Parsing Statment] | tr -dc ‘[:alnum:]’ – Remove non-alphanumeric characters from the previous output (“active”, ? active).
    • Line #9 – “If” statement (looking for “active” status).
    • Line #10 – End loop (once execution completed).

❗️Note: To add the Webex icon to the AppleScript dialog, I extracted the webex.app file, and located the ​​​​​​​”webexteams.icns” file.

Demo ?

Disclaimers

  • In order to tweak the Webex status, I used internal API’s which are always subject to change.
  • The above code is “POC (Proof of Concept) Grade” as I am polling for the user status every 5 seconds until it changes. A more scalable way will be to subscribe for notification through Webex internal API (I still need to find these calls ?).

Final thoughts

  • The power of automation, innovation, and integration – Cool, right! ?
  • What is your challenge? Can you leverage automation/different technologies/programming languages to mitigate it?
  • Want to learn more about APIs (== integration glue), automation, and Integration? What about cURL and AppleScript programming? Check the AIDE User Guide or get in touch with the Cross-Domain TAB team.

Special thanks to Paul Giralt for his review and feedback! ?

Related developer resources


We’d love to hear what you think. Ask a question or leave a comment below.
And stay connected with Cisco DevNet on social!

Twitter @CiscoDevNet | Facebook | LinkedIn

Visit the new Developer Video Channel



Authors

Yossi Meloch

Senior Software Architect

Customer Experience (CX)