Skip to content

Commit 29174e9

Browse files
authored
Implement issue link token API (#169)
* Implement issue link token API * Write document * polish
1 parent 4ab7a9c commit 29174e9

File tree

6 files changed

+108
-3
lines changed

6 files changed

+108
-3
lines changed

README.rst

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,18 @@ https://developers.line.biz/en/reference/messaging-api/#cancel-default-rich-menu
425425
426426
line_bot_api.cancel_default_rich_menu()
427427
428+
issue\_link\_token(self, user\_id, timeout=None)
429+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
430+
431+
Issues a link token used for the account link feature.
432+
433+
https://developers.line.biz/en/reference/messaging-api/#issue-link-token
434+
435+
.. code:: python
436+
437+
link_token_response = line_bot_api.issue_link_token(<user_id>)
438+
print(link_token_response)
439+
428440
※ Error handling
429441
^^^^^^^^^^^^^^^^
430442

@@ -969,7 +981,6 @@ And more... TBD
969981
:target: https://badge.fury.io/py/line-bot-sdk
970982
.. |Documentation Status| image:: https://readthedocs.org/projects/line-bot-sdk-python/badge/?version=latest
971983
:target: http://line-bot-sdk-python.readthedocs.io/en/latest/?badge=latest
972-
973984

974985
License
975986
--------

examples/flask-kitchensink/app.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,13 @@ def handle_text_message(event):
362362
action=LocationAction(label="label6")
363363
),
364364
])))
365+
elif text == 'link_token' and isinstance(event.source, SourceUser):
366+
link_token_response = line_bot_api.issue_link_token(event.source.user_id)
367+
line_bot_api.reply_message(
368+
event.reply_token, [
369+
TextSendMessage(text='link_token: ' + link_token_response.link_token)
370+
]
371+
)
365372
else:
366373
line_bot_api.reply_message(
367374
event.reply_token, TextSendMessage(text=event.message.text))

linebot/api.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from .http_client import HttpClient, RequestsHttpClient
2424
from .models import (
2525
Error, Profile, MemberIds, Content, RichMenuResponse, MessageQuotaResponse,
26-
MessageQuotaConsumptionResponse, MessageDeliveryBroadcastResponse
26+
MessageQuotaConsumptionResponse, MessageDeliveryBroadcastResponse, IssueLinkTokenResponse
2727
)
2828

2929

@@ -738,6 +738,23 @@ def get_message_quota_consumption(self, timeout=None):
738738

739739
return MessageQuotaConsumptionResponse.new_from_json_dict(response.json)
740740

741+
def issue_link_token(self, user_id, timeout=None):
742+
"""Issues a link token used for the account link feature.
743+
744+
https://developers.line.biz/en/reference/messaging-api/#issue-link-token
745+
746+
:param str user_id: User ID for the LINE account to be linked
747+
:type timeout: float | tuple(float, float)
748+
"""
749+
response = self._post(
750+
'/v2/bot/user/{user_id}/linkToken'.format(
751+
user_id=user_id
752+
),
753+
timeout=timeout
754+
)
755+
756+
return IssueLinkTokenResponse.new_from_json_dict(response.json)
757+
741758
def _get(self, path, params=None, headers=None, stream=False, timeout=None):
742759
url = self.endpoint + path
743760

linebot/models/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@
9999
MessageQuotaResponse,
100100
MessageQuotaConsumptionResponse,
101101
MessageDeliveryBroadcastResponse,
102-
Content as MessageContent, # backward compatibility
102+
Content as MessageContent, # backward compatibility,
103+
IssueLinkTokenResponse,
103104
)
104105
from .rich_menu import ( # noqa
105106
RichMenu,

linebot/models/responses.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,20 @@ def __init__(self, status=None, success=None, **kwargs):
207207

208208
self.status = status
209209
self.success = success
210+
211+
212+
class IssueLinkTokenResponse(Base):
213+
"""IssueLinkTokenResponse.
214+
215+
https://developers.line.biz/en/reference/messaging-api/#issue-link-token
216+
"""
217+
218+
def __init__(self, link_token=None, **kwargs):
219+
"""__init__ method.
220+
221+
:param str link_token: Link token.
222+
:param kwargs:
223+
"""
224+
super(IssueLinkTokenResponse, self).__init__(**kwargs)
225+
226+
self.link_token = link_token

tests/api/test_issue_link_token.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# -*- coding: utf-8 -*-
2+
3+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
# not use this file except in compliance with the License. You may obtain
5+
# a copy of the License at
6+
#
7+
# https://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
15+
from __future__ import unicode_literals, absolute_import
16+
17+
import unittest
18+
19+
import responses
20+
21+
from linebot import (
22+
LineBotApi
23+
)
24+
25+
26+
class TestLineBotApi(unittest.TestCase):
27+
def setUp(self):
28+
self.tested = LineBotApi('channel_secret')
29+
30+
@responses.activate
31+
def test_issue_line_token(self):
32+
responses.add(
33+
responses.POST,
34+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/user/user_id/linkToken',
35+
json={
36+
"linkToken": "xxxx",
37+
},
38+
status=200
39+
)
40+
41+
issue_link_token_response = self.tested.issue_link_token('user_id')
42+
43+
request = responses.calls[0].request
44+
self.assertEqual(request.method, 'POST')
45+
self.assertEqual(
46+
request.url,
47+
LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/user/user_id/linkToken')
48+
self.assertEqual(issue_link_token_response.link_token, 'xxxx')
49+
50+
51+
if __name__ == '__main__':
52+
unittest.main()

0 commit comments

Comments
 (0)