media.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import os
  4. from ..api.base import BaseWeChatAPI
  5. from ...type import RequestType
  6. from ...utils import sha256
  7. class Media(BaseWeChatAPI):
  8. def _media_upload(self, filepath, filename, path):
  9. if not (filepath and os.path.exists(filepath) and os.path.isfile(filepath) and path):
  10. raise Exception('filepath is not assigned or not exists')
  11. with open(filepath, mode = 'rb') as f:
  12. content = f.read()
  13. if not filename:
  14. filename = os.path.basename(filepath)
  15. params = {}
  16. params.update({'meta': '{"filename":"%s","sha256":"%s"}' % (filename, sha256(content))})
  17. mimes = {
  18. '.bmp': 'image/bmp',
  19. '.jpg': 'image/jpeg',
  20. '.jpeg': 'image/jpeg',
  21. '.png': 'image/png',
  22. '.avi': 'video/x-msvideo',
  23. '.wmv': 'video/x-ms-wmv',
  24. '.mpeg': 'video/mpeg',
  25. '.mp4': 'video/mp4',
  26. '.mov': 'video/quicktime',
  27. '.mkv': 'video/x-matroska',
  28. '.flv': 'video/x-flv',
  29. '.f4v': 'video/x-f4v',
  30. '.m4v': 'video/x-m4v',
  31. '.rmvb': 'application/vnd.rn-realmedia-vbr'
  32. }
  33. media_type = os.path.splitext(filename)[-1]
  34. if media_type not in mimes:
  35. raise Exception('wechatpayv3 does not support this media type.')
  36. files = [('file', (filename, content, mimes[media_type]))]
  37. return self.client.core.request(
  38. path, method = RequestType.POST, data = params, sign_data = params.get('meta'), files = files)
  39. def image_upload(self, filepath, filename = None):
  40. """图片上传
  41. :param filepath: 图片文件路径
  42. :param filename: 文件名称,未指定则从filepath参数中截取
  43. """
  44. return self._media_upload(filepath, filename, '/v3/merchant/media/upload')
  45. def video_upload(self, filepath, filename = None):
  46. """视频上传
  47. :param filepath: 视频文件路径
  48. :param filename: 文件名称,未指定则从filepath参数中截取
  49. """
  50. return self._media_upload(filepath, filename, '/v3/merchant/media/video_upload')