繁体   English   中英

有没有办法在不使用 Webhook 的情况下向 slack 发送 POST 请求?

[英]Is there a way to send a POST request to slack without using Webhook?

我尝试使用 webhook 将POST请求发送到我的松弛通道,但无济于事。
无论我做什么,它总是返回一个错误的请求。
有没有办法在不使用 webhook 的情况下向 slack 发送POST请求?

编辑:我正在使用的代码

import json
import urllib.request
#import botocore.requests as requests

def lambda_handler(event, context):
  webhook=event['webhook']
  #response = urllib.request.urlopen(message) 
  #print(response) 

  slack_URL = 'https://hooks.slack.com/services/mywebhookurl'

#  req = urllib.request.Request(SLACK_URL, json.dumps(webhook).encode('utf-8'))
  json=webhook
  json=json.encode('utf-8')
  headers={'Content-Type': 'application/json'}
  #urllib.request.add_data(data)
  req = urllib.request.Request(slack_URL, json, headers)
  response = urllib.request.urlopen(req)

我认为当您在 utf-8 中编码utf-8时会出现问题。 试试下面的脚本。

import json
import requests

# Generate your webhook url at  https://my.slack.com/services/new/incoming-webhook/
webhook_url = "https://hooks.slack.com/services/YYYYYYYYY/XXXXXXXXXXX"
slack_data = {'text': "Hi Sarath Kaul"}

response = requests.post(webhook_url, data=json.dumps(slack_data),headers={'Content-Type': 'application/json'})
print response.status_code

如果你想使用urllib

import json
import urllib.request

import urllib.parse


url = 'https://hooks.slack.com/services/YYYYYYYYY/XXXXXXXXXXX'
data = json.dumps({'text': "Sarath Kaul"}).encode('utf-8') #data should be in bytes
headers = {'Content-Type': 'application/json'}
req = urllib.request.Request(url, data, headers)
resp = urllib.request.urlopen(req)
response = resp.read()

print(response)

在不使用任何额外的库(如请求)的情况下,仍然可以使用 urllib 内置的 python3 模块进行 GET/POST。 下面是示例代码:

def sendSlack(message):

    req_param= {"From":"","Time":"","message":message}
    slack_data = {
            "blocks": [
                {
                    "type": "header",
                    "text": {
                        "type": "plain_text",
                        "text": "Message",
                    }
                },
                {
                    "type": "section",
                    "fields": [
                        {
                            "type": "mrkdwn",
                            "text": "*From:*\n{}".format(req_param['From'])
                        },
                        {
                            "type": "mrkdwn",
                            "text": "*Time:*\n{}".format(req_param['Time'])
                        }
                    ]
                },
                {
                    "type": "section",
                    "fields": [
                        {
                            "type": "mrkdwn",
                            "text": "*Message:*\n{}".format(req_param['message'])
                        }
                    ]
                }
            ]}
    
    req =  request.Request("https://hooks.slack.com/services/<COMPLETE THE URL>", data=json.dumps(slack_data).encode('utf-8')) # this will make the method "POST"
    resp = request.urlopen(req)
    print(resp.read())

确保在 slack 上发送正确的有效负载。 此代码对 AWS LAMBDA 也很有用。 请看下面的例子:

import json
from urllib import request

def sendSlack(message):
    req_param= {"From":"","StartTime":"now","DialWhomNumber":message}
    slack_data = {
        "blocks": [
            {
                "type": "header",
                "text": {
                    "type": "plain_text",
                    "text": "Message",
                }
            },
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": "*From:*\n{}".format(req_param['From'])
                    },
                    {
                        "type": "mrkdwn",
                        "text": "*Time:*\n{}".format(req_param['Time'])
                    }
                ]
            },
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": "*Message:*\n{}".format(req_param['message'])
                    }
                ]
            }
        ]}

    req =  request.Request("https://hooks.slack.com/services/<COMPLETE THE URL>", data=json.dumps(slack_data).encode('utf-8')) # this will make the method "POST"
    resp = request.urlopen(req)
    print(resp.read())



def lambda_handler(event, context):
    # TODO implement
    try:
        print("-->GOT A REQUEST",event['queryStringParameters'])
        sendSlack(event['queryStringParameters']['message'])
        return {'body':json.dumps({'status':200,'event':'accepted'})}
    except Exception as e:
        print("Exception happenned",e)
    return {
        'statusCode': 400,
        'body': json.dumps({'status':400,'event':'Something went wrong'})
    }
  • 希望它对您有所帮助,这里使用了一些不同的 aws 架构。 因此,即使在上述答案被接受后,也会考虑分享。
  • 所有要发布到 slack 上的消息都放在一个 SNS 主题上,然后由 lambda 读取,并使用 slack webhook url 发布到 slack 频道。
import os
import json
from urllib2 import Request, urlopen, URLError, HTTPError

# environment variables
SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL']
SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
SLACK_USER = os.environ['SLACK_USER']

def lambda_handler(event, context):
    # Read message posted on SNS Topic
    message = json.loads(event['Records'][0]['Sns']['Message'])

# Construct a new slack message
    slack_message = {
        'channel': SLACK_CHANNEL,
        'username': SLACK_USER,
        'text': "%s" % (message)
    }
# Post message on SLACK_WEBHOOK_URL
    req = Request(SLACK_WEBHOOK_URL, json.dumps(slack_message))
    try:
        response = urlopen(req)
        response.read()
        print(slack_message['channel'])
    except HTTPError as e:
        print(e)
    except URLError as e:
        print(e)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM