google-apps-scriptgoogle-apichatbotservice-accountsgoogle-hangouts

Send message to Google Chat using the REST API (Google example not working in 2020)


Where do I even begin... (Google, why must you hurt me this way?)

Background Info

I have created a new chatbot using Google Apps Script, which receives messages from users in Google Chat and responds synchronously with a single message (each message can only have one response from the chatbot).

Now I need a way to send asynchronous messages so that the bot can send messages on its own, or send multiple separate responses at a time.

The problem

The Google Chat REST API has a method to create a message asynchronously, but this method (spaces.messages.create) does not work! There are no working examples of this method from 2020.

Here is Google's example code for creating a message using the REST API.

The problem is that in their example, the SCOPE is set to a URL that no longer exits:

var SCOPE = 'https://www.googleapis.com/auth/chat.bot';

If you navigate to that URL, you will see this 404 error:

Not Found
Error 404

Furthermore, if you check the list of available OAuth2 scopes, you will notice that there are no scopes related to Hangouts or Chat, and there is no mention of the chat.bot the scope which was used in the example code.

What have I tried?

I have read through every question on StackOverflow that is related to this Chat API, plus every tutorial for the REST API.

In conclusion

How to send messages from Google Apps Script to Google Chat using the Google Chat REST API?

It seems that Google's documentation is outdated, and none of the examples for this API work as of August 2020. They are either unaware that their REST API does not work, or they deprecated the REST API without telling anyone.


Solution

  • Answer:

    I can confirm that the chat.bot scope does indeed exist. To set up a chat bot with the REST API, you must use a service account.

    More Information:

    As per the documentation you linked on Developing bots with Apps Script, for sending async messages on trigger:

    ...the only way to achieve this currently is via the external HTTP API (see documentation). This requires the use of a Cloud service account (see documentation) via the OAuth2 for Apps Script library.

    This means, that you must first set up a service account in the GCP console so that the chat.bot scope can be used for these messages. The whole process can be quite arduous for the unintitiated, so I will provide the steps from start to finish here.

    The Process:

    Creating a Service Account:

    Your service account has now been created.

    Creating Service Account Credentials:

    These will be needed for the code provided in the example from the Developing bots with Apps Script page.

    Enabling the Hangouts Chat API:

    Note: Do not close this tab yet! We will still need to use the GCP console later.

    Setting up the Apps Script Project:

    In order to use the Google Apps Script OAuth2 library as in the example, you will need to add the library to the project using the library's script ID.

    Next, you will need to link the Apps Script project to the GCP project you created earlier.

    Setting up the Project Manifest: In order to use a chat bot in Apps Script, you must include the chat key in the project's manifest.

      "chat": {
        "addToSpaceFallbackMessage": "Thank you for adding me!"
      }
    

    Your full manifest file will now look something like this:

    {
      "timeZone": "Europe/Paris",
      "dependencies": {
        "enabledAdvancedServices": [{
          "userSymbol": "Drive",
          "serviceId": "drive",
          "version": "v2"
        }],
        "libraries": [{
          "userSymbol": "OAuth2",
          "libraryId": "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF",
          "version": "38"
        }]
      },
      "exceptionLogging": "STACKDRIVER",
      "runtimeVersion": "V8",
      "chat": {
        "addToSpaceFallbackMessage": "Thank you for adding me!"
      }
    }
    

    Final Steps:

    You're nearly done! Now, you will need to deply the bot from manifest, and set up the configuration in GCP and set up the trigger which will make the actual call.

    Deploying the bot:

    Setting up GCP configuration:

    The Elusive Trigger:

    And press save.

    And you're done! This created bot will now post to all rooms that it is in the current time, every minute.

    References: