IFTTT众多的service里面,有一个非常强大的service,就是webhooks。当我们在IFTTT里面connect了这个service之后,我们会得到一个唯一的链接,我们访问这个链接就会被视作触发了这个service。

1.创建Applet

1.1新建Applet

My Applets界面选择New Applet,然后选择+this

1.2选择webhooks作为service

1.3选择Receive a web request作为trigger

1.4设置一个Event Name

为webhooks设置一个Event Name,作为这个Applet的触发条件。因为可能另外的Applet也用了webhooks这个service,那么就要使用这个Event Name来区分到底是哪个Applet

1.5选择action service

IFTTT里面,最终的动作被称作action。我们现在已经选好了webhooks作为trigger,现在就要来选择action了。我们选择Notifications作为action service

1.6选择一个action

Notifications这个service有两个action,一个是普通的通知,另一个是富文本的通知,也就是可以在通知里面显示图片。我们这里选择富文本的通知,普通通知的用法也是类似的

1.7配置action

配置action,可以设置Notifications的标题还有内容,还可以设置要显示的图片。这里还可以使用Add ingredient来添加webhooks里面传过来的数据。配置完成之后我们create,然后finish,Applet就创建完成了

2.触发webhooks

2.1使用webhooks的Documentation里面的测试来触发

一开始的时候,我们可以使用这个测试模式来测试自己的配置是否正确。访问webhooks页面,选择Documentation。输入之前设置好的Event Name,然后在下面的内容里面也可以填,value1value2这些值都是可以在action的配置里面得到的。之前我们配置了value1的值是填要在通知里面显示的图片地址。填好之后按Test it

收到的通知

2.2使用curl来触发

我们在2.1里面的测试界面也可以得到自动生成好的curl命令。我们直接拿来使用即可。

收到的通知

2.3使用golang来触发

所有的代码都放在github上了,地址https://github.com/liguoqinjim/go-labs/tree/master/lab143

2.3.1http.Post实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

type ConfStruct struct {
	Key       string `json:"key"`
	EventName string `json:"event_name"`
	UrlFormat string `json:"url_format"`
	Value1    string `json:"value1"`
	Value2    string `json:"value2"`
	Value3    string `json:"value3"`
}

var conf = new(ConfStruct)

func main() {
	//读取配置文件
	data, err := ioutil.ReadFile("conf.json")
	if err != nil {
		log.Fatalf("ioutil.ReadFile error:%v", err)
	}
	log.Printf("data=\n%s", data)

	err = json.Unmarshal(data, conf)
	if err != nil {
		log.Fatalf("json.Unmarshal error:%v", err)
	}

	//拼接url
	u := fmt.Sprintf(conf.UrlFormat, conf.EventName, conf.Key)
	log.Printf("url=%s", u)

	//post
	values := map[string]string{"value1": conf.Value1, "value2": conf.Value2, "value3": conf.Value3}
	jsonStr, _ := json.Marshal(values)
	resp, err := http.Post(u, "application/json", bytes.NewBuffer(jsonStr))
	if err != nil {
		log.Fatalf("http.Post error:%v", err)
	}
	d, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("ioutil.ReadAll error:%v", err)
	}
	log.Printf("resp:\n%s", d)
}

2.3.2http.Client的方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
...

func main() {
	//读取配置文件
	data, err := ioutil.ReadFile("conf.json")
	if err != nil {
		log.Fatalf("ioutil.ReadFile error:%v", err)
	}
	log.Printf("data=\n%s", data)

	err = json.Unmarshal(data, conf)
	if err != nil {
		log.Fatalf("json.Unmarshal error:%v", err)
	}

	//拼接url
	u := fmt.Sprintf(conf.UrlFormat, conf.EventName, conf.Key)
	log.Printf("url=%s", u)

	//client
	client := &http.Client{}
	values := map[string]string{
		"value1": conf.Value1,
		"value2": conf.Value2,
		"value3": conf.Value3,
	}
	jsonStr, _ := json.Marshal(values)

	req, err := http.NewRequest(http.MethodPost, u, bytes.NewBuffer(jsonStr))
	if err != nil {
		log.Fatalf("http.NewRequest error:%v", err)
	}
	req.Header.Add("Content-Type", "application/json")

	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("client.Do error:%v", err)
	}
	d, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("ioutil.ReadAll error:%v", err)
	}
	log.Printf("resp:\n%s", d)
}

2.3.3使用gorequest库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
...

func main() {
	//读取配置文件
	data, err := ioutil.ReadFile("conf.json")
	if err != nil {
		log.Fatalf("ioutil.ReadFile error:%v", err)
	}
	log.Printf("data=\n%s", data)

	err = json.Unmarshal(data, conf)
	if err != nil {
		log.Fatalf("json.Unmarshal error:%v", err)
	}

	//拼接url
	u := fmt.Sprintf(conf.UrlFormat, conf.EventName, conf.Key)
	log.Printf("url=%s", u)

	type ValueStruct struct {
		Value1 string `json:"value1"`
		Value2 string `json:"value2"`
		Value3 string `json:"value3"`
	}
	val := ValueStruct{Value1: conf.Value1, Value2: conf.Value2, Value3: conf.Value3}
	request := gorequest.New()
	//http://httpbin.org/post
	resp, body, errs := request.Post(u).
		Send(val).
		End()
	if errs != nil {
		log.Fatalf("errs:%+v", errs)
	}
	d, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("ioutil.ReadAll error:%v", err)
	}
	log.Printf("resp=\n%s", d)
	log.Println("body.length=", len(body))
	log.Println("body=", body)
}