Skip to content

Commit

Permalink
Merge pull request #17 from VeryCB/media_reply
Browse files Browse the repository at this point in the history
support multimedia reply
  • Loading branch information
tonyseek committed Mar 12, 2016
2 parents 292433e + d9219e7 commit abf0b50
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
*.pyc
*.pyo
*.egg
*.egg-info
__pycache__
bin
Expand Down
54 changes: 52 additions & 2 deletions flask_weixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ def reply(self, username, type='text', sender=None, **kwargs):
"""Create the reply text for weixin.
The reply varies per reply type. The acceptable types are `text`,
`music` and `news`. Each type accepts different parameters, but
they share some common parameters:
`music`, `news`, `image`, `voice`, `video`. Each type accepts
different parameters, but they share some common parameters:
* username: the receiver's username
* type: the reply type, aka text, music and news
Expand All @@ -211,6 +211,14 @@ def reply(self, username, type='text', sender=None, **kwargs):
* description: A string for article description
* picurl: A link for article cover image
* url: A link for article url
Image and Voice reply requires an additional parameter of `media_id`.
Video reply requires 3 more parameters:
* media_id: A string for video `media_id`
* title: A string for video title
* description: A string for video description
"""
sender = sender or self.sender
if not sender:
Expand All @@ -235,6 +243,20 @@ def reply(self, username, type='text', sender=None, **kwargs):
return transfer_customer_service_reply(username, sender,
service_account)

if type == 'image':
media_id = kwargs.get('media_id', '')
return image_reply(username, sender, media_id)

if type == 'voice':
media_id = kwargs.get('media_id', '')
return voice_reply(username, sender, media_id)

if type == 'video':
values = {}
for k in ('media_id', 'title', 'description'):
values[k] = kwargs.get(k)
return video_reply(username, sender, **values)

def register(self, key=None, func=None, **kwargs):
"""Register a command helper function.
Expand Down Expand Up @@ -417,6 +439,34 @@ def transfer_customer_service_reply(username, sender, service_account):
return template % dct


def image_reply(username, sender, media_id):
shared = _shared_reply(username, sender, 'image')
template = '<xml>%s<Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>'
return template % (shared, media_id)


def voice_reply(username, sender, media_id):
shared = _shared_reply(username, sender, 'voice')
template = '<xml>%s<Voice><MediaId><![CDATA[%s]]></MediaId></Voice></xml>'
return template % (shared, media_id)


def video_reply(username, sender, **kwargs):
kwargs['shared'] = _shared_reply(username, sender, 'video')

template = (
'<xml>'
'%(shared)s'
'<Video>'
'<MediaId><![CDATA[%(media_id)s]]></MediaId>'
'<Title><![CDATA[%(title)s]]></Title>'
'<Description><![CDATA[%(description)s]]></Description>'
'</Video>'
'</xml>'
)
return template % kwargs


def _shared_reply(username, sender, type):
dct = {
'username': username,
Expand Down
33 changes: 33 additions & 0 deletions test_weixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,22 @@ def print_all(**kwargs):
return weixin.reply(
username, type='customer_service', sender=sender,
service_account='foo@bar')
elif content == 'image':
return weixin.reply(
username, type='image', sender=sender,
media_id='weixin_image'
)
elif content == 'voice':
return weixin.reply(
username, type='voice', sender=sender,
media_id='weixin_voice'
)
elif content == 'video':
return weixin.reply(
username, type='video', sender=sender,
media_id='weixin_video', title='Hello Video',
description='Hello Video Description'
)
else:
return weixin.reply(
username, sender=sender, content='text reply'
Expand Down Expand Up @@ -294,6 +310,23 @@ def test_customer_service_to_foo(self):
assert b'transfer_customer_service' in rv.data
assert b'foo@bar' in rv.data

def test_image(self):
text = self.__doc__ % 'image'
rv = self.client.post(signature_url, data=text)
assert b'weixin_image' in rv.data

def test_voice(self):
text = self.__doc__ % 'voice'
rv = self.client.post(signature_url, data=text)
assert b'weixin_voice' in rv.data

def test_video(self):
text = self.__doc__ % 'video'
rv = self.client.post(signature_url, data=text)
assert b'weixin_video' in rv.data
assert b'Hello Video' in rv.data
assert b'Hello Video Description' in rv.data

@raises(RuntimeError)
def test_no_sender(self):
@self.weixin.register('send')
Expand Down

0 comments on commit abf0b50

Please sign in to comment.