代码之家  ›  专栏  ›  技术社区  ›  ddgd

从Slack bot访问Slack文件

  •  24
  • ddgd  · 技术社区  · 9 年前

    我需要一个能够接收和保存从松弛聊天室发送的文件的松弛机器人。

    问题是:slack不发送文件内容,而是发送指向文件的链接数组。包括下载链接在内的大多数链接都是私有的,无法通过bot访问。它确实发送了一个公共链接,但该链接指向文件预览,该预览没有文件本身( here's an example ).

    如何通过机器人访问上传的文件?

    4 回复  |  直到 2 年前
        1
  •  32
  •   Erik Kalkoken    5 年前

    在执行CURL请求时,通过在HTTP头中提供访问令牌,可以从bot访问私有URL。

    您的令牌需要具有作用域 files.read 以便获得访问。

    格式为:

    Authorization: Bearer A_VALID_TOKEN
    

    将A_VALID_TOKEN替换为松弛访问令牌。

    我刚刚用一个简单的PHP脚本测试了它,通过它的“url_private”检索文件,它运行得很好。

    资料来源: Slack API documententation / file object / Authentication

        2
  •  12
  •   Maik Röder    8 年前

    使用Python的示例 requests 库以获取示例文件:

    import requests
    url = 'https://slack-files.com/T0JU09BGC-F0UD6SJ21-a762ad74d3'
    token = 'xoxp-8853424449-8820034832-8891394196-faf6f0'
    requests.get(url, headers={'Authorization': 'Bearer %s' % token})
    
        3
  •  3
  •   turiyag    8 年前

    对于那些想用Bash&cURL,这里有一个有用的函数!它将使用唯一标识文件的文件名将文件下载到当前目录,即使该文件与文件列表中的其他文件同名。

    function slack_download {
      URL="$1";
      TOKEN="$2"
      FILENAME=`echo "$URL" | sed -r 's/.*\/(T.+)\/([^\/]+)$/\1-\2/'`; 
      curl -o "$FILENAME" -H "Authorization: Bearer $TOKEN" "$URL"; 
    }
    # Usage: 
    # Downloads as ./TJOLLYDAY-FANGBEARD-NSFW_PIC.jpg
    slack_download "https://files.slack.com/files-pri/TJOLLYDAY-FANGBEARD/NSFW_PIC.jpg" xoxp-12345678901-01234567890-123456789012-abcdef0123456789abcdef0123456789
    
        4
  •  0
  •   csghone    5 年前

    使用Python3进行测试-只需将SLACK_TOKEN替换为令牌即可。 下载并创建输出文件。

    #!/usr/bin/env python3
    # Usage: python3 download_files_from_slack.py <URL>
    
    import sys
    import re
    import requests
    
    url = " ".join(sys.argv[1:])
    
    token = 'SLACK_TOKEN'
    resp = requests.get(url, headers={'Authorization': 'Bearer %s' % token})
    
    headers = resp.headers['content-disposition']
    fname = re.findall("filename=(.*?);", headers)[0].strip("'").strip('"')
    
    assert not os.path.exists(fname), print("File already exists. Please remove/rename and re-run")
    out_file = open(fname, mode="wb+")
    out_file.write(resp.content)
    out_file.close()