When the user sends a message to your app, the message can include attachments. These attachments can be either files from Google Drive or uploaded content (a local file). This guide describes how you can use the GetAttachment API to retrieve attachments.
Using the GetAttachment API
When the user sends a message to your app, Google Chat dispatches an event. The event received by your app includes a request body, which is the JSON payload representing the event, including any attachment. The data in the attachment is different depending on whether the attachment is uploaded content or is stored on Drive.
To get the attachment, add code to your app that takes the following steps:
- Call
GetAttachment
to retrieve the attachment metadata from the message. - If the attachment is uploaded content, call the Media API to get the bytes of the content.
- If the message is a Drive file, use the Drive API to get access to the file.
The GetAttachment API is available at the following endpoint:
https://chat.googleapis.com/v1/ + attachment.name
The attachment
field is included in the message payload to the app.
Following is an example function that gets and returns the attachment from a message, using the API endpoint to get the attachment.
/**
* Gets message attachment and returns it
*/
function getAttachment(attachmentName) {
var attachment = {};
var url = "https://chat.googleapis.com/v1/" + attachmentName;
var service = getOAuth2Service();
var response = UrlFetchApp.fetch(url, {
method: 'get',
headers: {
'Authorization': 'Bearer ' + service.getAccessToken()
},
muteHttpExceptions:true,
});
if(response.getResponseCode() != 200){
return "Failed to get attachment with error code: " + response.getResponseCode();
}
attachment = JSON.parse(response)
return attachment;
}
Retrieving uploaded content
When a user includes a file from Drive, your app
might not be able to access the file. If the app needs to download the content,
the app can ask the user to
authorize access
so that the app can act on behalf of the user by requesting authorization for
the
https://www.googleapis.com/auth/drive.readonly
scope. The
https://www.googleapis.com/auth/drive.file
scope, which is usually
recommended, can't set the access control lists (ACLs) for your app to access
the file uploaded from Drive. For more information about
downloading Drive files, see
Download files.
When the user includes a local file (uploaded content) in a message, your app can access the file if the file is attached to a message that the app can see—for example, a direct message or an @mention. After you get the attachment, if the user has included a local file as the attachment, an AttachmentDataRef will be present. You can use the AttachmentDataRef.resourcename with the Media API to retrieve the contents of the file the user uploaded. The Media API is available at the following endpoint:
https://chat.googleapis.com/v1/media/" + dataRef + "?alt=media"
Following is an example function that retrieves the contents of an uploaded file:
/**
* Calls Media api to read data. dataRef is the reference to the uploaded
* file to be read, found in the attachment.
*/
function getByteStream(dataRef) {
var blob = "";
var driveFileName = "";
var url = "https://chat.googleapis.com/v1/media/"+ dataRef +"?alt=media"
var service = getOAuth2Service();
var response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + service.getAccessToken(),
},
'muteHttpExceptions': true,
});
if(response.getResponseCode() != 200){
return "Failed to get file content with error code: " + response.getResponseCode();
}
blob = response.getBlob();
driveFileName = DriveApp.createFile(blob);
return "The uploaded contents have been saved in a Google Drive file: "+ driveFileName;
}
Note that this function stores the uploaded content in a newly created Drive file. This is optional and just an example of what you can do with the bytes after you retrieve them.
Message examples
Here is an example of the JSON representation of an attachment. The attachment
is a field within the message. In this example, the source field contains
UPLOADED_CONTENT
and the attachmentDataRef
field has the resource name of the
attachment, which is used with the Media API to get the attachment contents.
{
"name": "spaces/5o6pDgAAAAE/messages/m6mP13zUHTk.m6mP13zUHTk/attachments/AATUf-J224yPdqsp20yL3RVBl2UK",
"contentName": "solar.png",
"contentType": "image/png",
"attachmentDataRef": {
"resourceName": "ClxzcGFjZXMvNW82cERnQUFBQUUvbWVzc2FnZXMvbTZtUDEzelVIVGsubTZtUDEzelVIVGsvYXR0YWNobWVudHMvQUFUVWYtSjIyNHlQZHFzcDIweUwzUlZCbDJVSw=="
},
"thumbnailUri": "https://chat.google.com/api/get_attachment_url?url_type=FIFE_URL&content_type=image/png&attachment_token=AAUuIGs8q7EXV7xUy38c5bHCJYpKCDcvJgmeIEWGSZHDAjUBaoQTjUoQ/Mupv/z8rvjGqxJPywmG4RSpeFTXcAiAKM2stSZuScYKYEoQK14JaoWEevYYVO4y3pSXnZ/Kf%2BK/lC%2BjDxOtVCQ1xOsrx6Qk3%2B%2B0UlZfPnHZlghj0%2BMXyquX49pOdOVuSVyxlDmzx/SSvED5ALYzoAbmG%2B9axrE53hZ1vahaoxfD8o10DGcMh0RNBJsYFx5dQpcAMNuW6KQ2Iu5ZtmzrKjuieA%2BkwsQkHx718b60bD25G0AL8OZSGT7K9TbwIA3t2Xxc%2BECM/ccSNhnMsBUuiaYiSf8K07hBoEo3RssoNMK9bBOqkbET90%2BN2Ow%2B0m4DktY%3D&sz=w512",
"downloadUri": "https://chat.google.com/api/get_attachment_url?url_type=DOWNLOAD_URL&content_type=image/png&attachment_token=AAUuIGs8q7EXV7xUy38c5bHCJYpKCDcvJgmeIEWGSZHDAjUBaoQTjUoQ/Mupv/z8rvjGqxJPywmG4RSpeFTXcAiAKM2stSZuScYKYEoQK14JaoWEevYYVO4y3pSXnZ/Kf%2BK/lC%2BjDxOtVCQ1xOsrx6Qk3%2B%2B0UlZfPnHZlghj0%2BMXyquX49pOdOVuSVyxlDmzx/SSvED5ALYzoAbmG%2B9axrE53hZ1vahaoxfD8o10DGcMh0RNBJsYFx5dQpcAMNuW6KQ2Iu5ZtmzrKjuieA%2BkwsQkHx718b60bD25G0AL8OZSGT7K9TbwIA3t2Xxc%2BECM/ccSNhnMsBUuiaYiSf8K07hBoEo3RssoNMK9bBOqkbET90%2BN2Ow%2B0m4DktY%3D&auto=true",
"source": "UPLOADED_CONTENT"
}
Note: don’t use the thumbnailUri
and downloadUri
fields to access the
contents of the uploaded file from your app. Use the Media API instead, as
described earlier. The thumbnailUri
field can be used to preview the
attachment for a human user. The downloadUri
field can be used to allow a
human user to download the attachment.
Following is an example of a message with a Google Drive attachment. In this
example, the source field contains DRIVE_FILE
and the driveDataRef
field
has the file ID of the attachment.
name: "spaces/5o6pDgAAAAE/messages/Ohu1LlUVcS8.Ohu1LlUVcS8/attachments/AATUf-Iz7d8kySEdRRZd-dznqBk3"
content_name: "solar.png"
content_type: "image/png"
drive_data_ref {
drive_file_id: "1HqaqRuH2Pfd_TOa1fF2_ltwDlV_yKRrr"
}
message_metadata {
name: "spaces/5o6pDgAAAAE/messages/Ohu1LlUVcS8.Ohu1LlUVcS8"
sender: "101758396040800075119"
create_time {
seconds: 1598383223
nanos: 650047000
}
update_time {
seconds: 1598383223
nanos: 650047000
}
}
source: DRIVE_FILE
More information
For more information on creating apps, see the Chat API Reference.