Skip to content

Commit be61366

Browse files
authored
Merge pull request #28 from line/add-multicast-api
Support multicast API
2 parents 4cdd421 + 3cc82d6 commit be61366

11 files changed

+236
-1
lines changed

README.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ https://devdocs.line.me/en/#push-message
114114
115115
line_bot_api.push_message(to, TextSendMessage(text='Hello World!'))
116116
117+
multicast(self, to, messages, timeout=None)
118+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119+
120+
Send messages to multiple users at any time.
121+
122+
https://devdocs.line.me/en/#multicast
123+
124+
.. code:: python
125+
126+
line_bot_api.multicast(['to1', 'to2'], TextSendMessage(text='Hello World!'))
127+
128+
117129
get\_profile(self, user\_id, timeout=None)
118130
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119131

linebot/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from __future__ import unicode_literals
1818

19-
__version__ = '1.0.2'
19+
__version__ = '1.1.0'
2020
__author__ = 'LINE Corporation'
2121
__copyright__ = 'Copyright 2016, LINE Corporation'
2222
__license__ = 'Apache 2.0'

linebot/api.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,38 @@ def push_message(self, to, messages, timeout=None):
124124
'/v2/bot/message/push', data=json.dumps(data), timeout=timeout
125125
)
126126

127+
def multicast(self, to, messages, timeout=None):
128+
"""Call multicast API.
129+
130+
https://devdocs.line.me/en/#multicast
131+
132+
Send messages to multiple users at any time.
133+
134+
:param to: IDs of the receivers
135+
Max: 150 users
136+
:type to: list[str]
137+
:param messages: Messages.
138+
Max: 5
139+
:type messages: T <= :py:class:`linebot.models.send_messages.SendMessage` |
140+
list[T <= :py:class:`linebot.models.send_messages.SendMessage`]
141+
:param timeout: (optional) How long to wait for the server
142+
to send data before giving up, as a float,
143+
or a (connect timeout, readtimeout) float tuple.
144+
Default is self.http_client.timeout
145+
:type timeout: float | tuple(float, float)
146+
"""
147+
if not isinstance(messages, (list, tuple)):
148+
messages = [messages]
149+
150+
data = {
151+
'to': to,
152+
'messages': [message.as_json_dict() for message in messages]
153+
}
154+
155+
self._post(
156+
'/v2/bot/message/multicast', data=json.dumps(data), timeout=timeout
157+
)
158+
127159
def get_profile(self, user_id, timeout=None):
128160
"""Call get profile API.
129161

tests/api/test_send_audio_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -88,6 +89,29 @@ def test_reply_audio_message(self):
8889
}
8990
)
9091

92+
@responses.activate
93+
def test_multicast_audio_message(self):
94+
responses.add(
95+
responses.POST,
96+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
97+
json={}, status=200
98+
)
99+
100+
self.tested.multicast(['to1', 'to2'], self.audio_message)
101+
102+
request = responses.calls[0].request
103+
self.assertEqual(request.method, 'POST')
104+
self.assertEqual(
105+
request.url,
106+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
107+
self.assertEqual(
108+
json.loads(request.body),
109+
{
110+
"to": ['to1', 'to2'],
111+
"messages": self.message
112+
}
113+
)
114+
91115

92116
if __name__ == '__main__':
93117
unittest.main()

tests/api/test_send_image_message.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,29 @@ def test_reply_image_message(self):
8888
}
8989
)
9090

91+
@responses.activate
92+
def test_multicast_image_message(self):
93+
responses.add(
94+
responses.POST,
95+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
96+
json={}, status=200
97+
)
98+
99+
self.tested.multicast(['to1', 'to2'], self.image_message)
100+
101+
request = responses.calls[0].request
102+
self.assertEqual(request.method, 'POST')
103+
self.assertEqual(
104+
request.url,
105+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
106+
self.assertEqual(
107+
json.loads(request.body),
108+
{
109+
"to": ['to1', 'to2'],
110+
"messages": self.message
111+
}
112+
)
113+
91114

92115
if __name__ == '__main__':
93116
unittest.main()

tests/api/test_send_imagemap_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -129,6 +130,29 @@ def test_reply_imagemap_message(self):
129130
}
130131
)
131132

133+
@responses.activate
134+
def test_multicast_imagemap_message(self):
135+
responses.add(
136+
responses.POST,
137+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
138+
json={}, status=200
139+
)
140+
141+
self.tested.multicast(['to1', 'to2'], self.imagemap_message)
142+
143+
request = responses.calls[0].request
144+
self.assertEqual(request.method, 'POST')
145+
self.assertEqual(
146+
request.url,
147+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
148+
self.assertEqual(
149+
json.loads(request.body),
150+
{
151+
"to": ['to1', 'to2'],
152+
"messages": self.message
153+
}
154+
)
155+
132156

133157
if __name__ == '__main__':
134158
unittest.main()

tests/api/test_send_location_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -91,6 +92,29 @@ def test_reply_location_message(self):
9192
}
9293
)
9394

95+
@responses.activate
96+
def test_multicast_location_message(self):
97+
responses.add(
98+
responses.POST,
99+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
100+
json={}, status=200
101+
)
102+
103+
self.tested.multicast(['to1', 'to2'], self.location_message)
104+
105+
request = responses.calls[0].request
106+
self.assertEqual(request.method, 'POST')
107+
self.assertEqual(
108+
request.url,
109+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
110+
self.assertEqual(
111+
json.loads(request.body),
112+
{
113+
"to": ['to1', 'to2'],
114+
"messages": self.message
115+
}
116+
)
117+
94118

95119
if __name__ == '__main__':
96120
unittest.main()

tests/api/test_send_sticker_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -86,6 +87,29 @@ def test_reply_sticker_message(self):
8687
}
8788
)
8889

90+
@responses.activate
91+
def test_multicast_sticker_message(self):
92+
responses.add(
93+
responses.POST,
94+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
95+
json={}, status=200
96+
)
97+
98+
self.tested.multicast(['to1', 'to2'], self.sticker_message)
99+
100+
request = responses.calls[0].request
101+
self.assertEqual(request.method, 'POST')
102+
self.assertEqual(
103+
request.url,
104+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
105+
self.assertEqual(
106+
json.loads(request.body),
107+
{
108+
"to": ['to1', 'to2'],
109+
"messages": self.message
110+
}
111+
)
112+
89113

90114
if __name__ == '__main__':
91115
unittest.main()

tests/api/test_send_template_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -361,6 +362,29 @@ def test_reply_carousel_template_message(self):
361362
}
362363
)
363364

365+
@responses.activate
366+
def test_multicast_carousel_template_message(self):
367+
responses.add(
368+
responses.POST,
369+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
370+
json={}, status=200
371+
)
372+
373+
self.tested.multicast(['to1', 'to2'], self.carousel_template_message)
374+
375+
request = responses.calls[0].request
376+
self.assertEqual(request.method, 'POST')
377+
self.assertEqual(
378+
request.url,
379+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
380+
self.assertEqual(
381+
json.loads(request.body),
382+
{
383+
"to": ['to1', 'to2'],
384+
"messages": self.carousel_message
385+
}
386+
)
387+
364388

365389
if __name__ == '__main__':
366390
unittest.main()

tests/api/test_send_text_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -80,6 +81,29 @@ def test_reply_text_message(self):
8081
}
8182
)
8283

84+
@responses.activate
85+
def test_multicast_text_message(self):
86+
responses.add(
87+
responses.POST,
88+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
89+
json={}, status=200
90+
)
91+
92+
self.tested.multicast(['to1', 'to2'], self.text_message)
93+
94+
request = responses.calls[0].request
95+
self.assertEqual(
96+
request.url,
97+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
98+
self.assertEqual(request.method, 'POST')
99+
self.assertEqual(
100+
json.loads(request.body),
101+
{
102+
"to": ['to1', 'to2'],
103+
"messages": self.message
104+
}
105+
)
106+
83107

84108
if __name__ == '__main__':
85109
unittest.main()

tests/api/test_send_video_message.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import responses
21+
2122
from linebot import (
2223
LineBotApi
2324
)
@@ -87,6 +88,29 @@ def test_reply_video_message(self):
8788
}
8889
)
8990

91+
@responses.activate
92+
def test_multicast_video_message(self):
93+
responses.add(
94+
responses.POST,
95+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast',
96+
json={}, status=200
97+
)
98+
99+
self.tested.multicast(['to1', 'to2'], self.video_message)
100+
101+
request = responses.calls[0].request
102+
self.assertEqual(request.method, 'POST')
103+
self.assertEqual(
104+
request.url,
105+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/message/multicast')
106+
self.assertEqual(
107+
json.loads(request.body),
108+
{
109+
"to": ['to1', 'to2'],
110+
"messages": self.message
111+
}
112+
)
113+
90114

91115
if __name__ == '__main__':
92116
unittest.main()

0 commit comments

Comments
 (0)