Chanify is a safe and simple notification tools.
500K+
Chanify is a safe and simple notification tools. For developers, system administrators, and everyone can push notifications with API.
Chanify is include these features:
$ docker pull wizjin/chanify:latest
Use chanify to send message.
# Text message
$ docker run -it --rm wizjin/chanify:latest send --token=<token> --text=<message>
# Image message
$ docker run -it --rm wizjin/chanify:latest send --token=<token> --image=<image file path>
# URL message
$ docker run -it --rm wizjin/chanify:latest send --token=<token> --link=<web url>
# Action message
$ docker run -it --rm wizjin/chanify:latest send --endpoint=http://<address>:<port> --token=<token> --text=<message> --title=<title> --action="<action name>|<action url>"
Chanify run in stateless mode, no device token will be stored in node.
All device token will be stored in api.chanify.net.
Message will send to apple apns server by api.chanify.net.
Send message workflow:
Start => node server => api.chanify.net => Apple server => iOS client
$ docker run -it wizjin/chanify:latest serve --secret=<secret key> --name=<node name> --endpoint=http://<address>:<port>
Chanify run in stateful mode, device token will be stored in node.
Message will send to apple apns server direct.
Send message workflow:
Start => node server => Apple server => iOS client
Start server
$ docker run -it -v /my/data:/root/.chanify wizjin/chanify:latest serve --name=<node name> --endpoint=http://<address>:<port>
http://<address>:<port>/) to add node.# Text message
$ curl --form-string "text=hello" "http://<address>:<port>/v1/sender/<token>"
# Text file
$ cat message.txt | curl -H "Content-Type: text/plain" --data-binary @- "http://<address>:<port>/v1/sender/<token>"
from urllib import request, parse
data = parse.urlencode({ 'text': 'hello' }).encode()
req = request.Request("http://<address>:<port>/v1/sender/<token>", data=data)
request.urlopen(req)
require 'net/http'
uri = URI('http://<address>:<port>/v1/sender/<token>')
res = Net::HTTP.post_form(uri, 'text' => 'hello')
puts res.body
const https = require('https')
const querystring = require('querystring');
const data = querystring.stringify({ text: 'hello' })
const options = {
hostname: '<address>:<port>',
port: 80,
path: '/v1/sender/<token>',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
}
}
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.write(data);
req.end();
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'http://<address>:<port>/v1/sender/<token>',
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => [ 'text' => 'hello' ],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
http://<address>:<port>/v1/sender/<token>/<message>
http://<address>:<port>/v1/sender/<token>
Content-Type:
text/plain: Body is text messagemultipart/form-data: The block of data("text") is text messageapplication/x-www-form-urlencoded: text=<url encoded text message>application/json; charset=utf-8: The fields are optional{
"token": "<token>",
"title": "<message title>",
"text": "<text message content>",
"copy": "<copy text for text message>",
"autocopy": 1,
"sound": 1,
"priority": 10,
"actions": [
"ActionName1|http://<action host>/<action1>",
"ActionName2|http://<action host>/<action2>",
]
}
Additional params
| Key | Default | Description |
|---|---|---|
| title | None | The title for notification message. |
| copy | None | The copy text for text notification. |
| autocopy | 0 | Enable autocopy text for text notification. |
| sound | 0 | 1 enable sound, otherwise disable sound. |
| priority | 10 | 10 normal, 5 lower level. |
| actions | None | Actions list. |
E.g.
http://<address>:<port>/v1/sender/<token>?sound=1&priority=10&title=hello
$ curl --form "link=@<web url>" "http://<address>:<port>/v1/sender/<token>"
{
"link": "<web url>",
"sound": 1,
"priority": 10,
}
Send image only support POST method used serverful node.
image/png OR image/jpegcat <jpeg image path> | curl -H "Content-Type: image/jpeg" --data-binary @- "http://<address>:<port>/v1/sender/<token>"
multipart/form-data$ curl --form "image=@<jpeg image path>" "http://<address>:<port>/v1/sender/<token>"
Send Actions (Up to 4 actions).
multipart/form-data$ curl --form "action=ActionName1|http://<action host>/<action1>" "http://<address>:<port>/v1/sender/<token>"
Chanify can be configured with a yml format file, and the default path is /root/.chanify.yml.
$ docker run -it -v /my/config.yml:/root/.chanify.yml -v /my/data:/root/.chanify -p 8080:8080 wizjin/chanify:latest
server:
host: 0.0.0.0 # Listen ip address
port: 8080 # Listen port
endpoint: http://my.server/path # Endpoint URL
name: Node name # Name for node server
secret: <secret code> # key for serverless node server
datapath: <data path> # data storage path for serverful node server
dburl: mysql://root:test@tcp(127.0.0.1:3306)/chanify?charset=utf8mb4&parseTime=true&loc=Local # database dsn for serverful node server
register:
enable: false # Disable user register
whitelist: # whitelist for user register
- <user id 1>
- <user id 2>
client: # configuration for sender client
sound: 1 # enable sound
endpoint: <default node server endpoint>
token: <default token>
Node server can be disabled user registration and become a private server.
chanify serve --registerable=false --whitelist=<user1 id>,<user2 id>
--registerable=false: used to disable user registrationwhitelist: list users can be add into node serverDownload the extension for Chrome web store.
Extension features:
text/image/url message to ChanifyDistributed under the MIT License. See LICENSE for more information.
Content type
Image
Digest
sha256:845fcf851…
Size
17.5 MB
Last updated
over 3 years ago
docker pull wizjin/chanify