2016-05-17 12 views
1

Ich versuche ein Bild auf einem Slack-Kanal mit Web-Hooks zu posten. Diese grundlegende Einrichtung hat es mir ermöglicht, Text auf dem Kanal zu posten, aber ich konnte das Bild nicht posten. Hier ist mein Code:Bilder können nicht über Web-Hooks mit Python-Anfragen auf Slack-Kanal hochgeladen werden.

def posting(): 
    import requests 
    import json 

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

Wenn ich den Text posten, erscheint ein Web-Hook-Bot im Kanal und bucht es. Brauche ich eine weitere Authentifizierung zum Posten? Oder geht es darum, dass Slack eine eigene API zum Hochladen hat und möchte, dass ich das durchspiele? Oder etwas, etwas Bots haben keine Rechte, Bilder zu posten?

Ich habe mir hier ein paar andere Fragen angeschaut, aber sie schienen keine Web-Hooks oder Bots zu benutzen, also bin ich mir nicht sicher, ob mein Problem etwas mit diesen Themen ist.

+1

Ich bin nicht sicher, wie Sie auf dieser Nutzlast entschieden, aber vielleicht lesen https://api.slack.com/incoming-webhooks für die erwarteten Eingänge? (Ich glaube, Sie möchten JSON mit einem 'attachments'-Element senden.) – smarx

+0

Ich habe mir die slack-APIs angeschaut und es scheint, dass sie für Anhänge immer eine URL erwarten. Ich würde es vorziehen, einfach eine Datei aus einem Verzeichnis hochzuladen. Die Anforderungsbibliothek lässt es so erscheinen, als ob dies möglich wäre, aber ich bin nicht genug zum Codieren verwendet, um zu wissen, wann ich meinen Kopf gegen die Wand haue, um meinen ursprünglichen Plan zu verfolgen, anstatt nur mein Setup zu ändern, um mit der Dokumentation zu arbeiten von mir. Ist das eine dieser Zeiten? –

+0

Ich denke schon. Ich bin ziemlich sicher (laut Dokumentation), dass "eingehende Webhooks" keine Option haben, die das Hochladen einer Datei ermöglicht, also müssen Sie die Datei woanders ablegen und über eine URL anhängen. – smarx

Antwort

4

Sie können dies durch die Slack API ihre files.upload Methode: https://api.slack.com/methods/files.upload

Sie eine API-Auth-Token müssen für diese ordnungsgemäß funktioniert. Sie können eine Test Token oder folgen Sie den Anweisungen, um Ihr Programm registrieren einrichten, um ein langfristiges erhalten ein: https://api.slack.com/web#basics

Auch ‚Medien‘ nicht das Recht json Schlüssel zu sein scheinen für das Hochladen von Dateien zu verwenden:
http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

Hier ist ein Beispiel mit Anfragen zum Senden eines Bildes an einen Kanal. Verwenden Sie '@Benutzername', wenn das Bild an einen bestimmten Benutzer gesendet werden soll. Ich habe den Inhaltstyp und den Header eingefügt, aber es sollte auch ohne sie funktionieren. Dies wird die Antwort von Slack drucken.

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')