4

我可以通过传入的 webhook 将文本发送到Mattermost频道

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

此代码只是发布文本。我找不到将文件发布到频道的方法。假设我想发布位于 /home/alok/Downloads/Screenshot_20170217_221447.png 的文件。如果有人知道请分享。

4

3 回答 3

6

您目前无法使用传入 Webhooks API 附加文件。您需要使用Mattermost 客户端 API来发布附有文件的帖子。

这是一个如何实现这一目标的示例(使用 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',
}))
于 2017-03-01T09:46:25.363 回答
5

我已经使用个人访问令牌为 API v4 制作了一个版本。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 ]
}))

编辑:

我创建了一个简单的 CLI。 https://github.com/Tim-Schwalbe/python_mattermost

于 2019-04-16T15:52:13.177 回答
0

根据 @George ,您不能直接将文件发送到传入的 webhook。

下面是将文件发送到频道的代码

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()
于 2019-07-22T13:13:00.810 回答