5

I am able to send text to Mattermost channel through incoming webhooks

import requests, json
URL = 'http://chat.something.com/hooks/1pgrmsj88qf5jfjb4eotmgfh5e'
payload = {"channel": "general", "text": "some text"}
r = requests.post(URL, data=json.dumps(payload))

this code simplly post text. I could not find a way to post file to channel. Suppose I want to post file located at /home/alok/Downloads/Screenshot_20170217_221447.png. If anyone know please share.

Alok
  • 7,734
  • 8
  • 55
  • 100

3 Answers3

8

You can't currently attach files using the Incoming Webhooks API. You would need to use the Mattermost Client API to make a post with files attached to it.

Here's an example of how you could achieve that (using Mattermost API v3 for Mattermost >= 3.5)

SERVER_URL = "http://chat.example.com/"
TEAM_ID = "team_id_goes_here"
CHANNEL_ID = "channel_id_goes_here"
USER_EMAIL = "you@example.com"
USER_PASS = "password123"
FILE_PATH = '/home/user/thing_to_upload.png'

import requests, json, os

# Login
s = requests.Session() # So that the auth cookie gets saved.
s.headers.update({"X-Requested-With": "XMLHttpRequest"}) # To stop Mattermost rejecting our requests as CSRF.

l = s.post(SERVER_URL + 'api/v3/users/login', data = json.dumps({'login_id': USER_EMAIL, 'password': USER_PASS}))

USER_ID = l.json()["id"]

# Upload the File.
form_data = {
        "channel_id": ('', CHANNEL_ID),
        "client_ids": ('', "id_for_the_file"),
        "files": (os.path.basename(FILE_PATH), open(FILE_PATH, 'rb')),
}
r = s.post(SERVER_URL + 'api/v3/teams/' + TEAM_ID + '/files/upload', files=form_data)

FILE_ID = r.json()["file_infos"][0]["id"]

# Create a post and attach the uploaded file to it.
p = s.post(SERVER_URL + 'api/v3/teams/' + TEAM_ID + '/channels/' + CHANNEL_ID + '/posts/create', data = json.dumps({
    'user_id': USER_ID,
    'channel_id': CHANNEL_ID,
    'message': 'Post message goes here',
    'file_ids': [FILE_ID,],
    'create_at': 0,
    'pending_post_id': 'randomstuffogeshere',
}))
George
  • 497
  • 6
  • 11
7

I have done a version for API v4, with the use of a personal access token. https://docs.mattermost.com/developer/personal-access-tokens.html

import os
import json
import requests
SERVER_URL = "YOUR_SERVER_URL"
CHANNEL_ID = "YOUR_CHANNEL_ID"
FILE_PATH = './test.jpg'

s = requests.Session()
s.headers.update({"Authorization": "Bearer YOUR_PERSONAL_ACCESS_TOKEN"})

form_data = {
    "channel_id": ('', CHANNEL_ID),
    "client_ids": ('', "id_for_the_file"),
    "files": (os.path.basename(FILE_PATH), open(FILE_PATH, 'rb')),
}
r = s.post(SERVER_URL + '/api/v4/files', files=form_data)

FILE_ID = r.json()["file_infos"][0]["id"]

p = s.post(SERVER_URL + '/api/v4/posts', data=json.dumps({
    "channel_id": CHANNEL_ID,
    "message": "YOUR_MESSAGE",
    "file_ids": [ FILE_ID ]
}))

EDIT:

I have created a simple CLI. https://github.com/Tim-Schwalbe/python_mattermost

Tim Schwalbe
  • 1,588
  • 4
  • 19
  • 37
0

as per @George , you cann't sent the file to the incoming webhook directly.

below is code to send the file to the channel

from mattermostdriver import Driver

team_name = "<name of your team in mattermost>"
channel_name = "<channel name>"  # name of channel which you want to upload document
file_path = "<file to uploaded >"  # name of the file to upload
message = "<message to sent on channel>"


options = {
    "url": "",  # url of your mattermost acocunt https://<url>
    "port": 8065,  # port of the website
    "password": "<account password>",
    "login_id": "<login id>",
    "token": None
}

x = Driver(options=options)

# loggin into the mattermost server
x.login()

# getting team id
team_id = x.teams.get_team_by_name(team_name)['id']

# getting channel id
channel_id = x.channels.get_channel_by_name(team_id, channel_name)['id']  # give channel id

#setting up the options
form_data = {
    "channel_id": ('', channel_id),
    "client_ids": ('', "id_for_the_file"),
    "files": (file_path, open(file_path, 'rb'))
}

pp = x.files.upload_file(channel_id, form_data)
file_id = pp['file_infos'][0]['id']

# uploading the file
x.posts.create_post({'channel_id': channel_id, "message": message, "file_ids": [file_id]})

# logout from the server
x.logout()
sahasrara62
  • 10,069
  • 3
  • 29
  • 44