2016-05-17 39 views
1

我試圖使用網頁掛鉤將圖像發佈到Slack頻道。此基本設置允許我將文本發佈到頻道,但我無法發佈圖像。這裏是我的代碼:無法通過利用Python請求的Web鉤子將圖像發佈到Slack頻道

def posting(): 
    import requests 
    import json 

    url = 'https://webhook' 
    image = {'media': open('trial.jpg', 'rb')} 
    r = requests.post(url, files=image) 
    r.json 

當我發佈文本時,網絡鉤子機器人出現在頻道併發布它。我是否需要進一步的身份驗證才能發佈?或者這是Slack有自己的API上傳的問題,並希望我通過這些?或者某些機器人無權發佈圖像?

我在這裏看了一些其他的問題,但他們似乎沒有使用Web鉤子或機器人,所以我不確定我的問題是否涉及這些問題。

+1

我不知道你是如何決定對有效載荷,但也許讀https://api.slack.com/incoming-webhooks的預期投入? (我想你想用附件元素髮送JSON。) – smarx

+0

我看了一下鬆懈的API,看起來對於附件,他們總是期待着一個URL。我寧願簡單地上傳目錄中的文件。請求庫使得它看起來像這樣是可能的,但是我沒有足夠的編碼來知道什麼時候我的頭靠在牆上按照我原來的計劃,而不是僅僅改變我的設置以在前面的文檔中工作我的。那是那一次? –

+0

我這麼認爲。我很確定(根據文檔)「傳入的webhooks」沒有任何允許上傳文件的選項,因此您需要將文件放在其他地方並通過URL附加。 – smarx

回答

4

您可以使用他們的files.upload方法通過鬆弛API做到這一點:https://api.slack.com/methods/files.upload

您將需要一個API身份驗證令牌這才能正常工作。您可以設置一個測試令牌或按照說明註冊程序以獲得長期的一個:https://api.slack.com/web#basics

而且,「媒體」似乎並沒有被正確的JSON鍵使用文件上傳:
http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

下面是使用請求將圖像發送到頻道的示例。如果您希望圖片轉到特定用戶,請使用'@username'。我已經包含了內容類型和標題,但它應該沒有它們。 這將打印Slack的響應。

import requests 

def post_image(filename, token, channels): 
    f = {'file': (filename, open(filename, 'rb'), 'image/png', {'Expires':'0'})} 
    response = requests.post(url='https://slack.com/api/files.upload', data= 
     {'token': token, 'channels': channels, 'media': f}, 
     headers={'Accept': 'application/json'}, files=f) 
    return response.text 

print post_image(filename='path/to/file.png', token='xxxxx-xxxxxxxxx-xxxx', 
    channels ='#general')