Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FileMessage #65

Merged
merged 2 commits into from
Sep 12, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,11 @@ Message
- id
- package\_id
- sticker\_id
_ FileMessage
- type
- id
- file\_size
- file\_name

Hints
-----
Expand Down
21 changes: 20 additions & 1 deletion examples/flask-kitchensink/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
PostbackTemplateAction, DatetimePickerTemplateAction,
CarouselTemplate, CarouselColumn, PostbackEvent,
StickerMessage, StickerSendMessage, LocationMessage, LocationSendMessage,
ImageMessage, VideoMessage, AudioMessage,
ImageMessage, VideoMessage, AudioMessage, FileMessage,
UnfollowEvent, FollowEvent, JoinEvent, LeaveEvent, BeaconEvent
)

Expand Down Expand Up @@ -231,6 +231,25 @@ def handle_content_message(event):
])


@handler.add(MessageEvent, message=FileMessage)
def handle_file_message(event):
message_content = line_bot_api.get_message_content(event.message.id)
with tempfile.NamedTemporaryFile(dir=static_tmp_path, prefix='file-', delete=False) as tf:
for chunk in message_content.iter_content():
tf.write(chunk)
tempfile_path = tf.name

dist_path = tempfile_path + '-' + event.message.file_name
dist_name = os.path.basename(dist_path)
os.rename(tempfile_path, dist_path)

line_bot_api.reply_message(
event.reply_token, [
TextSendMessage(text='Save file.'),
TextSendMessage(text=request.host_url + os.path.join('static', 'tmp', dist_name))
])


@handler.add(FollowEvent)
def handle_follow(event):
line_bot_api.reply_message(
Expand Down
1 change: 1 addition & 0 deletions linebot/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
AudioMessage,
LocationMessage,
StickerMessage,
FileMessage
)
from .responses import ( # noqa
Profile,
Expand Down
6 changes: 4 additions & 2 deletions linebot/models/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
VideoMessage,
AudioMessage,
LocationMessage,
StickerMessage
StickerMessage,
FileMessage
)
from .sources import SourceUser, SourceGroup, SourceRoom

Expand Down Expand Up @@ -93,7 +94,8 @@ def __init__(self, timestamp=None, source=None, reply_token=None, message=None,
'video': VideoMessage,
'audio': AudioMessage,
'location': LocationMessage,
'sticker': StickerMessage
'sticker': StickerMessage,
'file': FileMessage
}
)

Expand Down
24 changes: 24 additions & 0 deletions linebot/models/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,27 @@ def __init__(self, id=None, package_id=None, sticker_id=None, **kwargs):
self.type = 'sticker'
self.package_id = package_id
self.sticker_id = sticker_id


class FileMessage(Message):
"""FileMessage.

https://devdocs.line.me/en/#file-message

Message object which contains the file content sent from the source.
The binary file data can be retrieved with the Content API.
"""

def __init__(self, id=None, file_name=None, file_size=None, **kwargs):
"""__init__ method.

:param str id: Message ID
:param str file_name: File Name
:param int file_size: File Size
:param kwargs:
"""
super(FileMessage, self).__init__(id=id, **kwargs)

self.type = 'file'
self.file_size = file_size
self.file_name = file_name
17 changes: 16 additions & 1 deletion tests/test_webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
MessageEvent, FollowEvent, UnfollowEvent, JoinEvent,
LeaveEvent, PostbackEvent, BeaconEvent,
TextMessage, ImageMessage, VideoMessage, AudioMessage,
LocationMessage, StickerMessage,
LocationMessage, StickerMessage, FileMessage,
SourceUser, SourceRoom, SourceGroup
)

Expand Down Expand Up @@ -291,6 +291,21 @@ def test_parse(self):
self.assertEqual(events[17].postback.data, 'action=buyItem&itemId=123123&color=red')
self.assertEqual(events[17].postback.params['datetime'], '2013-04-01T10:00')

# MessageEvent, SourceUser, FileMessage
self.assertIsInstance(events[18], MessageEvent)
self.assertEqual(events[18].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[18].type, 'message')
self.assertEqual(events[18].timestamp, 1462629479859)
self.assertIsInstance(events[18].source, SourceUser)
self.assertEqual(events[18].source.type, 'user')
self.assertEqual(events[18].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[18].source.sender_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertIsInstance(events[18].message, FileMessage)
self.assertEqual(events[18].message.id, '325708')
self.assertEqual(events[18].message.type, 'file')
self.assertEqual(events[18].message.file_name, "file.txt")
self.assertEqual(events[18].message.file_size, 2138)


class TestWebhookHandler(unittest.TestCase):
def setUp(self):
Expand Down
15 changes: 15 additions & 0 deletions tests/text/webhook.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,21 @@
"datetime": "2013-04-01T10:00"
}
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"message": {
"id": "325708",
"type": "file",
"fileName": "file.txt",
"fileSize": 2138
}
}
]
}