2020년 11월 8일 일요일

upload file in mattermost (mattermost 에서 파일 올리기) python

 

기본 코드는 아래 링크에서 출발합니다.

https://github.com/attzonko/mmpy_bot


내용중에 아래 내용도 있긴하지만, 잘 동작되지는 잘모르겠습니다.

File Support

from mmpy_bot.bot import respond_to


@respond_to('files')
def message_with_file(message):
    # upload_file() can upload only one file at a time
    # If you have several files to upload, you need call this function several times.
    file = open('test.txt')
    result = message.upload_file(file)
    file.close()
    if 'file_infos' not in result:
        message.reply('upload file error')
    file_id = result['file_infos'][0]['id']
    # file_id need convert to array
    message.reply('hello', [file_id])


아래는 직접 동작 확인된 코드 입니다.

upload를 하기위해서는 먼저 파일을 POST form multipart로 업로드를 하고 해당 id를 받아와서 다시 post 를 하는 방법입니다. 

대략 아래와 같은 코드가 되고 특정 channel_id를 가진 방에 파일을 올리고 문구는 "file" 이라는 문구와 함께 올리게 됩니다.

def upload_file(self, file, channel_id):
  files = {'upload_file':open(file, 'rb')}
  response = json.loads(requests.post(
    self.url + '/files?channel_id='+channel_id,
    headers=self._get_headers(),
    files=files,
    verify=self.ssl_verify
  ).text)
  file_id=response['file_infos'][0]['id']
  self.create_post(None,channel_id,"file",[file_id])

코드 설명을 하자면, 

이 부분은 특정 채널에 파일을 POST로 업로하는 코드 입니다.

requests.post(
    self.url + '/files?channel_id='+channel_id,
    headers=self._get_headers(),
    files=files,
    verify=self.ssl_verify

여기에서 headers는 아래 링크에 있는 코드와 동일합니다.

https://github.com/attzonko/mmpy_bot/blob/master/mmpy_bot/mattermost.py

def _get_headers(self):

return {"Authorization": "Bearer " + self.token}


SSL 부분도 false로 해주면 됩니다.

self.ssl_verify = ssl_verify


create_post 부분도 동일합니다.

    def create_post(self, user_id, channel_id, message,
                    files=None, pid="", props=None):
        return self.post(
            '/posts',
            {
                'channel_id': channel_id,
                'message': message,
                'file_ids': files or [],
                'root_id': pid,
                'props': props or {}
            })





댓글 없음:

댓글 쓰기