Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/graphaelli/zat
Zoom Archive Tool
https://github.com/graphaelli/zat
google google-drive zoom
Last synced: 2 months ago
JSON representation
Zoom Archive Tool
- Host: GitHub
- URL: https://github.com/graphaelli/zat
- Owner: graphaelli
- License: apache-2.0
- Created: 2019-12-12T19:59:37.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2022-10-02T17:43:58.000Z (over 2 years ago)
- Last Synced: 2024-06-19T00:36:45.924Z (7 months ago)
- Topics: google, google-drive, zoom
- Language: Go
- Size: 71.3 KB
- Stars: 25
- Watchers: 3
- Forks: 12
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Zoom Archive Tool
Copies Zoom recordings to Google Drive.
## Why
* Improve discoverability of Zoom recordings
* Preserve recordings when Zoom user leaves the org
* Reduce cost of long term retention (maybe)## How
`zat` requires `go` to build - 1.13+ is recommended, for proper error formatting, but will work with older versions.
```
$ go build .
$ ./zat
````zat` should start without any configuration but isn't very useful without credentials - see below for setup.
`zat` will persist tokens to disk at `google.creds.json` and `zat.creds.json` - be sure to guard those files carefully as permissions are necessarily wide.
Once tokens have been obtained, `zat -no-server` will perform only archival duties and then exit.
`zat` always attempts to archive, to only start the web server use: `-since 0s`.
### Credentials
* Obtain Google credentials
* [Create an Oauth Client ID credential](https://console.cloud.google.com/apis/credentials)
* You may need to create a project, or use a dev project you have access to. If the project doesn't have OAuth consent screen info, you'll need to add that as well.
* Choose "internal" user type, give it a name similar to the project name, and add your contact email
* Choose "Web application" as the client ID type
* Set Authorized redirect URIs to `http://localhost:8080/oauth/google`
* Save credentials to `google.config.json` (GCP Console > API & Services > Credentials > Download JSON)* Obtain Zoom credentials
* [Create an Oauth Application](https://marketplace.zoom.us/develop/create)
* User-managed
* No need to publish
* Set name, descriptions, and contact information
* Add the `recording:read` scope
* Set redirect URI to `http://127.0.0.1.ip.es.io:8080/oauth/zoom` and also add it to Whitelisted URLs
*
* Save credentials to `zoom.config.json` with content:
```json
{
"id": "your-id",
"secret": "your-secret",
"oauth_redirect": "http://127.0.0.1.ip.es.io:8080/oauth/zoom"
}
```
* [Optional] Obtain Slack credentials
* [Create an App](https://api.slack.com/apps?new_app=1)
* Add Permissions > Scopes > Bot Token Scopes > Add An Oauth Scope granting: `channels:read`, `chat:write`, `chat:write.public`
* Save the Bot User OAuth Access Token (under OAuth & Permissions) to `slack.config.json` with content:
```json
{
"token": "your-token"
}
```Once the credentials are in place, re-run `zat` and use the web server at http://localhost:8080/ to login to both Google and Zoom to create the `*.creds.json` files zat will use for the next run.
### Configuration
* Configure zat
Create zat.yml like:
```yaml
- name: UI Weekly
google: DpB3XhhzV87LfEeLrM-nCopTtHDWxqVGH
zoom: 023-456-789
- name: Team Weekly
google: DpB3XhhzV87LfEeLrM-nCopTtHDWxqVGH
zoom: 123-456-789
```Where `google` is the folder ID to store recordings into, and `zoom` is the meeting id (hyphens or no hyphens, not spaces).
The google configuration is the ID of the folder where the recordings will be stored.
`cmd/google/findfolders` can assist in tracking down folders and IDs like:
```
$ go build ./cmd/google/findfolders
$ ./findfolders -query 'name = "bar"'
foo DpB3XhhzV87LfEeLrM-nCopTtHDWxqVGH https://drive.google.com/drive/folders/DpB3XhhzV87LfEeLrM-nCopTtHDWxqVGH
$ ./findfolders -query '"DpB3XhhzV87LfEeLrM-nCopTtHDWxqVGH" in parents and name = "Meetings"'
Meetings ycMAKmDuzwobv6eBf9-PLupEGJJ6BtyoJ https://drive.google.com/drive/folders/ycMAKmDuzwobv6eBf9-PLupEGJJ6BtyoJ
```You'll likely get an "Access Not Configured" error for new projects. Follow the URL in the error to ensure the project is enabled for Google Drive API access, then wait a few minutes before retrying.
zat provides a web interface with similar functionality, eg [http://localhost:8080/google?q=name contains "Team weekly"](http://localhost:8080/google?q=name%20contains%20%27Team%20weekly%27).
#### Zoom
The zoom configuration is the meeting ID - the dashes are optional.
`cmd/zoom/listrecordings` can assist in tracking down meeting IDs like:
```
$ go build ./cmd/zoom/listrecordings
$ ./listrecordings -since 96h
2019/11/25 12:22:54 listrecordings.go:41: 2 recordings found
2019-11-21 945106202 UI Weekly
audio_transcript https://zoom.us/recording/download/wwww
shared_screen_with_speaker_view https://zoom.us/recording/download/xxxx
chat_file https://zoom.us/recording/download/yyyy
audio_only https://zoom.us/recording/download/zzzz
timeline https://zoom.us/recording/download/11111111-1111-1111-1111-111111111111
2019-11-21 906290321 Team Weekly
audio_transcript https://zoom.us/recording/download/aaaa
shared_screen_with_speaker_view https://zoom.us/recording/download/bbbb
chat_file https://zoom.us/recording/download/cccc
audio_only https://zoom.us/recording/download/dddd
timeline https://zoom.us/recording/download/22222222-2222-2222-2222-222222222222
```zat provides a web interface with similar functionality at http://localhost:8080/zoom.
#### Slack
The slack configuration is the ID of the channel where the message should be sent.
`cmd/slack/listchannels` can assist in tracking down channel IDs like:
```
$ go build ./cmd/slack/listchannels
$ ./listchannels
CAAAAAAAA general
CAAAAAAAB zat
```One method for finding private channel IDs is to open Slack in a web browser and look at `$$('.p-channel_sidebar__static_list__item')` elements.
The application's bot user will need to be invited to the private channel to post messages there.`cmd/slack/chat` can assist in verifying permissions are correct.
#### Scheduling
On macOS pre-10.15 (Catalina) and Linux, `cron` is sufficient, eg:
```
0 8,10,15,22 * * * zat -no-server -config-dir ~/path/to/zat/config/dir
```On macOS 10.15+, new security restrictions make `cron` less attractive.
Instead use `launchd`.
A sample configuration is included under `contrib/`.
Load it with:
```
launchctl load contrib/zat.plist
```If prompted the first time the job runs, grant `zat` access to the config directory.
## Also
* Zoom doesn't look back farther than 30 days when `-since` is > 30 days. - [#16](https://github.com/graphaelli/zat/issues/16)
* [#34](https://github.com/graphaelli/zat/issues/34) introduced the `-t` option to limit the file types archived by zat. You might consider running `zat` with `-t mp4,chat` as the rest of the files aren't that interesting.