【问题标题】:Is it possible to make a POST request to Slack with AWS Lambda using only native libraries?是否可以仅使用本机库通过 AWS Lambda 向 Slack 发出 POST 请求?
【发布时间】:2019-11-10 16:15:41
【问题描述】:

我正在尝试使用 webhook 向 Slack 发出 POST 请求。我可以在本地向我的 Slack 实例发送 curl,但是在 lambda 中尝试这样做时,我在尝试发送有效负载时遇到了麻烦。

我所看到的一切都表明我必须使用和压缩自定义库,但出于我正在做的事情的目的,我需要使用本机 python 代码。有没有办法发送这个 POST 请求?

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

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

这段代码给了我一个 400 错误,这就是我知道我正在访问我想要的 URL(URL 在 message 变量中)但是每次通过添加标题和文本正文来发送有效负载的尝试似乎都失败了。

【问题讨论】:

  • 如果没有“data”参数,请求方法被认为是GET,而不是POST。检查here
  • 把参数改成data,还是400错误。
  • 1) 添加数据(dict) 以进行发布请求。 2)将数据序列化的obj转成JSON格式的str,然后用ascii格式编码data = json.dumps(data).encode('ascii')

标签: python amazon-web-services aws-lambda http-post webhooks


【解决方案1】:

你可以尝试如下:

SLACK_URL = 'https://hooks.slack.com/services/....'

req = urllib.request.Request(SLACK_URL, json.dumps(message).encode('utf-8'))
response = urllib.request.urlopen(req)

【讨论】:

  • 我仍然收到相同的错误请求 400 错误,这意味着有效负载未正确发送。
  • 编码应该是ascii类型。 json.dumps(message).encode('ascii')
  • @SupratimSamantray - 你如何解码响应?
【解决方案2】:
  • 请查找随附的 lambda_handler 代码,希望对您有所帮助。
  • 要发布到 slack 上的所有消息都放在一个 SNS 主题上,然后由 lambda 读取并使用 slack webhook url 发布到 slack 频道。
import os
import json
from urllib2 import Request, urlopen, URLError, HTTPError

# Get the 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'])

# New slack message is created
    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)

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2020-03-18
    相关资源
    最近更新 更多