Adding upstream version 0.8.9.
Signed-off-by: Daniel Baumann <daniel@debian.org>
19
docs/examples/generic.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Examples
|
||||
|
||||
Examples of service URLs that can be used with [the generic service](../../services/generic) together with common service providers.
|
||||
|
||||
## Home Assistant
|
||||
|
||||
The service URL needs to be:
|
||||
```
|
||||
generic://HAIPAddress:HAPort/api/webhook/WebhookIDFromHA?template=json
|
||||
```
|
||||
|
||||
And, if you need http://
|
||||
```
|
||||
generic://HAIPAddress:HAPort/api/webhook/WebhookIDFromHA?template=json&disabletls=yes
|
||||
```
|
||||
|
||||
Then, in HA, use `{{ trigger.json.message }}` to get the message sent from the JSON.
|
||||
|
||||
_Credit [@JeffCrum1](https://github.com/JeffCrum1), source: [https://github.com/nicholas-fedor/shoutrrr/issues/325#issuecomment-1460105065]_
|
BIN
docs/favicon.ico
Normal file
After Width: | Height: | Size: 31 KiB |
20
docs/generators/basic.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
# Basic generator
|
||||
|
||||
The basic generator looks at the `key:""`, `desc:""` and `default:""` tags on service configuration structs and uses them to ask the user to fill in their corresponding values.
|
||||
|
||||
Example:
|
||||
```shell
|
||||
$ shoutrrr generate telegram
|
||||
```
|
||||
```yaml
|
||||
Generating URL for telegram using basic generator
|
||||
Enter the configuration values as prompted
|
||||
|
||||
Token: 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
|
||||
Preview[Yes]: No
|
||||
Notification[Yes]:
|
||||
ParseMode[None]:
|
||||
Channels: @mychannel
|
||||
|
||||
URL: telegram://110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw@telegram?channels=@mychannel¬ification=Yes&parsemode=None&preview=No
|
||||
```
|
10
docs/generators/overview.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Generators
|
||||
|
||||
Generators are used to create service configurations via the command line.
|
||||
The main generator is the reflection based [Basic generator](./basic) that aims to be able to generator configurations for all the core services via a set of simple questions.
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
$ shoutrrr generate [OPTIONS] -g <GENERATOR> <SERVICE>
|
||||
```
|
156
docs/getting-started.md
Normal file
|
@ -0,0 +1,156 @@
|
|||
# Getting started
|
||||
|
||||
## As a package
|
||||
|
||||
Using shoutrrr is easy! There is currently two ways of using it as a package.
|
||||
|
||||
### Using the direct send command
|
||||
Easiest to use, but very limited.
|
||||
|
||||
```go
|
||||
url := "slack://token-a/token-b/token-c"
|
||||
err := shoutrrr.Send(url, "Hello world (or slack channel) !")
|
||||
```
|
||||
|
||||
### Using a sender
|
||||
Using a sender gives you the ability to preconfigure multiple notification services and send to all of them with the same `Send(message, params)` method.
|
||||
|
||||
```go
|
||||
urlA := "slack://token-a/token-b/token-c"
|
||||
urlB := "telegram://110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw@telegram?channels=@mychannel"
|
||||
sender, err := shoutrrr.CreateSender(urlA, urlB)
|
||||
|
||||
// Send notifications instantly to all services
|
||||
sender.Send("Hello world (or slack/telegram channel)!", map[string]string { "title": "He-hey~!" })
|
||||
|
||||
// ...or bundle notifications...
|
||||
func doWork() error {
|
||||
// ...and send them when leaving the scope
|
||||
defer sender.Flush(map[string]string { "title": "Work Result" })
|
||||
|
||||
sender.Enqueue("Started doing %v", stuff)
|
||||
|
||||
// Maybe get creative...?
|
||||
defer func(start time.Time) {
|
||||
sender.Enqueue("Elapsed: %v", time.Now().Sub(start))
|
||||
}(time.Now())
|
||||
|
||||
if err := doMoreWork(); err != nil {
|
||||
sender.Enqueue("Oh no! %v", err)
|
||||
|
||||
// This will send the currently queued up messages...
|
||||
return
|
||||
}
|
||||
|
||||
sender.Enqueue("Everything went very well!")
|
||||
|
||||
// ...or this:
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
## Through the CLI
|
||||
|
||||
Start by running the `build.sh` script.
|
||||
You may then run the shoutrrr executable:
|
||||
|
||||
```shell
|
||||
$ ./shoutrrr
|
||||
|
||||
Usage:
|
||||
./shoutrrr <ActionVerb> [...]
|
||||
Possible actions: send, verify, generate
|
||||
```
|
||||
|
||||
On a system with Go installed you can install the latest Shoutrrr CLI
|
||||
command with:
|
||||
|
||||
```shell
|
||||
go install github.com/nicholas-fedor/shoutrrr/shoutrrr@latest
|
||||
```
|
||||
|
||||
### Commands
|
||||
|
||||
#### Send
|
||||
|
||||
Send a notification using the supplied notification service url.
|
||||
|
||||
```bash
|
||||
$ shoutrrr send \
|
||||
--url "<SERVICE_URL>" \
|
||||
--message "<MESSAGE BODY>"
|
||||
```
|
||||
|
||||
#### Verify
|
||||
|
||||
Verify the validity of a notification service url.
|
||||
|
||||
```bash
|
||||
$ shoutrrr verify \
|
||||
--url "<SERVICE_URL>"
|
||||
```
|
||||
|
||||
#### Generate
|
||||
|
||||
Generate and display the configuration for a notification service url.
|
||||
|
||||
```bash
|
||||
$ shoutrrr generate [OPTIONS] <SERVICE>
|
||||
```
|
||||
|
||||
| Flags | Description |
|
||||
| ---------------------------- | ------------------------------------------------|
|
||||
| `-g, --generator string` | The generator to use (default "basic") |
|
||||
| `-p, --property stringArray` | Configuration property in key=value format |
|
||||
| `-s, --service string` | The notification service to generate a URL for |
|
||||
|
||||
**Note**: Service can either be supplied as the first argument or using the `-s` flag.
|
||||
|
||||
For more information on generators, see [Generators](./generators/overview.md).
|
||||
|
||||
### Options
|
||||
|
||||
#### Debug
|
||||
|
||||
Enables debug output from the CLI.
|
||||
|
||||
| Flags | Env. | Default | Required |
|
||||
| --------------- | ---------------- | ------- | -------- |
|
||||
| `--debug`, `-d` | `SHOUTRRR_DEBUG` | `false` | |
|
||||
|
||||
#### URL
|
||||
|
||||
The target url for the notifications generated, see [overview](./services/overview).
|
||||
|
||||
| Flags | Env. | Default | Required |
|
||||
| ------------- | -------------- | ------- | -------- |
|
||||
| `--url`, `-u` | `SHOUTRRR_URL` | N/A | ✅ |
|
||||
|
||||
## From a GitHub Actions workflow
|
||||
|
||||
You can also use Shoutrrr from a GitHub Actions workflow.
|
||||
|
||||
See this example and the [action on GitHub
|
||||
Marketplace](https://github.com/marketplace/actions/shoutrrr-action):
|
||||
|
||||
```yaml
|
||||
name: Deploy
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Some other steps needed for deploying
|
||||
run: ...
|
||||
- name: Shoutrrr
|
||||
uses: nicholas-fedor/shoutrrr-action@v1
|
||||
with:
|
||||
url: ${{ secrets.SHOUTRRR_URL }}
|
||||
title: Deployed ${{ github.sha }}
|
||||
message: See changes at ${{ github.event.compare }}.
|
||||
```
|
BIN
docs/guides/slack/app-api-channel-details-id.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
docs/guides/slack/app-api-copy-oauth-token.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
docs/guides/slack/app-api-oauth-menu.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/guides/slack/app-api-select-channel.png
Normal file
After Width: | Height: | Size: 19 KiB |
47
docs/guides/slack/index.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
# Slack Guides
|
||||
|
||||
Guides for setting up the [Slack](../../services/slack.md) service
|
||||
|
||||
## Getting a token
|
||||
|
||||
To enable all features, either the Legacy Webhook- (deprecated and might stop working) or the bot API tokens needs to
|
||||
be used. Only use the non-legacy Webhook if you don't need to customize the bot name or icon.
|
||||
|
||||
### Bot API (preferred)
|
||||
|
||||
1. Create a new App for your bot using the [Basic app setup guide](https://api.slack.com/authentication/basics)
|
||||
2. Install the App into your workspace ([slack docs](https://api.slack.com/authentication/basics#installing)).
|
||||
3. From [Apps](https://api.slack.com/apps), select your new App and go to **Oauth & Permissions**
|
||||
<figure><img alt="Slack app management menu screenshot" src="app-api-oauth-menu.png" height="248" /></figure>
|
||||
4. Copy the Bot User OAuth Token
|
||||
<figure><img alt="Copy OAuth token screenshot" src="app-api-copy-oauth-token.png" height="209" /></figure>
|
||||
|
||||
!!! example
|
||||
Given the API token
|
||||
<pre><code><b>xoxb</b>-<b>123456789012</b>-<b>1234567890123</b>-<b>4mt0t4l1YL3g1T5L4cK70k3N</b></code></pre>
|
||||
and the channel ID `C001CH4NN3L` (obtained by using the [guide below](#getting_the_channel_id)), the Shoutrrr URL
|
||||
should look like this:
|
||||
<pre><code>slack://<b>xoxb</b>:<b>123456789012</b>-<b>1234567890123</b>-<b>4mt0t4l1YL3g1T5L4cK70k3N</b>@<b>C001CH4NN3L</b></code></pre>
|
||||
|
||||
### Webhook tokens
|
||||
|
||||
Get a Webhook URL using the legacy [WebHooks Integration](https://slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),
|
||||
or by using the [Getting started with Incoming Webhooks](https://api.slack.com/messaging/webhooks#getting_started) guide and
|
||||
replace the initial `https://hooks.slack.com/services/` part of the webhook URL with `slack://hook:` to get your Shoutrrr URL.
|
||||
|
||||
!!! info "Slack Webhook URL"
|
||||
<code>https://hooks.slack.com/services/<b>T00000000</b>/<b>B00000000</b>/<b>XXXXXXXXXXXXXXXXXXXXXXXX</b></code>
|
||||
|
||||
!!! info "Shoutrrr URL"
|
||||
<code>slack://hook:<b>T00000000</b>-<b>B00000000</b>-<b>XXXXXXXXXXXXXXXXXXXXXXXX</b>@webhook</code>
|
||||
|
||||
## Getting the Channel ID
|
||||
|
||||
!!! note ""
|
||||
Only needed for API token. Use `webhook` as the channel for webhook tokens.
|
||||
|
||||
1. In the channel you wish to post to, open **Channel Details** by clicking on the channel title.
|
||||
<figure><img alt="Opening channel details screenshot" src="app-api-select-channel.png" height="270" /></figure>
|
||||
|
||||
2. Copy the Channel ID from the bottom of the popup and append it to your Shoutrrr URL
|
||||
<figure><img alt="Copy channel ID screenshot" src="app-api-channel-details-id.png" height="99" /></figure>
|
43
docs/index.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Shoutrrr
|
||||
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/nicholas-fedor/shoutrrr/main/docs/shoutrrr-logotype.png" height="450" width="450" />
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
Notification library for gophers and their furry friends.<br />
|
||||
Heavily inspired by <a href="https://github.com/caronc/apprise">caronc/apprise</a>.
|
||||
</p>
|
||||
|
||||
<p align="center" class="badges">
|
||||
<a target="_blank" rel="noopener noreferrer" href="https://github.com/nicholas-fedor/shoutrrr/workflows/Main%20Workflow/badge.svg">
|
||||
<img src="https://github.com/nicholas-fedor/shoutrrr/workflows/Main%20Workflow/badge.svg" alt="github actions workflow status">
|
||||
</a>
|
||||
<a href="https://codecov.io/gh/nicholas-fedor/shoutrrr" rel="nofollow">
|
||||
<img alt="codecov" src="https://codecov.io/gh/nicholas-fedor/shoutrrr/branch/main/graph/badge.svg">
|
||||
</a>
|
||||
<a href="https://www.codacy.com/gh/nicholas-fedor/shoutrrr/dashboard?utm_source=github.com&utm_medium=referral&utm_content=nicholas-fedor/shoutrrr&utm_campaign=Badge_Grade" rel="nofollow">
|
||||
<img alt="Codacy Badge" src="https://app.codacy.com/project/badge/Grade/47eed72de79448e2a6e297d770355544">
|
||||
</a>
|
||||
<a href="https://goreportcard.com/badge/github.com/nicholas-fedor/shoutrrr" rel="nofollow">
|
||||
<img alt="report card" src="https://goreportcard.com/badge/github.com/nicholas-fedor/shoutrrr">
|
||||
</a>
|
||||
<a href="https://pkg.go.dev/github.com/nicholas-fedor/shoutrrr" rel="nofollow">
|
||||
<img alt="go.dev reference" src="https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square">
|
||||
</a>
|
||||
<a href="https://hub.docker.com/r/nickfedor/shoutrrr" rel="nofollow">
|
||||
<img alt="Pulls from DockerHub" src="https://img.shields.io/docker/pulls/nickfedor/shoutrrr.svg">
|
||||
</a>
|
||||
<a href="https://github.com/nicholas-fedor/shoutrrr">
|
||||
<img alt="github code size in bytes" src="https://img.shields.io/github/languages/code-size/nicholas-fedor/shoutrrr.svg?style=flat-square">
|
||||
</a>
|
||||
<a href="https://github.com/nicholas-fedor/shoutrrr/blob/main/LICENSE">
|
||||
<img alt="license" src="https://img.shields.io/github/license/nicholas-fedor/shoutrrr.svg?style=flat-square">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
To make it easy and streamlined to consume shoutrrr regardless of the notification service you want to use,
|
||||
we've implemented a notification service url schema. To send notifications, instantiate the `ShoutrrrClient` using one of
|
||||
the service urls from the [overview](services/overview.md).
|
9
docs/overrides/main.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block outdated %}
|
||||
You're not viewing the latest version.
|
||||
<a href="{{ '../' ~ base_url }}">
|
||||
|
||||
<strong>Click here to go to latest.</strong>
|
||||
</a>
|
||||
{% endblock %}
|
21
docs/proxy.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
To use a proxy with shoutrrr, you could either set the proxy URL in the environment variable `HTTP_PROXY` or override the default HTTP client like this:
|
||||
|
||||
```go
|
||||
proxyurl, err := url.Parse("socks5://localhost:1337")
|
||||
if err != nil {
|
||||
log.Fatalf("Error parsing proxy URL: %q", err)
|
||||
}
|
||||
|
||||
http.DefaultClient.Transport = &http.Transport{
|
||||
Proxy: http.ProxyURL(proxyurl),
|
||||
DialContext: (&net.Dialer{
|
||||
Timeout: 30 * time.Second,
|
||||
KeepAlive: 30 * time.Second,
|
||||
}).DialContext,
|
||||
ForceAttemptHTTP2: true,
|
||||
MaxIdleConns: 100,
|
||||
IdleConnTimeout: 90 * time.Second,
|
||||
TLSHandshakeTimeout: 10 * time.Second,
|
||||
ExpectContinueTimeout: 1 * time.Second,
|
||||
}
|
||||
```
|
7
docs/services/bark.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Bark
|
||||
|
||||
Upstream docs: https://github.com/Finb/Bark
|
||||
|
||||
## URL Format
|
||||
|
||||
--8<-- "docs/services/bark/config.md"
|
52
docs/services/discord.md
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Discord
|
||||
|
||||
## URL Format
|
||||
|
||||
Your Discord Webhook-URL will look like this:
|
||||
|
||||
!!! info ""
|
||||
https://discord.com/api/webhooks/__`webhookid`__/__`token`__
|
||||
|
||||
The shoutrrr service URL should look like this:
|
||||
|
||||
!!! info ""
|
||||
discord://__`token`__@__`webhookid`__[?thread_id=__`threadid`__]
|
||||
|
||||
### Thread Support
|
||||
|
||||
To send messages to a specific thread in a Discord channel, include the `thread_id` query parameter in the service URL with the ID of the target thread. For example:
|
||||
|
||||
!!! info ""
|
||||
discord://__`token`__@__`webhookid`__?thread_id=123456789
|
||||
|
||||
You can obtain the `thread_id` by right-clicking a thread in Discord and selecting "Copy ID" (requires Developer Mode to be enabled in Discord settings).
|
||||
|
||||
--8<-- "docs/services/discord/config.md"
|
||||
|
||||
## Creating a webhook in Discord
|
||||
|
||||
1. Open your channel settings by first clicking on the gear icon next to the name of the channel.
|
||||

|
||||
|
||||
2. In the menu on the left, click on *Integrations*.
|
||||

|
||||
|
||||
3. In the menu on the right, click on *Create Webhook*.
|
||||

|
||||
|
||||
4. Set the name, channel, and icon to your liking and click the *Copy Webhook URL* button.
|
||||

|
||||
|
||||
5. Press the *Save Changes* button.
|
||||

|
||||
|
||||
6. Format the service URL:
|
||||
```
|
||||
https://discord.com/api/webhooks/693853386302554172/W3dE2OZz4C13_4z_uHfDOoC7BqTW288s-z1ykqI0iJnY_HjRqMGO8Sc7YDqvf_KVKjhJ
|
||||
└────────────────┘ └──────────────────────────────────────────────────────────────────┘
|
||||
webhook id token
|
||||
|
||||
discord://W3dE2OZz4C13_4z_uHfDOoC7BqTW288s-z1ykqI0iJnY_HjRqMGO8Sc7YDqvf_KVKjhJ@693853386302554172?thread_id=123456789
|
||||
└──────────────────────────────────────────────────────────────────┘ └────────────────┘ └─────────────────┘
|
||||
token webhook id thread id
|
||||
```
|
BIN
docs/services/discord/sc-1.png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
docs/services/discord/sc-2.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
docs/services/discord/sc-3.png
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
docs/services/discord/sc-4.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
docs/services/discord/sc-5.png
Normal file
After Width: | Height: | Size: 94 KiB |
8
docs/services/email.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Email
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
smtp://__`username`__:__`password`__@__`host`__:__`port`__/?from=__`fromAddress`__&to=__`recipient1`__[,__`recipient2`__,...]
|
||||
|
||||
--8<-- "docs/services/smtp/config.md"
|
76
docs/services/generic.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Generic
|
||||
The Generic service can be used for any target that is not explicitly supported by Shoutrrr, as long as it
|
||||
supports receiving the message via a POST request.
|
||||
Usually, this requires customization on the receiving end to interpret the payload that it receives, and might
|
||||
not be a viable approach.
|
||||
|
||||
Common examples for use with service providers can be found under [examples](../examples/generic.md).
|
||||
|
||||
## Custom headers
|
||||
You can add additional HTTP headers to your request by adding query variables prefixed with `@` (`@key=value`).
|
||||
|
||||
Using
|
||||
```url
|
||||
generic://example.com?@acceptLanguage=tlh-Piqd
|
||||
```
|
||||
would result in the additional header being added:
|
||||
|
||||
```http
|
||||
Accept-Language: tlh-Piqd
|
||||
```
|
||||
|
||||
## JSON template
|
||||
By using the built in `JSON` template (`template=json`) you can create a generic JSON payload. The keys used for `title` and `message` can be overriden
|
||||
by supplying the params/query values `titleKey` and `messageKey`.
|
||||
|
||||
!!! example
|
||||
```json
|
||||
{
|
||||
"title": "Oh no!",
|
||||
"message": "The thing happened and now there is stuff all over the area!"
|
||||
}
|
||||
```
|
||||
|
||||
### Custom data fields
|
||||
When using the JSON template, you can add additional key/value pairs to the JSON object by adding query variables prefixed with `$` (`$key=value`).
|
||||
|
||||
!!! example
|
||||
Using `generic://example.com?$projection=retroazimuthal` would yield:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Amazing opportunities!",
|
||||
"message": "New map book available for purchase.",
|
||||
"projection": "retroazimuthal"
|
||||
}
|
||||
```
|
||||
|
||||
## Shortcut URL
|
||||
You can just add `generic+` as a prefix to your target URL to use it with the generic service, so
|
||||
```url
|
||||
https://example.com/api/v1/postStuff
|
||||
```
|
||||
would become
|
||||
```url
|
||||
generic+https://example.com/api/v1/postStuff
|
||||
```
|
||||
|
||||
!!! note
|
||||
Any query variables added to the URL will be escaped so that they can be forwarded to the remote server. That means that you cannot use `?template=json` with the `generic+https://`, just use `generic://` instead!
|
||||
|
||||
## Forwarded query variables
|
||||
All query variables that are not listed in the [Query/Param Props](#queryparam_props) section will be
|
||||
forwarded to the target endpoint.
|
||||
If you need to pass a query variable that _is_ reserved, you can prefix it with an underscore (`_`).
|
||||
|
||||
!!! example
|
||||
The URL `generic+https://example.com/api/v1/postStuff?contenttype=text/plain` would send a POST message
|
||||
to `https://example.com/api/v1/postStuff` using the `Content-Type: text/plain` header.
|
||||
|
||||
If instead escaped, `generic+https://example.com/api/v1/postStuff?_contenttype=text/plain` would send a POST message
|
||||
to `https://example.com/api/v1/postStuff?contenttype=text/plain` using the `Content-Type: application/json` header (as it's the default).
|
||||
|
||||
|
||||
## URL Format
|
||||
|
||||
--8<-- "docs/services/generic/config.md"
|
37
docs/services/googlechat.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
# Google Chat
|
||||
|
||||
## URL Format
|
||||
|
||||
Your Google Chat Incoming Webhook URL will look like this:
|
||||
|
||||
!!! info ""
|
||||
https://chat.googleapis.com/v1/spaces/__`FOO`__/messages?key=__`bar`__&token=__`baz`__
|
||||
|
||||
The shoutrrr service URL should look like this:
|
||||
|
||||
!!! info ""
|
||||
googlechat://chat.googleapis.com/v1/spaces/__`FOO`__/messages?key=__`bar`__&token=__`baz`__
|
||||
|
||||
In other words the incoming webhook URL with `https` replaced by `googlechat`.
|
||||
|
||||
Google Chat was previously known as Hangouts Chat. Using `hangouts` in
|
||||
the service URL instead `googlechat` is still supported, although
|
||||
deprecated.
|
||||
|
||||
## Creating an incoming webhook in Google Chat
|
||||
|
||||
1. Open the room you would like to add Shoutrrr to and open the chat
|
||||
room menu.
|
||||

|
||||
|
||||
2. Then click on *Configure webhooks*.
|
||||

|
||||
|
||||
3. Name the webhook and save.
|
||||

|
||||
|
||||
4. Copy the URL.
|
||||

|
||||
|
||||
|
||||
5. Format the service URL by replacing `https` with `googlechat`.
|
BIN
docs/services/googlechat/hangouts-1.png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
docs/services/googlechat/hangouts-2.png
Normal file
After Width: | Height: | Size: 150 KiB |
BIN
docs/services/googlechat/hangouts-3.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
docs/services/googlechat/hangouts-4.png
Normal file
After Width: | Height: | Size: 135 KiB |
18
docs/services/gotify.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Gotify
|
||||
|
||||
## URL Format
|
||||
|
||||
--8<-- "docs/services/gotify/config.md"
|
||||
|
||||
## Examples
|
||||
|
||||
!!! example "Common usage"
|
||||
|
||||
```uri
|
||||
gotify://gotify.example.com:443/AzyoeNS.D4iJLVa/?title=Great+News&priority=1
|
||||
```
|
||||
|
||||
!!! example "With subpath"
|
||||
```uri
|
||||
gotify://example.com:443/path/to/gotify/AzyoeNS.D4iJLVa/?title=Great+News&priority=1
|
||||
```
|
7
docs/services/hangouts.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Hangouts Chat
|
||||
|
||||
Google Chat was previously known as *Hangouts Chat*. See [Google
|
||||
Chat](googlechat.md).
|
||||
|
||||
Using `hangouts` in the service URL instead `googlechat` is still
|
||||
supported, although deprecated.
|
8
docs/services/ifttt.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
# IFTTT
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
ifttt://__`key`__/?events=__`event1`__[,__`event2`__,...]&value1=__`value1`__&value2=__`value2`__&value3=__`value3`__
|
||||
|
||||
--8<-- "docs/services/ifttt/config.md"
|
21
docs/services/join.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# Join
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
join://shoutrrr:__`api-key`__@join/?devices=__`device1`__[,__`device2`__, ...][&icon=__`icon`__][&title=__`title`__]
|
||||
|
||||
--8<-- "docs/services/join/config.md"
|
||||
|
||||
## Guide
|
||||
|
||||
1. Go to the [Join Webapp](https://joinjoaomgcd.appspot.com/)
|
||||
2. Select your device
|
||||
3. Click **Join API**
|
||||
4. Your `deviceId` is shown in the top
|
||||
5. Click **Show** next to `API Key` to see your key
|
||||
6. Your Shoutrrr URL will then be:
|
||||
`join://shoutrrr:`__`api-key`__`@join/?devices=`__`deviceId`__
|
||||
|
||||
!!! note ""
|
||||
Multiple `deviceId`s can be combined with a `,` (repeat steps 2-4).
|
46
docs/services/lark.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Lark
|
||||
|
||||
Send notifications to Lark using a custom bot webhook.
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
lark://__`host`__/__`token`__?secret=__`secret`__&title=__`title`__&link=__`url`__
|
||||
|
||||
--8<-- "docs/services/lark/config.md"
|
||||
|
||||
- `host`: The bot API host (`open.larksuite.com` for Lark, `open.feishu.cn` for Feishu).
|
||||
- `token`: The bot webhook token (required).
|
||||
- `secret`: Optional bot secret for signed requests.
|
||||
- `title`: Optional message title (switches to post format if set).
|
||||
- `link`: Optional URL to include as a clickable link in the message.
|
||||
|
||||
### Example URL
|
||||
|
||||
```url
|
||||
lark://open.larksuite.com/abc123?secret=xyz789&title=Alert&link=https://example.com
|
||||
```
|
||||
|
||||
## Create a Custom Bot in Lark
|
||||
|
||||
Official Documentation: [Custom Bot Guide](https://open.larksuite.com/document/client-docs/bot-v3/add-custom-bot)
|
||||
|
||||
1. __Invite the Custom Bot to a Group__:
|
||||
a. Open the target group, click `More` in the upper-right corner, and then select `Settings`.
|
||||
b. In the `Settings` panel, click `Group Bot`.
|
||||
c. Click `Add a Bot` under `Group Bot`.
|
||||
d. In the `Add Bot` dialog, locate `Custom Bot` and select it.
|
||||
e. Set the bot’s name and description, then click `Add`.
|
||||
f. Copy the webhook address and click `Finish`.
|
||||
|
||||
2. __Get Host and Token__:
|
||||
- For __Lark__: Use `host = open.larksuite.com`.
|
||||
- For __Feishu__: Use `host = open.feishu.cn`.
|
||||
- The `token` is the last segment of the webhook URL.
|
||||
For example, in `https://open.larksuite.com/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx`, the token is `xxxxxxxxxxxxxxxxx`.
|
||||
|
||||
3. __Get Secret (Optional)__:
|
||||
a. In group settings, open the bot list, find your custom bot, and select it to access its configuration.
|
||||
b. Under `Security Settings`, enable `Signature Verification`.
|
||||
c. Click `Copy` to save the secret.
|
||||
d. Click `Save` to apply the changes.
|
6
docs/services/logger.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
# Logger
|
||||
|
||||
No configuration options are available for this service.
|
||||
|
||||
It simply emits notifications to the Shoutrrr log which is
|
||||
configured by the consumer.
|
44
docs/services/matrix.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Matrix
|
||||
|
||||
!!! note Usage of the `title` parameter
|
||||
Do note that Matrix will discard any information put in the `title` parameter as the service has no analogue to a
|
||||
a title. Instead, use a custom message format to supply your wanted title as part of the message.
|
||||
|
||||
## URL Format
|
||||
|
||||
*matrix://__`user`__:__`password`__@__`host`__:__`port`__/[?rooms=__`!roomID1`__[,__`roomAlias2`__]][&disableTLS=yes]*
|
||||
|
||||
--8<-- "docs/services/matrix/config.md"
|
||||
|
||||
## Authentication
|
||||
|
||||
If no `user` is specified, the `password` is treated as the authentication token. This means that no matter what login
|
||||
flow your server uses, if you can manually retrieve a token, then Shoutrrr can use it.
|
||||
|
||||
### Password Login Flow
|
||||
|
||||
If a `user` and `password` is supplied, the `m.login.password` login flow is attempted if the server supports it.
|
||||
|
||||
## Rooms
|
||||
|
||||
If `rooms` are *not* specified, the service will send the message to all the rooms that the user has currently joined.
|
||||
|
||||
Otherwise, the service will only send the message to the specified rooms. If the user is *not* in any of those rooms,
|
||||
but have been invited to it, it will automatically accept that invite.
|
||||
|
||||
**Note**: The service will **not** join any rooms unless they are explicitly specified in `rooms`. If you need the user
|
||||
to join those rooms, you can send a notification with `rooms` explicitly set once.
|
||||
|
||||
### Room Lookup
|
||||
|
||||
Rooms specified in `rooms` will be treated as room IDs if the start with a `!` and used directly to identify rooms. If
|
||||
they have no such prefix (or use a *correctly escaped* `#`) they will instead be treated as aliases, and a directory
|
||||
lookup will be used to resolve their corresponding IDs.
|
||||
|
||||
**Note**: Don't use unescaped `#` for the channel aliases as that will be treated as the `fragment` part of the URL.
|
||||
Either omit them or URL encode them, I.E. `rooms=%23alias:server` or `rooms=alias:server`
|
||||
|
||||
### TLS
|
||||
|
||||
If you do not have TLS enabled on the server you can disable it by providing `disableTLS=yes`. This will effectively
|
||||
use `http` intead of `https` for the API calls.
|
69
docs/services/mattermost.md
Normal file
|
@ -0,0 +1,69 @@
|
|||
# MatterMost
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
mattermost://[__`username`__@]__`mattermost-host`__/__`token`__[/__`channel`__][?icon=__`smiley`__&disabletls=__`yes`__]
|
||||
|
||||
--8<-- "docs/services/mattermost/config.md"
|
||||
|
||||
|
||||
|
||||
## Creating a Webhook in MatterMost
|
||||
|
||||
1. Open up the Integrations page by clicking on *Integrations* within the menu
|
||||

|
||||
|
||||
2. Click *Incoming Webhooks*
|
||||

|
||||
|
||||
3. Click *Add Incoming Webhook*
|
||||

|
||||
|
||||
4. Fill in the information for the webhook and click *Save*
|
||||

|
||||
|
||||
5. If you did everything correctly, MatterMost will give you the *URL* to your newly created webhook
|
||||

|
||||
|
||||
6. Format the service URL
|
||||
```
|
||||
https://your-domain.com/hooks/bywsw8zt5jgpte3nm65qjiru6h
|
||||
└────────────────────────┘
|
||||
token
|
||||
mattermost://your-domain.com/bywsw8zt5jgpte3nm65qjiru6h
|
||||
└────────────────────────┘
|
||||
token
|
||||
```
|
||||
|
||||
## Additional URL configuration
|
||||
|
||||
Mattermost provides functionality to post as another user or to another channel, compared to the webhook configuration.
|
||||
<br/>
|
||||
To do this, you can add a *user* and/or *channel* to the service URL.
|
||||
|
||||
```
|
||||
mattermost://shoutrrrUser@your-domain.com/bywsw8zt5jgpte3nm65qjiru6h/shoutrrrChannel
|
||||
└──────────┘ └────────────────────────┘ └─────────────┘
|
||||
user token channel
|
||||
```
|
||||
|
||||
## Passing parameters via code
|
||||
|
||||
If you want to, you also have the possibility to pass parameters to the `send` function.
|
||||
<br/>
|
||||
The following example contains all parameters that are currently supported.
|
||||
|
||||
```gotemplate
|
||||
params := (*types.Params)(
|
||||
&map[string]string{
|
||||
"username": "overwriteUserName",
|
||||
"channel": "overwriteChannel",
|
||||
"icon": "overwriteIcon",
|
||||
},
|
||||
)
|
||||
|
||||
service.Send("this is a message", params)
|
||||
```
|
||||
|
||||
This will overwrite any options, that you passed via URL.
|
BIN
docs/services/mattermost/1.PNG
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
docs/services/mattermost/2.PNG
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
docs/services/mattermost/3.PNG
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
docs/services/mattermost/4.PNG
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
docs/services/mattermost/5.PNG
Normal file
After Width: | Height: | Size: 33 KiB |
7
docs/services/ntfy.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Ntfy
|
||||
|
||||
Upstream docs: https://docs.ntfy.sh/publish/
|
||||
|
||||
## URL Format
|
||||
|
||||
--8<-- "docs/services/ntfy/config.md"
|
66
docs/services/opsgenie.md
Normal file
|
@ -0,0 +1,66 @@
|
|||
# OpsGenie
|
||||
|
||||
## URL Format
|
||||
|
||||
--8<-- "docs/services/opsgenie/config.md"
|
||||
|
||||
## Creating a REST API endpoint in OpsGenie
|
||||
|
||||
1. Open up the Integration List page by clicking on *Settings => Integration List* within the menu
|
||||

|
||||
|
||||
2. Click *API => Add*
|
||||
|
||||
3. Make sure *Create and Update Access* and *Enabled* are checked and click *Save Integration*
|
||||

|
||||
|
||||
4. Copy the *API Key*
|
||||
|
||||
5. Format the service URL
|
||||
|
||||
The host can be either api.opsgenie.com or api.eu.opsgenie.com depending on the location of your instance. See
|
||||
the [OpsGenie documentation](https://docs.opsgenie.com/docs/alert-api) for details.
|
||||
|
||||
```
|
||||
opsgenie://api.opsgenie.com/eb243592-faa2-4ba2-a551q-1afdf565c889
|
||||
└───────────────────────────────────┘
|
||||
token
|
||||
```
|
||||
|
||||
## Passing parameters via code
|
||||
|
||||
If you want to, you can pass additional parameters to the `send` function.
|
||||
<br/>
|
||||
The following example contains all parameters that are currently supported.
|
||||
|
||||
```go
|
||||
service.Send("An example alert message", &types.Params{
|
||||
"alias": "Life is too short for no alias",
|
||||
"description": "Every alert needs a description",
|
||||
"responders": `[{"id":"4513b7ea-3b91-438f-b7e4-e3e54af9147c","type":"team"},{"name":"NOC","type":"team"}]`,
|
||||
"visibleTo": `[{"id":"4513b7ea-3b91-438f-b7e4-e3e54af9147c","type":"team"},{"name":"rocket_team","type":"team"}]`,
|
||||
"actions": "An action",
|
||||
"tags": "tag1 tag2",
|
||||
"details": `{"key1": "value1", "key2": "value2"}`,
|
||||
"entity": "An example entity",
|
||||
"source": "The source",
|
||||
"priority": "P1",
|
||||
"user": "Dracula",
|
||||
"note": "Here is a note",
|
||||
})
|
||||
```
|
||||
|
||||
## Optional parameters
|
||||
|
||||
You can optionally specify the parameters in the URL:
|
||||
|
||||
!!! info ""
|
||||
opsgenie://api.opsgenie.com/eb243592-faa2-4ba2-a551q-1afdf565c889?alias=Life+is+too+short+for+no+alias&description=Every+alert+needs+a+description&actions=An+action&tags=["tag1","tag2"]&entity=An+example+entity&source=The+source&priority=P1&user=Dracula¬e=Here+is+a+note
|
||||
|
||||
Example using the command line:
|
||||
|
||||
```shell
|
||||
shoutrrr send -u 'opsgenie://api.eu.opsgenie.com/token?tags=["tag1","tag2"]&description=testing&responders=[{"username":"superuser", "type": "user"}]&entity=Example Entity&source=Example Source&actions=["asdf", "bcde"]' -m "Hello World6"
|
||||
```
|
||||
|
||||
|
BIN
docs/services/opsgenie/1.png
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
docs/services/opsgenie/2.png
Normal file
After Width: | Height: | Size: 132 KiB |
32
docs/services/overview.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Services overview
|
||||
|
||||
Click on the service for a more thorough explanation. <!-- @formatter:off -->
|
||||
|
||||
| Service | URL format |
|
||||
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Bark](./bark.md) | *bark://__`devicekey`__@__`host`__* |
|
||||
| [Discord](./discord.md) | *discord://__`token`__@__`id`__[?thread_id=__`threadid`__]* |
|
||||
| [Email](./email.md) | *smtp://__`username`__:__`password`__@__`host`__:__`port`__/?from=__`fromAddress`__&to=__`recipient1`__[,__`recipient2`__,...]* |
|
||||
| [Gotify](./gotify.md) | *gotify://__`gotify-host`__/__`token`__* |
|
||||
| [Google Chat](./googlechat.md) | *googlechat://chat.googleapis.com/v1/spaces/FOO/messages?key=bar&token=baz* |
|
||||
| [IFTTT](./ifttt.md) | *ifttt://__`key`__/?events=__`event1`__[,__`event2`__,...]&value1=__`value1`__&value2=__`value2`__&value3=__`value3`__* |
|
||||
| [Join](./join.md) | *join://shoutrrr:__`api-key`__@join/?devices=__`device1`__[,__`device2`__, ...][&icon=__`icon`__][&title=__`title`__]* |
|
||||
| [Mattermost](./mattermost.md) | *mattermost://[__`username`__@]__`mattermost-host`__/__`token`__[/__`channel`__]* |
|
||||
| [Matrix](./matrix.md) | *matrix://__`username`__:__`password`__@__`host`__:__`port`__/[?rooms=__`!roomID1`__[,__`roomAlias2`__]]* |
|
||||
| [Ntfy](./ntfy.md) | *ntfy://__`username`__:__`password`__@ntfy.sh/__`topic`__* |
|
||||
| [OpsGenie](./opsgenie.md) | *opsgenie://__`host`__/token?responders=__`responder1`__[,__`responder2`__]* |
|
||||
| [Pushbullet](./pushbullet.md) | *pushbullet://__`api-token`__[/__`device`__/#__`channel`__/__`email`__]* |
|
||||
| [Pushover](./pushover.md) | *pushover://shoutrrr:__`apiToken`__@__`userKey`__/?devices=__`device1`__[,__`device2`__, ...]* |
|
||||
| [Rocketchat](./rocketchat.md) | *rocketchat://[__`username`__@]__`rocketchat-host`__/__`token`__[/__`channel`|`@recipient`__]* |
|
||||
| [Slack](./slack.md) | *slack://[__`botname`__@]__`token-a`__/__`token-b`__/__`token-c`__* |
|
||||
| [Teams](./teams.md) | *teams://__`group`__@__`tenant`__/__`altId`__/__`groupOwner`__?host=__`organization`__.webhook.office.com* |
|
||||
| [Telegram](./telegram.md) | *telegram://__`token`__@telegram?chats=__`@channel-1`__[,__`chat-id-1`__,...]* |
|
||||
| [Zulip Chat](./zulip.md) | *zulip://__`bot-mail`__:__`bot-key`__@__`zulip-domain`__/?stream=__`name-or-id`__&topic=__`name`__* |
|
||||
| [Lark](./lark.md) | *lark://__`host`__/__`token`__?secret=__`secret`__&title=__`title`__&link=__`url`__* |
|
||||
|
||||
## Specialized services
|
||||
|
||||
| Service | Description |
|
||||
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Logger](./logger.md) | Writes notification to a configured go `log.Logger` |
|
||||
| [Generic Webhook](./generic.md) | Sends notifications directly to a webhook |
|
8
docs/services/pushbullet.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Pushbullet
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
pushbullet://__`api-token`__[/__`device`__/#__`channel`__/__`email`__]
|
||||
|
||||
--8<-- "docs/services/pushbullet/config.md"
|
32
docs/services/pushover.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Pushover
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
pushover://shoutrrr:__`apiToken`__@__`userKey`__/?devices=__`device1`__[,__`device2`__, ...]
|
||||
|
||||
--8<-- "docs/services/pushover/config.md"
|
||||
|
||||
## Getting the keys from Pushover
|
||||
|
||||
At your [Pushover dashboard](https://pushover.net/) you can view your __`userKey`__ in the top right.
|
||||

|
||||
|
||||
The `Name` column of the device list is what is used to refer to your devices (__`device1`__ etc.)
|
||||

|
||||
|
||||
At the bottom of the same page there are links your _applications_, where you can find your __`apiToken`__
|
||||

|
||||
|
||||
The __`apiToken`__ is displayed at the top of the application page.
|
||||

|
||||
|
||||
## Optional parameters
|
||||
|
||||
You can optionally specify the __`title`__ and __`priority`__ parameters in the URL:
|
||||
*pushover://shoutrrr:__`token`__@__`userKey`__/?devices=__`device`__&title=Custom+Title&priority=1*
|
||||
|
||||
!!! note
|
||||
Only supply priority values between -1 and 1, since 2 requires additional parameters that are not supported yet.
|
||||
|
||||
Please refer to the [Pushover API documentation](https://pushover.net/api#messages) for more information.
|
BIN
docs/services/pushover/po-1.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
docs/services/pushover/po-2.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
docs/services/pushover/po-3.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/services/pushover/po-4.png
Normal file
After Width: | Height: | Size: 12 KiB |
66
docs/services/rocketchat.md
Normal file
|
@ -0,0 +1,66 @@
|
|||
# Rocket.chat
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
rocketchat://[__`username`__@]__`rocketchat-host`__/__`token`__[/__`channel`|`@recipient`__]*
|
||||
|
||||
--8<-- "docs/services/rocketchat/config.md"
|
||||
|
||||
## Creating a Webhook in Rocket.chat
|
||||
|
||||
1. Open up the chat Administration by clicking on *Administration* menu
|
||||

|
||||
|
||||
2. Open *Integrations* and then click *New*
|
||||

|
||||
|
||||
3. Fill in the information for the webhook and click *Save*. Please don't forget to Enable your integration.
|
||||

|
||||
|
||||
5. If you did everything correctly, Rocket.chat will give you the *URL* and *Token* to your newly created webhook.
|
||||

|
||||
|
||||
6. Format the service URL
|
||||
```
|
||||
rocketchat://your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX
|
||||
└────────────────────────────────────────────────────────────────┘
|
||||
token
|
||||
```
|
||||
|
||||
## Additional URL configuration
|
||||
|
||||
Rocket.chat provides functionality to post as another user or to another channel / user, compared to the webhook configuration.
|
||||
<br/>
|
||||
To do this, you can add a *sender* and/or *channel* / *receiver* to the service URL.
|
||||
|
||||
```
|
||||
rocketchat://shoutrrrUser@your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX/shoutrrrChannel
|
||||
└──────────┘ └────────────────────────────────────────────────────────────────┘ └─────────────┘
|
||||
sender token channel
|
||||
|
||||
rocketchat://shoutrrrUser@your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX/@shoutrrrReceiver
|
||||
└──────────┘ └────────────────────────────────────────────────────────────────┘ └───────────────┘
|
||||
sender token receiver
|
||||
```
|
||||
|
||||
## Passing parameters via code
|
||||
|
||||
If you want to, you also have the possibility to pass parameters to the `send` function.
|
||||
<br/>
|
||||
The following example contains all parameters that are currently supported.
|
||||
|
||||
```gotemplate
|
||||
params := (*types.Params)(
|
||||
&map[string]string{
|
||||
"username": "overwriteUserName",
|
||||
"channel": "overwriteChannel",
|
||||
},
|
||||
)
|
||||
|
||||
service.Send("this is a message", params)
|
||||
```
|
||||
|
||||
This will overwrite any options, that you passed via URL.
|
||||
|
||||
For more Rocket.chat Webhooks options see [official guide](https://docs.rocket.chat/guides/administrator-guides/integrations).
|
BIN
docs/services/rocketchat/1.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
docs/services/rocketchat/2.png
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
docs/services/rocketchat/3.png
Normal file
After Width: | Height: | Size: 185 KiB |
BIN
docs/services/rocketchat/4.png
Normal file
After Width: | Height: | Size: 126 KiB |
36
docs/services/slack.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
# Slack
|
||||
|
||||
!!! attention "New URL format"
|
||||
The URL format for Slack has been changed to allow for API- as well as webhook tokens.
|
||||
Using the old format (`slack://xxxx/yyyy/zzzz`) will still work as before and will automatically be upgraded to
|
||||
the new format when used.
|
||||
|
||||
The Slack notification service uses either [Slack Webhooks](https://api.slack.com/messaging/webhooks) or the
|
||||
[Bot API](https://api.slack.com/methods/chat.postMessage) to send messages.
|
||||
|
||||
See the [guides](../guides/slack/index.md) for information on how to get your *token* and *channel*.
|
||||
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! note ""
|
||||
Note that the token uses a prefix to determine the type, usually either `hook` (for webhooks) or `xoxb` (for bot API).
|
||||
|
||||
--8<-- "docs/services/slack/config.md"
|
||||
|
||||
!!! info "Color format"
|
||||
The format for the `Color` prop follows the [slack docs](https://api.slack.com/reference/messaging/attachments#fields)
|
||||
but `#` needs to be escaped as `%23` when passed in a URL.
|
||||
So <span style="background:#ff8000;width:.9em;height:.9em;display:inline-block;vertical-align:middle"></span><code>#ff8000</code> would be `%23ff8000` etc.
|
||||
|
||||
## Examples
|
||||
|
||||
!!! example "Bot API"
|
||||
```uri
|
||||
slack://xoxb:123456789012-1234567890123-4mt0t4l1YL3g1T5L4cK70k3N@C001CH4NN3L?color=good&title=Great+News&icon=man-scientist&botname=Shoutrrrbot
|
||||
```
|
||||
|
||||
!!! example "Webhook"
|
||||
```uri
|
||||
slack://hook:WNA3PBYV6-F20DUQND3RQ-Webc4MAvoacrpPakR8phF0zi@webhook?color=good&title=Great+News&icon=man-scientist&botname=Shoutrrrbot
|
||||
```
|
69
docs/services/teams.md
Normal file
|
@ -0,0 +1,69 @@
|
|||
# Teams
|
||||
|
||||
!!! attention "New webhook URL format only"
|
||||
Shoutrrr now only supports the new Teams webhook URL format with an
|
||||
organization-specific domain.
|
||||
|
||||
You must specify your organization domain using:
|
||||
|
||||
```text
|
||||
?host=example.webhook.office.com
|
||||
```
|
||||
Where `example` is your organization's short name.
|
||||
|
||||
Legacy webhook formats (e.g., `outlook.office.com`) are no longer supported.
|
||||
|
||||
## URL Format
|
||||
|
||||
```
|
||||
teams://group@tenant/altId/groupOwner/extraId?host=organization.webhook.office.com[&color=color][&title=title]
|
||||
```
|
||||
|
||||
Where:
|
||||
|
||||
- `group`: The first UUID component from the webhook URL.
|
||||
- `tenant`: The second UUID component from the webhook URL.
|
||||
- `altId`: The third component (hex string) from the webhook URL.
|
||||
- `groupOwner`: The fourth UUID component from the webhook URL.
|
||||
- `extraId`: The fifth component at the end of the webhook URL.
|
||||
- `organization`: Your organization name for the webhook domain (required).
|
||||
- `color`: Optional hex color code for the message card (e.g., `FF0000` for red).
|
||||
- `title`: Optional title for the message card.
|
||||
|
||||
--8<-- "docs/services/teams/config.md"
|
||||
|
||||
## Setting up a webhook
|
||||
|
||||
To use the Microsoft Teams notification service, you need to set up a custom
|
||||
incoming webhook. Follow the instructions in [this Microsoft guide](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook#create-an-incoming-webhook).
|
||||
|
||||
## Extracting the token
|
||||
|
||||
The token is extracted from your webhook URL:
|
||||
|
||||
<pre><code>https://<b><organization></b>.webhook.office.com/webhookb2/<b><group></b>@<b><tenant></b>/IncomingWebhook/<b><altId></b>/<b><groupOwner></b>/<b><extraId></b></code></pre>
|
||||
|
||||
!!! note "Important components"
|
||||
All parts of the webhook URL are required:
|
||||
|
||||
- `organization`: Your organization name (e.g., `contoso`).
|
||||
- `group`: First UUID component.
|
||||
- `tenant`: Second UUID component.
|
||||
- `altId`: Third component (hex string).
|
||||
- `groupOwner`: Fourth UUID component.
|
||||
- `extraId`: Fifth component.
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
# Original webhook URL:
|
||||
https://contoso.webhook.office.com/webhookb2/11111111-4444-4444-8444-cccccccccccc@22222222-4444-4444-8444-cccccccccccc/IncomingWebhook/33333333012222222222333333333344/44444444-4444-4444-8444-cccccccccccc/V2ESyij_gAljSoUQHvZoZYzlpAoAXExyOl26dlf1xHEx05
|
||||
|
||||
# Shoutrrr URL:
|
||||
teams://11111111-4444-4444-8444-cccccccccccc@22222222-4444-4444-8444-cccccccccccc/33333333012222222222333333333344/44444444-4444-4444-8444-cccccccccccc/V2ESyij_gAljSoUQHvZoZYzlpAoAXExyOl26dlf1xHEx05?host=contoso.webhook.office.com&color=FF0000&title=Alert
|
||||
```
|
||||
|
||||
In this example:
|
||||
|
||||
- `color=FF0000` sets a red theme.
|
||||
- `title=Alert` adds a custom title to the message card.
|
73
docs/services/telegram.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
# Telegram
|
||||
|
||||
## URL Format
|
||||
|
||||
!!! info ""
|
||||
telegram://__`token`__@telegram?chats=__`channel-1`__[,__`chat-id-1`__,...]
|
||||
|
||||
--8<-- "docs/services/telegram/config.md"
|
||||
|
||||
## Getting a token for Telegram
|
||||
|
||||
Talk to [the botfather](https://core.telegram.org/bots#6-botfather).
|
||||
|
||||
## Identifying the target chats/channels
|
||||
|
||||
The `chats` param consists of one or more `Chat ID`s or `channel name`s.
|
||||
|
||||
### Public Channels
|
||||
The channel names can be retrieved in the telegram client in the `Channel info` section for public channels.
|
||||
Replace the `t.me/` prefix from the link with a `@`.
|
||||
|
||||
!!! note
|
||||
Channels names need to be prefixed by `@` to identify them as such.
|
||||
|
||||
!!! note
|
||||
If your channel only has an invite link (starting with `t.me/+`), you have to use it's Chat ID (see below)
|
||||
|
||||
!!! note
|
||||
A `message_thread_id` param ([reference](https://core.telegram.org/bots/api#sendmessage)) can be added, with the format of `$chat_id:$message_thread_id`. [More info](https://stackoverflow.com/questions/74773675/how-to-get-topic-id-for-telegram-group-chat/75178418#75178418) on how to obtain the `message_thread_id`.
|
||||
|
||||
### Chats
|
||||
Private channels, Group chats and private chats are identified by `Chat ID`s. Unfortunatly, they are generally not visible in the
|
||||
telegram clients.
|
||||
The easiest way to retrieve them is by using the `shoutrrr generate telegram` command which will guide you through
|
||||
creating a URL with your target chats.
|
||||
|
||||
!!! tip
|
||||
You can use the `nickfedor/shoutrrr` image in docker to run it without download/installing the `shoutrrr` CLI using:
|
||||
```
|
||||
docker run --rm -it nickfedor/shoutrrr generate telegram
|
||||
```
|
||||
|
||||
### Asking @shoutrrrbot
|
||||
Another way of retrieving the Chat IDs, is by forwarding a message from the target chat to the [@shoutrrrbot](https://t.me/shoutrrrbot).
|
||||
It will reply with the Chat ID for the chat where the forwarded message was originally posted.
|
||||
Note that it will not work correctly for Group chats, as those messages are just seen as being posted by a user, not in a specific chat.
|
||||
Instead you can use the second method, which is to invite the @shoutrrrbot into your group chat and address a message to it (start the message with @shoutrrrbot). You can then safely kick the bot from the group.
|
||||
|
||||
The bot should be constantly online, unless it's usage exceeds the free tier on GCP. It's source is available at [github.com/nicholas-fedor/shoutrrrbot](https://github.com/nicholas-fedor/shoutrrrbot).
|
||||
|
||||
|
||||
|
||||
## Optional parameters
|
||||
|
||||
You can optionally specify the __`notification`__, __`parseMode`__ and __`preview`__ parameters in the URL:
|
||||
|
||||
!!! info ""
|
||||
<pre>telegram://__`token`__@__`telegram`__/?channels=__`channel`__¬ification=no&preview=false&parseMode=html</pre>
|
||||
|
||||
See [the telegram documentation](https://core.telegram.org/bots/api#sendmessage) for more information.
|
||||
|
||||
!!! note
|
||||
`preview` and `notification` are inverted in regards to their API counterparts (`disable_web_page_preview` and `disable_notification`)
|
||||
|
||||
### Parse Mode and Title
|
||||
|
||||
If a parse mode is specified, the message needs to be escaped as per the corresponding sections in
|
||||
[Formatting options](https://core.telegram.org/bots/api#formatting-options).
|
||||
|
||||
When a title has been specified, it will be prepended to the message, but this is only supported for
|
||||
the `HTML` parse mode. Note that, if no parse mode is specified, the message will be escaped and sent using `HTML`.
|
||||
|
||||
Since the markdown modes are really hard to escape correctly, it's recommended to stick to `HTML` parse mode.
|
29
docs/services/zulip.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Zulip Chat
|
||||
|
||||
## URL Format
|
||||
|
||||
The shoutrrr service URL should look like this:
|
||||
!!! info ""
|
||||
zulip://__`botmail`__:__`botkey`__@__`host`__/?stream=__`stream`__&topic=__`topic`__
|
||||
|
||||
--8<-- "docs/services/zulip/config.md"
|
||||
|
||||
!!! note
|
||||
Since __`botmail`__ is a mail address you need to URL escape the `@` in it to `%40`.
|
||||
|
||||
### Examples
|
||||
|
||||
Stream and topic are both optional and can be given as parameters to the Send method:
|
||||
|
||||
```go
|
||||
sender, _ := shoutrrr.CreateSender(url)
|
||||
|
||||
params := make(types.Params)
|
||||
params["stream"] = "mystream"
|
||||
params["topic"] = "This is my topic"
|
||||
|
||||
sender.Send(message, ¶ms)
|
||||
```
|
||||
|
||||
!!! example "Example service URL"
|
||||
zulip://my-bot%40zulipchat.com:correcthorsebatterystable@example.zulipchat.com?stream=foo&topic=bar
|
BIN
docs/shoutrrr-180px.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
docs/shoutrrr-logotype.png
Normal file
After Width: | Height: | Size: 132 KiB |
269
docs/shoutrrr-logotype.svg
Normal file
After Width: | Height: | Size: 144 KiB |
BIN
docs/shoutrrr.jpg
Normal file
After Width: | Height: | Size: 53 KiB |
30
docs/stylesheets/extra.css
Normal file
|
@ -0,0 +1,30 @@
|
|||
|
||||
.md-typeset li img {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.md-typeset figure {
|
||||
background: var(--md-code-bg-color);
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.md-typeset figure img {
|
||||
box-shadow: 2px 2px 4px #00000080;
|
||||
padding: 3px;
|
||||
background: var(--md-code-bg-color);
|
||||
}
|
||||
|
||||
|
||||
.md-typeset li img:last-child {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.badges img {
|
||||
height: 20px;
|
||||
max-width: 100%;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
border-radius: 3px;
|
||||
}
|
8
docs/stylesheets/theme.css
Normal file
|
@ -0,0 +1,8 @@
|
|||
[data-md-color-scheme="shoutrrr"] {
|
||||
--md-primary-fg-color: hsl(193, 100%, 44%);
|
||||
--md-primary-fg-color--light: hsl(193, 100%, 55%);
|
||||
--md-primary-fg-color--dark: hsl(193, 76%, 33%);
|
||||
--md-accent-fg-color: hsl(39, 84%, 44%);
|
||||
--md-accent-fg-color--transparent: hsla(39, 84%, 58%, 0.1);
|
||||
--md-typeset-a-color: var(--md-primary-fg-color--dark);
|
||||
}
|