如何解决在Arduino下的Slack bot上找不到通道,但在Bash上找不到
我正在尝试使用Arduino在Slack上发布消息,但是它总是返回"channel_not_found"
错误。
我试图用不同的格式定义频道:
client.println("POST " PATH " HTTP/1.1");
client.println("Content-type: application/json");
client.println("Authorization: Bearer " TOKEN);
client.println("Host: " SERVER);
client.println("Connection: close");
client.println(); // Separate header from content. Important!
client.println("{\"channel\":\"C01750LNGAU\",\"text\":\":tada:\"}");
//OR: client.println("{\"channel\":\"#project-coffee\",\"text\":\":tada:\"}");
//OR: client.println("{\"channel\":C01750LNGAU,\"text\":\":tada:\"}");
也使用URL编码内容类型:
client.println("POST " PATH " HTTP/1.1");
client.println("Content-type: application/x-www-form-urlencoded");
client.println("Authorization: Bearer " TOKEN);
client.println("Host: " SERVER);
client.println("Connection: close");
client.println();
client.println("channel=C01750LNGAU&text=:tada:");
//OR client.println("channel=project-coffee&text=:tada:");
//OR client.println("channel=#project-coffee&text=:tada:");
//OR client.println("channel=\\#project-coffee&text=:tada:");
为了进行比较,使用具有相同参数的Bash,它可以工作:
curl -F token=xoxb-12... -F channel=project-coffee -F text="Blabla" https://slack.com/api/chat.postMessage
,因此漫游器的权限是正确的。
我怀疑自己在做些微妙的蠢事,但我看不到。
该频道为公开频道,并且该漫游器具有权限。
作为参考,here是postMessage的文档,here是示例。
完整代码包含在此处:
#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
char ssid[] = SECRET_SSID;
const char password[] = SECRET_PASS;
int status = WL_IDLE_STATUS;
// POST parameters
// curl -F token=xoxb-12... -F channel=project-coffee -F text="Blabla" https://slack.com/api/chat.postMessage
const char* serverName = "slack.com/api/chat.postMessage";
const char* post_channel="project-coffee";
const int port = 443;
#define SERVER "slack.com"
#define PATH "/api/chat.postMessage"
WiFiSSLClient client;
void setup() {
Serial.begin(115200);
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
Serial.flush();
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid,password);
}
// you're connected now,so print out the data:
Serial.println("You are connected to the network");
Serial.flush();
if (client.connect(SERVER,443)) {
Serial.println("connected to Slack");
client.println("POST " PATH " HTTP/1.1");
client.println("Content-type: application/json");
//client.println("Content-type: application/x-www-form-urlencoded");
client.println("Authorization: Bearer " TOKEN);
client.println("Host: " SERVER);
client.println("Connection: close");
client.println(); // Separate header from content. Important!
//client.println("{\"channel\": \"#project-coffee\",\"text\": \":tada:\"}");
client.println("{\"channel\": \"C01750LNGAU\",\"text\": \":tada:\"}");
//client.println("{\"channel\": C01750LNGAU,\"text\": \":tada:\"}");
//client.println("channel=C01750LNGAU&text=:tada:");
//client.println("channel=project-coffee&text=:tada:");
//client.println("channel=#project-coffee&text=:tada:");
//client.println("channel=\\#project-coffee&text=:tada:");
Serial.println();
}
}
uint32_t bytes = 0;
void loop() {
while (client.available()) {
char c = client.read();
Serial.write(c);
bytes++;
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting from server.");
client.stop();
Serial.print("Read "); Serial.print(bytes); Serial.println(" bytes");
// do nothing forevermore:
while (true);
}
}
完整的答复是:
date: Sun,06 Sep 2020 13:46:30 GMT
server: Apache
x-slack-req-id: ****
x-oauth-scopes: chat:write,channels:read,groups:read,mpim:read,im:read
x-accepted-oauth-scopes: chat:write
access-control-expose-headers: x-slack-req-id,retry-after
x-slack-backend: r
x-content-type-options: nosniff
expires: Mon,26 Jul 1997 05:00:00 GMT
cache-control: private,no-cache,no-store,must-revalidate
x-xss-protection: 0
vary: Accept-Encoding
pragma: no-cache
access-control-allow-headers: slack-route,x-slack-version-ts,x-b3-traceid,x-b3-spanid,x-b3-parentspanid,x-b3-sampled,x-b3-flags
strict-transport-security: max-age=31536000; includeSubDomains; preload
referrer-policy: no-referrer
access-control-allow-origin: *
connection: close
transfer-encoding: chunked
content-type: application/json; charset=utf-8
x-via: haproxy-www-3rug,haproxy-edge-fra-eynl
{"ok":false,"error":"channel_not_found"}
解决方法
将POST发送到postman-echo.com
,它以您发送的请求作为响应,我可以看到正文为空。
原来我在标头Content-Length
中缺少一个必填字段。丢失时,似乎Slack和邮递员默认为0。
解决方案?添加标题:
client.println("Content-Length: 42");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。