157 lines
5.6 KiB
Python
157 lines
5.6 KiB
Python
# coding: utf-8
|
||
|
||
from __future__ import absolute_import, division, print_function, unicode_literals
|
||
|
||
from typing import TYPE_CHECKING
|
||
|
||
from six.moves.urllib.parse import quote
|
||
|
||
from utils.feishu.helper import join_url
|
||
|
||
if TYPE_CHECKING:
|
||
from utils.feishu.api import OpenLark
|
||
|
||
|
||
class APIAppLink(object):
|
||
def __init__(self, host, qs):
|
||
self.host = host
|
||
self.qs = qs
|
||
|
||
def open_client(self):
|
||
"""唤起飞书客户端的 app_link 链接
|
||
"""
|
||
|
||
base = 'https://{}/client/op/open'.format(self.host)
|
||
return join_url(base, self.qs, sep='?')
|
||
|
||
def open_mini_program(self, app_id, mode='', path='', path_android='', path_ios='', path_pc=''):
|
||
"""打开一个小程序或者小程序中的一个页面
|
||
|
||
:param app_id: 小程序 app_id
|
||
:type app_id: str
|
||
:param mode: PC 必填 PC小程序的三种模式:sidebar-semi、window、appCenter
|
||
:type mode: str
|
||
:param path: 需要跳转的页面路径,路径后可以带参数。也可以使用path_android、path_ios、path_pc参数对不同的客户端指定不同的path
|
||
:type path: str
|
||
:param path_android: 同 path 参数,Android 端会优先使用该参数,如果该参数不存在,则会使用 ptah 参数
|
||
:type path_android: str
|
||
:param path_ios: 同 path 参数,iOS 端会优先使用该参数,如果该参数不存在,则会使用 ptah 参数
|
||
:type path_ios: str
|
||
:param path_pc: 同 path 参数,PC 端会优先使用该参数,如果该参数不存在,则会使用 ptah 参数
|
||
:type path_pc: str
|
||
:return: url
|
||
:rtype: str
|
||
|
||
使用示例
|
||
|
||
1. 打开小程序
|
||
|
||
lark_cli.app_link().open_mini_program(app_id='1234567890', mode='window')
|
||
|
||
# https://applink.feishu.cn/client/mini_program/open?appId=1234567890&mode=window
|
||
|
||
2. 打开小程序的一个页面 pages/home
|
||
|
||
lark_cli.app_link().open_mini_program(app_id='1234567890', mode='window', path='pages/home')
|
||
|
||
# https://applink.feishu.cn/client/mini_program/open?appId=1234567890&mode=window&path=pages%2Fhome
|
||
|
||
3. 打开小程序的一个页面带参数 pages/home?xid=123
|
||
|
||
lark_cli.app_link().open_mini_program(app_id='1234567890', mode='window', path='pages/home?xid=123')
|
||
|
||
# https://applink.feishu.cn/client/mini_program/open?appId=1234567890&mode=window&
|
||
path=pages%2Fhome%3Fxid%3D123
|
||
|
||
4. 在 PC 端打开页面 pages/pc_home?pid=123,在其他端打开页面 pages/home?xid=123
|
||
|
||
lark_cli.app_link().open_mini_program(app_id='1234567890', mode='window', path='pages/home?xid=123',
|
||
path_pc='pages/pc_home?pid=123')
|
||
|
||
# https://applink.feishu.cn/client/mini_program/open?appId=1234567890&mode=window&
|
||
path=pages%2Fhome%3Fxid%3D123&path_pc=pages%2Fpc_home%3Fpid%3D123
|
||
|
||
5. 在 PC 4.2.0 及以上版本支持打开小程序,PC 4.2.0 以下版本提示不支持
|
||
|
||
lark_cli.app_link(min_ver_pc='4.2.0').open_mini_program(app_id='1234567890', mode='window')
|
||
|
||
# https://applink.feishu.cn/client/mini_program/open?appId=1234567890&mode=window&min_lk_ver_pc=4.2.0
|
||
"""
|
||
qs = [
|
||
('appId', app_id),
|
||
('mode', mode),
|
||
('path', quote(path, safe='') if path else ''),
|
||
('path_android', quote(path_android, safe='') if path_android else ''),
|
||
('path_ios', quote(path_ios, safe='') if path_ios else ''),
|
||
('path_pc', quote(path_pc, safe='') if path_pc else ''),
|
||
]
|
||
for i in self.qs:
|
||
qs.append((i[0], i[1]))
|
||
|
||
base = 'https://{}/client/mini_program/open'.format(self.host)
|
||
return join_url(base, qs, sep='?')
|
||
|
||
def open_chat(self, open_id='', open_chat_id=''):
|
||
"""打开一个小程序或者小程序中的一个页面
|
||
|
||
:param open_id: 用户 open_id
|
||
:type open_id: str
|
||
:param open_chat_id: 用会话ID,包括单聊会话和群聊会话
|
||
:type open_chat_id: str
|
||
:return: url
|
||
:rtype: str
|
||
|
||
使用示例
|
||
|
||
使用 open_id 打开聊天页面
|
||
|
||
lark_cli.app_link().open_chat(open_id='1234567890')
|
||
|
||
# https://applink.feishu.cn/client/chat/open?openId=1234567890
|
||
"""
|
||
qs = [
|
||
('openId', open_id),
|
||
('openChatId', open_chat_id)
|
||
]
|
||
for i in self.qs:
|
||
if i[1]:
|
||
qs.append((i[0], i[1]))
|
||
|
||
base = 'https://{}/client/mini_program/open'.format(self.host)
|
||
return join_url(base, qs, sep='?')
|
||
|
||
|
||
class APIAppLinkMixin(object):
|
||
@property
|
||
def _app_link_host(self):
|
||
"""
|
||
:type self: OpenLark
|
||
"""
|
||
if self.is_lark:
|
||
return 'applink.larksuite.com'
|
||
return 'applink.feishu.cn'
|
||
|
||
def app_link(self, min_lk_ver='', min_lk_ver_android='', min_lk_ver_ios='', min_lk_ver_pc=''):
|
||
"""
|
||
|
||
:param min_lk_ver:
|
||
:param min_lk_ver_android:
|
||
:param min_lk_ver_ios:
|
||
:param min_lk_ver_pc:
|
||
:return:
|
||
:rtype: APIAppLink
|
||
|
||
指定 AppLink 协议能够兼容的最小飞书版本,使用三位版本号 x.y.z。
|
||
|
||
如果当前飞书版本号小于min_lk_ver,打开该 AppLink 会显示为兼容页面。
|
||
|
||
也可使用 min_lk_ver_android、min_lk_ver_ios、min_lk_ver_pc 参数对不同的客户端指定不同的版本。
|
||
"""
|
||
qs = [
|
||
('min_lk_ver', min_lk_ver),
|
||
('min_lk_ver_android', min_lk_ver_android),
|
||
('min_lk_ver_ios', min_lk_ver_ios),
|
||
('min_lk_ver_pc', min_lk_ver_pc),
|
||
]
|
||
return APIAppLink(self._app_link_host, qs)
|