├── .env.dev
├── .gitignore
├── Dockerfile
├── FlyBookApi.py
├── FlyBookAuto.py
├── FlyBookAutoAsync.py
├── FlyBookRec.py
├── README.md
├── builder
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-39.pyc
│ ├── auth.cpython-39.pyc
│ ├── header.cpython-39.pyc
│ ├── params.cpython-39.pyc
│ └── proto.cpython-39.pyc
├── auth.py
├── header.py
├── params.py
└── proto.py
├── requirements.txt
├── static
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-39.pyc
│ └── proto_pb2.cpython-39.pyc
├── fly_book.js
├── proto.proto
└── proto_pb2.py
└── utils
├── __init__.py
├── __pycache__
├── __init__.cpython-39.pyc
└── fly_book_utils.cpython-39.pyc
└── fly_book_utils.py
/.env.dev:
--------------------------------------------------------------------------------
1 | repo=https://github.com/cv-cat/OpenFeiShuApi
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__
2 | *node_modules/*
3 | *.so
4 | .Python
5 | build/
6 | develop-eggs/
7 | dist/
8 | downloads/
9 | eggs/
10 | .eggs/
11 | lib/
12 | lib64/
13 | parts/
14 | sdist/
15 | var/
16 | wheels/
17 | MANIFEST
18 | *.manifest
19 | *.spec
20 | .cache
21 | *.log
22 | local_settings.py
23 | db.sqlite3
24 | __pypackages__/
25 | .venv
26 | env/
27 | venv/
28 | ENV/
29 | env.bak/
30 | venv.bak/
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.9
2 |
3 | WORKDIR /app
4 |
5 | COPY . .
6 |
7 | RUN npm install
8 | RUN pip install --no-cache-dir -r requirements.txt
9 |
10 | # docker build -t feishuapp .
11 | # docker run -it feishuapp bash
--------------------------------------------------------------------------------
/FlyBookApi.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | import requests
4 |
5 | from builder.auth import FlyBookAuth
6 | from builder.header import HeaderBuilder
7 | from builder.params import ParamsBuilder
8 | from builder.proto import ProtoBuilder
9 |
10 | class FlyBookApi:
11 | base_url = "https://internal-api-lark-api.feishu.cn/im/gateway/"
12 | get_csrf_token_url = "https://internal-api-lark-api.feishu.cn/accounts/csrf"
13 | get_user_info_url = "https://internal-api-lark-api.feishu.cn/accounts/web/user"
14 | def get_csrf_token(self, auth):
15 | headers = HeaderBuilder.build_get_csrf_token_header().get()
16 | params = ParamsBuilder.build_get_csrf_token_param().get()
17 | response = requests.post(self.get_csrf_token_url, headers=headers, cookies=auth.cookie, params=params, verify=False)
18 | res_json = response.json()
19 | x_csrf_token = response.cookies.get('swp_csrf_token')
20 | return res_json, x_csrf_token
21 |
22 | def get_user_info(self, auth, x_csrf_token):
23 | headers = HeaderBuilder.build_get_user_info_header(x_csrf_token).get()
24 | params = ParamsBuilder.build_get_user_info_param().get()
25 | response = requests.get(self.get_user_info_url, headers=headers, cookies=auth.cookie, params=params, verify=False)
26 | res_json = response.json()
27 | userId = res_json['data']['user']['id']
28 | return res_json, userId
29 |
30 | def search_some(self, auth, query):
31 | headers = HeaderBuilder.build_search_header().get()
32 | Packet = ProtoBuilder.build_search_request_proto(headers['x-request-id'], query)
33 | response = requests.post(self.base_url, headers=headers, cookies=auth.cookie, data=Packet.SerializeToString(), verify=False)
34 | SearchResponsePacket, userAndGroupIds = ProtoBuilder.decode_search_response_proto(response.content)
35 | return SearchResponsePacket, userAndGroupIds
36 |
37 | def create_chat(self, auth, userId):
38 | headers = HeaderBuilder.build_create_chat_header().get()
39 | Packet = ProtoBuilder.build_create_chat_request_proto(headers['x-request-id'], userId)
40 | response = requests.post(self.base_url, headers=headers, cookies=auth.cookie, data=Packet.SerializeToString(), verify=False)
41 | PutChatResponsePacket, chatId = ProtoBuilder.decode_create_chat_response_proto(response.content)
42 | return PutChatResponsePacket, chatId
43 |
44 | def send_msg(self, auth, sends_text, chatId):
45 | headers = HeaderBuilder.build_send_msg_header().get()
46 | Packet = ProtoBuilder.build_send_message_request_proto(sends_text, headers['x-request-id'], chatId)
47 | response = requests.post(self.base_url, headers=headers, cookies=auth.cookie, data=Packet.SerializeToString(), verify=False)
48 | return response.text
49 |
50 |
51 |
52 | if __name__ == '__main__':
53 | fly_book_api = FlyBookApi()
54 | fly_book_auth = FlyBookAuth()
55 | cookie_str = 'passport_web_did=7425617429685633026; passport_trace_id=7425617429688434716; QXV0aHpDb250ZXh0=d0d5bf75e4ee4a1187352ee075c0371c; _gcl_au=1.1.7129592.1728911286; __tea__ug__uid=7425617339360134692; is_anonymous_session=; _csrf_token=a6cbc25b6f3327626935ed3aa0716af322963785-1728911297; lang=zh; session=XN0YXJ0-536qb617-01c6-4b41-853c-9e67e63a5822-WVuZA; session_list=XN0YXJ0-536qb617-01c6-4b41-853c-9e67e63a5822-WVuZA; sl_session=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzAyMzUxNjcsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtZXRhIjoiQVdXQng5WkZBY0FCWkdSTnI2aExRQUpuRFJlMXJseUFBbWNORjdXdVhJQUNadzBYdjgyR1FBTUNLZ0VBUVVGQlFVRkJRVUZCUVVKdVNVdEtaa3gwUVVGQmR6MDkiLCJzdW0iOiJlOTdkOTVkYThhZDJkZGY5NGFkZGI1MjZkZWJjYzQ3ZWIwNjVjNGNiNmUwYTMwOTcxMmZhOTRiNmUyOTU4MmZlIiwibG9jIjoiemhfY24iLCJhcGMiOiIiLCJpYXQiOjE3MzAxOTE5NjcsInNhYyI6eyJVc2VyU3RhZmZTdGF0dXMiOiIxIiwiVXNlclR5cGUiOiI0MiJ9LCJsb2QiOm51bGwsIm5zIjoibGFyayIsIm5zX3VpZCI6IjczMTQzNDY5OTI5MjEwNjc1MjEiLCJuc190aWQiOiI3MjMzOTkyMzE4MzAxOTc4NjI2Iiwib3QiOjF9fQ.goZHVVubY2mjX4jWaO1lPkfpSGZ1Y_-SaZuG-w0bnpl_omBplJfk2_zZbbDUsmhWhgErL3BFFZopPM81Ov2v5g; site_env=pre=0; _uuid_hera_ab_path_1=7431117940350795778; landing_url=https://www.feishu.cn/download; Hm_lvt_a79616d9322d81f12a92402ac6ae32ea=1730191974; HMACCOUNT=75F4600EFAF92CE2; _gid=GA1.2.1889448621.1730191975; help_center_session=9cd28d94-0690-4914-bb66-bbc7d50518e2; _uetsid=2fcd8bd095d311efb6d2adb31009996d; _uetvid=2fcdcaf095d311ef9cebe166df088ce7; Hm_lpvt_a79616d9322d81f12a92402ac6ae32ea=1730191977; _ga_VPYRHN104D=GS1.1.1730191974.2.1.1730191976.58.0.0; _ga=GA1.2.104448125.1728911286; i18n_locale=zh-CN; locale=zh-CN; passport_app_access_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzAyMzUxODIsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtX2FjY2Vzc19pbmZvIjp7IjEiOnsiaWF0IjoxNzMwMTkxOTgyLCJhY2Nlc3MiOnRydWV9fSwic3VtIjoiZTk3ZDk1ZGE4YWQyZGRmOTRhZGRiNTI2ZGViY2M0N2ViMDY1YzRjYjZlMGEzMDk3MTJmYTk0YjZlMjk1ODJmZSJ9fQ.Ax5t58BcfEjIONiePYpUaD0FoSdfH_lIcf0UI02YwYeoEmjBy4peGF71AQ82qj83f45urVSLB7zFtJiND-tczA; swp_csrf_token=39ce677f-fd7e-452c-b5fb-a6a621c57623; t_beda37=1e652d1a0a89f5aa215a96161e6762af794145b9dd2d1d78322e32587ba5aa1d; msToken=huib7ZvPSFnE4D22NUX6r82DSruVZG5JhhJHojihK7l00B8-B8XxJWY68jDnx11fV1GvSz0QuUU7N5RbYo8eyGQnZeKz0kDFwX-XfkaH6NI8-QVM1Rgpd8cdHGSSjMz7M_yugUdc_iWJeNV8S45uTbHomfsLrPwETJ_a83HELt6aaB5nbm_uwg=='
56 | fly_book_auth.perepare_auth(cookie_str)
57 |
58 | res_json, x_csrf_token = fly_book_api.get_csrf_token(fly_book_auth)
59 | res_json, userId = fly_book_api.get_user_info(fly_book_auth, x_csrf_token)
60 | # ========================================================================================================
61 | query = 'ShellBot'
62 | SearchResponsePacket, userAndGroupIds = fly_book_api.search_some(fly_book_auth, query)
63 | user_or_group_id = userAndGroupIds[0]
64 | if user_or_group_id['type'] == 'user':
65 | print('搜索到用户')
66 | userId = user_or_group_id['id']
67 | PutChatResponsePacket, chatId = fly_book_api.create_chat(fly_book_auth, userId)
68 | # print(chatId)
69 | else:
70 | print('搜索到群组')
71 | chatId = user_or_group_id['id']
72 |
73 | # ========================================================================================================
74 | # userId = "7355149382943080450"
75 | # PutChatResponsePacket, chatId = fly_book_api.create_chat(fly_book_auth, userId)
76 | # print(chatId)
77 |
78 | # sends_text = '测试消息'
79 | # # chatId = "7379910344918188035"
80 | # res = fly_book_api.send_msg(fly_book_auth, sends_text, chatId)
81 | # print(res)
82 |
--------------------------------------------------------------------------------
/FlyBookAuto.py:
--------------------------------------------------------------------------------
1 | import time
2 | from urllib.parse import urlencode
3 |
4 | from websocket import WebSocketApp
5 | import static.proto_pb2 as FLY_BOOK_PROTO
6 | from FlyBookApi import FlyBookApi
7 |
8 | from builder.auth import FlyBookAuth
9 | from builder.params import ParamsBuilder
10 | from builder.proto import ProtoBuilder
11 |
12 |
13 | class FlyBookLive:
14 | def __init__(self, auth):
15 | fly_book_api = FlyBookApi()
16 | _, x_csrf_token = fly_book_api.get_csrf_token(auth)
17 | _, self.me_id = fly_book_api.get_user_info(auth, x_csrf_token)
18 | self.ws = None
19 |
20 | @staticmethod
21 | def send_ack(ws, Packet_sid):
22 | payload = FLY_BOOK_PROTO.Packet()
23 | payload.cmd = 1
24 | payload.payloadType = 1
25 | payload.sid = Packet_sid
26 | payload = payload.SerializeToString()
27 | Frame = FLY_BOOK_PROTO.Frame()
28 | current = int(time.time() * 1000)
29 | Frame.seqid = current
30 | Frame.logid = current
31 | Frame.service = 1
32 | Frame.method = 1
33 | ExtendedEntry = FLY_BOOK_PROTO.ExtendedEntry()
34 | ExtendedEntry.key = 'x-request-time'
35 | ExtendedEntry.value = f'{current}000'
36 | Frame.headers.append(ExtendedEntry)
37 | Frame.payloadType = "pb"
38 | Frame.payload = payload
39 | Frame = Frame.SerializeToString()
40 | ws.send(Frame, opcode=0x2)
41 |
42 | @staticmethod
43 | def on_message(ws, message):
44 | try:
45 | Frame, Packet_sid, fromId, ChatId, ReceiveTextContent = ProtoBuilder.decode_receive_msg_proto(message)
46 | if ChatId is not None:
47 | print(f"fromId: {fromId}")
48 | print(f"ChatId: {ChatId}")
49 | print(f"ReceiveTextContent: {ReceiveTextContent}")
50 |
51 | # if not fromId == '7314346992921067521':
52 | # fly_book_api = FlyBookApi()
53 | # fly_book_auth = FlyBookAuth()
54 | # cookie_str = 'passport_web_did=7360675712451543044; QXV0aHpDb250ZXh0=1e4557f7d39f4311aa4ea6bab7afb858; locale=zh-CN; _gcl_au=1.1.1773137480.1713790863; trust_browser_id=1078ea84-34d9-42d4-adff-766c423ab3e8; _ga=GA1.1.252483876.1713790863; is_anonymous_session=; _ga_VPYRHN104D=GS1.1.1713790863.1.1.1713790872.51.0.0; lang=zh; __tea__ug__uid=1007701713790873353; _uuid_hera_ab_path_1=7372781885275160579; Hm_lvt_e78c0cb1b97ef970304b53d2097845fd=1716609558; _csrf_token=36b375aad3381c672c2752df4c2f78c9bc1b51ae-1716787751; session=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA; session_list=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA_XN0YXJ0-cbcu2232-bd07-4258-ba84-bd690f3f3b9a-WVuZA; passport_app_access_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzcyMTIsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtX2FjY2Vzc19pbmZvIjp7IjEiOnsiaWF0IjoxNzE4MTk0MDEyLCJhY2Nlc3MiOnRydWV9fSwic3VtIjoiYWFmOWZjOGNkN2MzMDZjOTZiMTM3YzJiYmJjNjQ3OGM0NmY2MmJjYWQxZGQ1OTM4OGMwYmFkZDk4Njk2ZTA4OCJ9fQ.VevkzfsmJZN-ETiSEOx6ciNJNdNrT1ipRVyu_AKhVkODXIzMnr96mGbdga8gwcDvurJYv0F8QXCnXi6URJPi6A; sl_session=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzg3NzYsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtZXRhIjoiQVdXQng5WkZBY0FCWkdSTnI2aExRQUptSmwrUDI0VUFCR1ltWDQvYmhRQUVaaVpmbWRDSVFBTUNLZ0VBUVVGQlFVRkJRVUZCUVVKdFdtRkxaRXBSVWtGQmR6MDkiLCJzdW0iOiJhYWY5ZmM4Y2Q3YzMwNmM5NmIxMzdjMmJiYmM2NDc4YzQ2ZjYyYmNhZDFkZDU5Mzg4YzBiYWRkOTg2OTZlMDg4IiwibG9jIjoiemhfY24iLCJhcGMiOiJSZWxlYXNlIiwiaWF0IjoxNzE4MTk1NTc2LCJzYWMiOnsiVXNlclN0YWZmU3RhdHVzIjoiMSIsIlVzZXJUeXBlIjoiNDIifSwibG9kIjpudWxsLCJucyI6ImxhcmsiLCJuc191aWQiOiI3MzE0MzQ2OTkyOTIxMDY3NTIxIiwibnNfdGlkIjoiNzIzMzk5MjMxODMwMTk3ODYyNiIsIm90IjoxfX0.KyqL8o8buuFFWBfurekxIlV2mhNZuvBEmUdyD2FjQ5kQc3RmjqlnxPe2g2Mh9HPUaBi31rILaW9NNsPyeDZKHA; swp_csrf_token=06b39a70-8d22-40fb-9d86-a39aecc2a1b6; t_beda37=23d411157af861afbc9c1bf6032b116898bb57702b61c0c8e7ac536df6d7ccec'
55 | # fly_book_auth.perepare_auth(cookie_str)
56 | # sends_text = ReceiveTextContent
57 | # res = fly_book_api.send_msg(fly_book_auth, sends_text, ChatId)
58 | # print(res)
59 |
60 |
61 | FlyBookLive.send_ack(ws, Packet_sid)
62 | print('==============================')
63 | except Exception as e:
64 | print(str(e))
65 |
66 | @staticmethod
67 | def on_error(ws, error):
68 | print("\033[31m### error ###")
69 | print(error)
70 | print("### ===error=== ###\033[m")
71 |
72 | @staticmethod
73 | def on_close(ws, close_status_code, close_msg):
74 | print("\033[31m### closed ###")
75 | print(f"status_code: {close_status_code}, msg: {close_msg}")
76 | print("### ===closed=== ###\033[m")
77 |
78 | def start_ws(self, wss_url):
79 | self.ws = WebSocketApp(
80 | url=wss_url,
81 | on_message=FlyBookLive.on_message,
82 | on_error=FlyBookLive.on_error,
83 | on_close=FlyBookLive.on_close
84 | )
85 | try:
86 | self.ws.run_forever()
87 | except Exception as e:
88 | print(str(e))
89 | self.ws.close()
90 |
91 |
92 | if __name__ == '__main__':
93 | auth = FlyBookAuth()
94 | cookie_str = 'passport_web_did=7360675712451543044; QXV0aHpDb250ZXh0=1e4557f7d39f4311aa4ea6bab7afb858; locale=zh-CN; _gcl_au=1.1.1773137480.1713790863; trust_browser_id=1078ea84-34d9-42d4-adff-766c423ab3e8; _ga=GA1.1.252483876.1713790863; is_anonymous_session=; _ga_VPYRHN104D=GS1.1.1713790863.1.1.1713790872.51.0.0; lang=zh; __tea__ug__uid=1007701713790873353; _uuid_hera_ab_path_1=7372781885275160579; Hm_lvt_e78c0cb1b97ef970304b53d2097845fd=1716609558; _csrf_token=36b375aad3381c672c2752df4c2f78c9bc1b51ae-1716787751; session=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA; session_list=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA_XN0YXJ0-cbcu2232-bd07-4258-ba84-bd690f3f3b9a-WVuZA; passport_app_access_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzcyMTIsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtX2FjY2Vzc19pbmZvIjp7IjEiOnsiaWF0IjoxNzE4MTk0MDEyLCJhY2Nlc3MiOnRydWV9fSwic3VtIjoiYWFmOWZjOGNkN2MzMDZjOTZiMTM3YzJiYmJjNjQ3OGM0NmY2MmJjYWQxZGQ1OTM4OGMwYmFkZDk4Njk2ZTA4OCJ9fQ.VevkzfsmJZN-ETiSEOx6ciNJNdNrT1ipRVyu_AKhVkODXIzMnr96mGbdga8gwcDvurJYv0F8QXCnXi6URJPi6A; sl_session=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzg3NzYsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtZXRhIjoiQVdXQng5WkZBY0FCWkdSTnI2aExRQUptSmwrUDI0VUFCR1ltWDQvYmhRQUVaaVpmbWRDSVFBTUNLZ0VBUVVGQlFVRkJRVUZCUVVKdFdtRkxaRXBSVWtGQmR6MDkiLCJzdW0iOiJhYWY5ZmM4Y2Q3YzMwNmM5NmIxMzdjMmJiYmM2NDc4YzQ2ZjYyYmNhZDFkZDU5Mzg4YzBiYWRkOTg2OTZlMDg4IiwibG9jIjoiemhfY24iLCJhcGMiOiJSZWxlYXNlIiwiaWF0IjoxNzE4MTk1NTc2LCJzYWMiOnsiVXNlclN0YWZmU3RhdHVzIjoiMSIsIlVzZXJUeXBlIjoiNDIifSwibG9kIjpudWxsLCJucyI6ImxhcmsiLCJuc191aWQiOiI3MzE0MzQ2OTkyOTIxMDY3NTIxIiwibnNfdGlkIjoiNzIzMzk5MjMxODMwMTk3ODYyNiIsIm90IjoxfX0.KyqL8o8buuFFWBfurekxIlV2mhNZuvBEmUdyD2FjQ5kQc3RmjqlnxPe2g2Mh9HPUaBi31rILaW9NNsPyeDZKHA; swp_csrf_token=06b39a70-8d22-40fb-9d86-a39aecc2a1b6; t_beda37=23d411157af861afbc9c1bf6032b116898bb57702b61c0c8e7ac536df6d7ccec'
95 | auth.perepare_auth(cookie_str)
96 |
97 |
98 | live = FlyBookLive(auth)
99 | params = ParamsBuilder.build_receive_msg_param(auth).get()
100 | url = f"wss://msg-frontier.feishu.cn/ws/v2?{urlencode(params)}"
101 | live.start_ws(url)
--------------------------------------------------------------------------------
/FlyBookAutoAsync.py:
--------------------------------------------------------------------------------
1 | import re
2 | import time
3 | from urllib.parse import urlencode
4 |
5 | import asyncio
6 |
7 | import blackboxprotobuf
8 | import static.proto_pb2 as FLY_BOOK_PROTO
9 | from FlyBookApi import FlyBookApi
10 | import websockets
11 |
12 | from builder.auth import FlyBookAuth
13 | from builder.params import ParamsBuilder
14 | from builder.proto import ProtoBuilder
15 |
16 |
17 | class FlyBookLive:
18 | def __init__(self, auth):
19 | self.base_url = 'wss://msg-frontier.feishu.cn/ws/v2'
20 | self.auth = auth
21 | self.fly_book_api = FlyBookApi()
22 | _, x_csrf_token = self.fly_book_api.get_csrf_token(self.auth)
23 | _, self.me_id = self.fly_book_api.get_user_info(self.auth, x_csrf_token)
24 | self.me_id = str(self.me_id)
25 | self.ws = None
26 |
27 | async def send_ack(self, ws, Packet_sid):
28 | payload = FLY_BOOK_PROTO.Packet()
29 | payload.cmd = 1
30 | payload.payloadType = 1
31 | payload.sid = Packet_sid
32 | payload = payload.SerializeToString()
33 | Frame = FLY_BOOK_PROTO.Frame()
34 | current = int(time.time() * 1000)
35 | Frame.seqid = current
36 | Frame.logid = current
37 | Frame.service = 1
38 | Frame.method = 1
39 | ExtendedEntry = FLY_BOOK_PROTO.ExtendedEntry()
40 | ExtendedEntry.key = 'x-request-time'
41 | ExtendedEntry.value = f'{current}000'
42 | Frame.headers.append(ExtendedEntry)
43 | Frame.payloadType = "pb"
44 | Frame.payload = payload
45 | Frame = Frame.SerializeToString()
46 | await ws.send(Frame)
47 |
48 | async def main(self):
49 | params = ParamsBuilder.build_receive_msg_param(auth).get()
50 | url = f"{self.base_url}?{urlencode(params)}"
51 | async with websockets.connect(url) as websocket:
52 | async for message in websocket:
53 | try:
54 | Frame, Packet_sid, fromId, MessageChatId, ReceiveTextContent = ProtoBuilder.decode_receive_msg_proto(message)
55 | if MessageChatId is not None:
56 | print(f"fromId: {fromId}")
57 | print(f"ChatId: {MessageChatId}")
58 | print(f"ReceiveTextContent: {ReceiveTextContent}")
59 | if not str(fromId) == self.me_id:
60 | try:
61 | if self.me_id in ReceiveTextContent:
62 | to_who = re.findall(r'给\$(.*?)\$', ReceiveTextContent)[0]
63 | send_text = re.findall(r'发送\$(.*?)\$', ReceiveTextContent)[0]
64 | _, userAndGroupIds = self.fly_book_api.search_some(self.auth, to_who)
65 | user_or_group_id = userAndGroupIds[0]
66 | if user_or_group_id['type'] == 'user':
67 | userId = user_or_group_id['id']
68 | _, chatId = self.fly_book_api.create_chat(self.auth, userId)
69 | else:
70 | chatId = user_or_group_id['id']
71 | self.fly_book_api.send_msg(self.auth, send_text, chatId)
72 | else:
73 | raise Exception
74 | except Exception as e:
75 | pass
76 | # send_text = '我是一个机器人,如果你想和我聊天,请@我并发送消息,消息格式:给$用户名$发送$消息内容$'
77 | # self.fly_book_api.send_msg(self.auth, send_text, MessageChatId)
78 |
79 | await self.send_ack(websocket, Packet_sid)
80 | print('==============================')
81 | except Exception as e:
82 | exception = str(e)
83 | print(str(e))
84 |
85 |
86 | if __name__ == '__main__':
87 | auth = FlyBookAuth()
88 | cookie_str = 'passport_web_did=7360675712451543044; QXV0aHpDb250ZXh0=1e4557f7d39f4311aa4ea6bab7afb858; locale=zh-CN; _gcl_au=1.1.1773137480.1713790863; trust_browser_id=1078ea84-34d9-42d4-adff-766c423ab3e8; _ga=GA1.1.252483876.1713790863; is_anonymous_session=; _ga_VPYRHN104D=GS1.1.1713790863.1.1.1713790872.51.0.0; lang=zh; __tea__ug__uid=1007701713790873353; _uuid_hera_ab_path_1=7372781885275160579; Hm_lvt_e78c0cb1b97ef970304b53d2097845fd=1716609558; _csrf_token=36b375aad3381c672c2752df4c2f78c9bc1b51ae-1716787751; session=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA; session_list=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA_XN0YXJ0-cbcu2232-bd07-4258-ba84-bd690f3f3b9a-WVuZA; passport_app_access_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzcyMTIsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtX2FjY2Vzc19pbmZvIjp7IjEiOnsiaWF0IjoxNzE4MTk0MDEyLCJhY2Nlc3MiOnRydWV9fSwic3VtIjoiYWFmOWZjOGNkN2MzMDZjOTZiMTM3YzJiYmJjNjQ3OGM0NmY2MmJjYWQxZGQ1OTM4OGMwYmFkZDk4Njk2ZTA4OCJ9fQ.VevkzfsmJZN-ETiSEOx6ciNJNdNrT1ipRVyu_AKhVkODXIzMnr96mGbdga8gwcDvurJYv0F8QXCnXi6URJPi6A; sl_session=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzg3NzYsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtZXRhIjoiQVdXQng5WkZBY0FCWkdSTnI2aExRQUptSmwrUDI0VUFCR1ltWDQvYmhRQUVaaVpmbWRDSVFBTUNLZ0VBUVVGQlFVRkJRVUZCUVVKdFdtRkxaRXBSVWtGQmR6MDkiLCJzdW0iOiJhYWY5ZmM4Y2Q3YzMwNmM5NmIxMzdjMmJiYmM2NDc4YzQ2ZjYyYmNhZDFkZDU5Mzg4YzBiYWRkOTg2OTZlMDg4IiwibG9jIjoiemhfY24iLCJhcGMiOiJSZWxlYXNlIiwiaWF0IjoxNzE4MTk1NTc2LCJzYWMiOnsiVXNlclN0YWZmU3RhdHVzIjoiMSIsIlVzZXJUeXBlIjoiNDIifSwibG9kIjpudWxsLCJucyI6ImxhcmsiLCJuc191aWQiOiI3MzE0MzQ2OTkyOTIxMDY3NTIxIiwibnNfdGlkIjoiNzIzMzk5MjMxODMwMTk3ODYyNiIsIm90IjoxfX0.KyqL8o8buuFFWBfurekxIlV2mhNZuvBEmUdyD2FjQ5kQc3RmjqlnxPe2g2Mh9HPUaBi31rILaW9NNsPyeDZKHA; swp_csrf_token=06b39a70-8d22-40fb-9d86-a39aecc2a1b6; t_beda37=23d411157af861afbc9c1bf6032b116898bb57702b61c0c8e7ac536df6d7ccec'
89 | auth.perepare_auth(cookie_str)
90 |
91 | live = FlyBookLive(auth)
92 | asyncio.run(live.main())
--------------------------------------------------------------------------------
/FlyBookRec.py:
--------------------------------------------------------------------------------
1 | import time
2 | from urllib.parse import urlencode
3 |
4 | from websocket import WebSocketApp
5 | import static.proto_pb2 as FLY_BOOK_PROTO
6 | from FlyBookApi import FlyBookApi
7 |
8 | from builder.auth import FlyBookAuth
9 | from builder.params import ParamsBuilder
10 | from builder.proto import ProtoBuilder
11 |
12 |
13 | class FlyBookLive:
14 | def __init__(self):
15 | self.ws = None
16 |
17 | @staticmethod
18 | def send_ack(ws, Packet_sid):
19 | payload = FLY_BOOK_PROTO.Packet()
20 | payload.cmd = 1
21 | payload.payloadType = 1
22 | payload.sid = Packet_sid
23 | payload = payload.SerializeToString()
24 | Frame = FLY_BOOK_PROTO.Frame()
25 | current = int(time.time() * 1000)
26 | Frame.seqid = current
27 | Frame.logid = current
28 | Frame.service = 1
29 | Frame.method = 1
30 | ExtendedEntry = FLY_BOOK_PROTO.ExtendedEntry()
31 | ExtendedEntry.key = 'x-request-time'
32 | ExtendedEntry.value = f'{current}000'
33 | Frame.headers.append(ExtendedEntry)
34 | Frame.payloadType = "pb"
35 | Frame.payload = payload
36 | Frame = Frame.SerializeToString()
37 | ws.send(Frame, opcode=0x2)
38 |
39 | @staticmethod
40 | def on_message(ws, message):
41 | try:
42 | Frame, Packet_sid, fromId, ChatId, ReceiveTextContent = ProtoBuilder.decode_receive_msg_proto(message)
43 |
44 | # 心跳ACK
45 | FlyBookLive.send_ack(ws, Packet_sid)
46 | print('==============================')
47 | except Exception as e:
48 | print(str(e))
49 |
50 | @staticmethod
51 | def on_error(ws, error):
52 | print("\033[31m### error ###")
53 | print(error)
54 | print("### ===error=== ###\033[m")
55 |
56 | @staticmethod
57 | def on_close(ws, close_status_code, close_msg):
58 | print("\033[31m### closed ###")
59 | print(f"status_code: {close_status_code}, msg: {close_msg}")
60 | print("### ===closed=== ###\033[m")
61 |
62 | def start_ws(self, wss_url):
63 | self.ws = WebSocketApp(
64 | url=wss_url,
65 | on_message=FlyBookLive.on_message,
66 | on_error=FlyBookLive.on_error,
67 | on_close=FlyBookLive.on_close
68 | )
69 | try:
70 | self.ws.run_forever()
71 | except Exception as e:
72 | print(str(e))
73 | self.ws.close()
74 |
75 |
76 | if __name__ == '__main__':
77 | live = FlyBookLive()
78 | fly_book_auth = FlyBookAuth()
79 | cookie_str = 'passport_web_did=7360675712451543044; QXV0aHpDb250ZXh0=1e4557f7d39f4311aa4ea6bab7afb858; locale=zh-CN; _gcl_au=1.1.1773137480.1713790863; trust_browser_id=1078ea84-34d9-42d4-adff-766c423ab3e8; _ga=GA1.1.252483876.1713790863; is_anonymous_session=; _ga_VPYRHN104D=GS1.1.1713790863.1.1.1713790872.51.0.0; lang=zh; __tea__ug__uid=1007701713790873353; _uuid_hera_ab_path_1=7372781885275160579; Hm_lvt_e78c0cb1b97ef970304b53d2097845fd=1716609558; _csrf_token=36b375aad3381c672c2752df4c2f78c9bc1b51ae-1716787751; session=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA; session_list=XN0YXJ0-8f0hd84c-4929-4782-8aa7-04633ae72d3c-WVuZA_XN0YXJ0-cbcu2232-bd07-4258-ba84-bd690f3f3b9a-WVuZA; passport_app_access_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzcyMTIsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtX2FjY2Vzc19pbmZvIjp7IjEiOnsiaWF0IjoxNzE4MTk0MDEyLCJhY2Nlc3MiOnRydWV9fSwic3VtIjoiYWFmOWZjOGNkN2MzMDZjOTZiMTM3YzJiYmJjNjQ3OGM0NmY2MmJjYWQxZGQ1OTM4OGMwYmFkZDk4Njk2ZTA4OCJ9fQ.VevkzfsmJZN-ETiSEOx6ciNJNdNrT1ipRVyu_AKhVkODXIzMnr96mGbdga8gwcDvurJYv0F8QXCnXi6URJPi6A; sl_session=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTgyMzg3NzYsInVuaXQiOiJldV9uYyIsInJhdyI6eyJtZXRhIjoiQVdXQng5WkZBY0FCWkdSTnI2aExRQUptSmwrUDI0VUFCR1ltWDQvYmhRQUVaaVpmbWRDSVFBTUNLZ0VBUVVGQlFVRkJRVUZCUVVKdFdtRkxaRXBSVWtGQmR6MDkiLCJzdW0iOiJhYWY5ZmM4Y2Q3YzMwNmM5NmIxMzdjMmJiYmM2NDc4YzQ2ZjYyYmNhZDFkZDU5Mzg4YzBiYWRkOTg2OTZlMDg4IiwibG9jIjoiemhfY24iLCJhcGMiOiJSZWxlYXNlIiwiaWF0IjoxNzE4MTk1NTc2LCJzYWMiOnsiVXNlclN0YWZmU3RhdHVzIjoiMSIsIlVzZXJUeXBlIjoiNDIifSwibG9kIjpudWxsLCJucyI6ImxhcmsiLCJuc191aWQiOiI3MzE0MzQ2OTkyOTIxMDY3NTIxIiwibnNfdGlkIjoiNzIzMzk5MjMxODMwMTk3ODYyNiIsIm90IjoxfX0.KyqL8o8buuFFWBfurekxIlV2mhNZuvBEmUdyD2FjQ5kQc3RmjqlnxPe2g2Mh9HPUaBi31rILaW9NNsPyeDZKHA; swp_csrf_token=06b39a70-8d22-40fb-9d86-a39aecc2a1b6; t_beda37=23d411157af861afbc9c1bf6032b116898bb57702b61c0c8e7ac536df6d7ccec'
80 | fly_book_auth.perepare_auth(cookie_str)
81 | params = ParamsBuilder.build_receive_msg_param(fly_book_auth).get()
82 | url = f"wss://msg-frontier.feishu.cn/ws/v2?{urlencode(params)}"
83 | live.start_ws(url)
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenFeiShuApi 🚀 - 飞书第三方API集成库
2 |
3 | [](https://www.python.org/)
4 | [](https://nodejs.org/zh-cn/)
5 |
6 | **✨ 飞书开放API的Python现代化封装库,提供简洁优雅的接口设计与全面的功能覆盖。**
7 |
8 | **⚠️ 注意:如有侵权联系作者删除。**
9 |
10 |
11 |
12 | | 模块 | 已实现 |
13 | |----------|---------------------------------------------------------------------------------|
14 | | 飞书PC | ✅ 飞书所有http接口(protobuf) |
15 | | 飞书PC | ✅ 飞书websockets私信ws协议(接收发消息,gzip+protobuf协议) |
16 |
17 |
18 | ## 🚀 一些成品
19 | - pendding~
20 |
21 |
22 | ## 特性亮点 ✨
23 |
24 | - 🧩 **常用接口全覆盖** - 支持飞书开放平台全部API版本
25 | - 🚀 **异步优先** - 支持async/await异步模式
26 | - 📡 **事件框架** - 简洁易用的事件订阅处理中间件
27 |
28 | ## 🛠️ 快速开始
29 | ### ⛳运行环境
30 | - Python 3.7+
31 | - Node.js 18+
32 |
33 | ### 🎯安装依赖
34 | ```
35 | pip install -r requirements.txt
36 | npm install
37 | ```
38 |
39 | ### 🎨配置文件
40 | 复制cookie到代码中(注意!登录飞书后的cookie才是有效的,不登陆没有用,不然怎么知道给谁发消息)
41 |
42 |
43 | ### 🚀运行项目
44 | ```
45 | python FlyBookAutoAsync.py
46 | ```
47 |
48 | ### 🗝️注意事项
49 | - FlyBookAutoAsync.py中的代码是接收发消息的主入口,可以根据自己的需求进行修改
50 | - FlyBookApi.py中的代码包含了api接口的模板,sign参数已经解密,可以根据自己的需求进行修改,添加其他的接口
51 |
52 |
53 | ## 🧸额外说明
54 | 1. 感谢star⭐和follow📰!不时更新
55 | 2. 作者的联系方式在主页里,有问题可以随时联系我
56 | 3. 可以关注下作者的其他项目,欢迎 PR 和 issue
57 | 4. 感谢赞助!如果此项目对您有帮助,请作者喝一杯奶茶~~ (开心一整天😊😊)
58 | 5. thank you~~~
59 |
60 |
61 |

62 |

63 |
64 |
65 |
66 | ## 📈 Star 趋势
67 | ## Star History
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/builder/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__init__.py
--------------------------------------------------------------------------------
/builder/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/builder/__pycache__/auth.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__pycache__/auth.cpython-39.pyc
--------------------------------------------------------------------------------
/builder/__pycache__/header.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__pycache__/header.cpython-39.pyc
--------------------------------------------------------------------------------
/builder/__pycache__/params.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__pycache__/params.cpython-39.pyc
--------------------------------------------------------------------------------
/builder/__pycache__/proto.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/builder/__pycache__/proto.cpython-39.pyc
--------------------------------------------------------------------------------
/builder/auth.py:
--------------------------------------------------------------------------------
1 | from utils.fly_book_utils import trans_cookies
2 |
3 | class FlyBookAuth:
4 | def __init__(self):
5 | self.cookie = {}
6 | self.cookie_str = ''
7 |
8 | def perepare_auth(self, cookie_str: str):
9 | self.cookie = trans_cookies(cookie_str)
10 | self.cookie_str = cookie_str
11 |
--------------------------------------------------------------------------------
/builder/header.py:
--------------------------------------------------------------------------------
1 | from utils.fly_book_utils import generate_request_id, generate_long_request_id
2 |
3 |
4 | class Header:
5 | def __init__(self):
6 | self.headers = {}
7 |
8 | def set_header(self, key, value):
9 | self.headers[key] = value
10 |
11 | def set_header_from_dict(self, kv):
12 | for k, v in kv.items():
13 | self.set_header(k, v)
14 |
15 | def remove_header(self, key):
16 | if key in self.headers:
17 | del self.headers[key]
18 |
19 | def get(self):
20 | return self.headers
21 |
22 | class HeaderBuilder:
23 | @staticmethod
24 | def build_common_header():
25 | common_header = {
26 | "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
27 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
28 | "cache-control": "max-age=0",
29 | "priority": "u=0, i",
30 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
31 | "sec-ch-ua-mobile": "?0",
32 | "sec-ch-ua-platform": "\"Windows\"",
33 | "sec-fetch-dest": "document",
34 | "sec-fetch-mode": "navigate",
35 | "sec-fetch-site": "same-origin",
36 | "sec-fetch-user": "?1",
37 | "upgrade-insecure-requests": "1",
38 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
39 | }
40 | header = Header()
41 | header.set_header_from_dict(common_header)
42 | return header
43 |
44 | @staticmethod
45 | def build_get_csrf_token_header():
46 | get_csrf_token_header = {
47 | "accept": "application/json, text/plain, */*",
48 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
49 | "cache-control": "no-cache",
50 | "content-length": "0",
51 | "origin": "https://open-dev.feishu.cn",
52 | "priority": "u=1, i",
53 | "referer": "https://open-dev.feishu.cn/",
54 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
55 | "sec-ch-ua-mobile": "?0",
56 | "sec-ch-ua-platform": "\"Windows\"",
57 | "sec-fetch-dest": "empty",
58 | "sec-fetch-mode": "cors",
59 | "sec-fetch-site": "same-site",
60 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
61 | "x-api-version": "1.0.8",
62 | "x-app-id": "12",
63 | "x-device-info": "platform=websdk",
64 | "x-lgw-os-type": "1",
65 | "x-lgw-terminal-type": "2",
66 | "x-request-id": generate_request_id(),
67 | "x-terminal-type": "2"
68 | }
69 | header = Header()
70 | header.set_header_from_dict(get_csrf_token_header)
71 | return header
72 |
73 | @staticmethod
74 | def build_get_user_info_header(x_csrf_token):
75 | get_user_info_header = {
76 | "accept": "application/json, text/plain, */*",
77 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
78 | "cache-control": "no-cache",
79 | "origin": "https://open-dev.feishu.cn",
80 | "priority": "u=1, i",
81 | "referer": "https://open-dev.feishu.cn/",
82 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
83 | "sec-ch-ua-mobile": "?0",
84 | "sec-ch-ua-platform": "\"Windows\"",
85 | "sec-fetch-dest": "empty",
86 | "sec-fetch-mode": "cors",
87 | "sec-fetch-site": "same-site",
88 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
89 | "x-api-version": "1.0.8",
90 | "x-app-id": "12",
91 | "x-csrf-token": x_csrf_token,
92 | "x-device-info": "platform=websdk",
93 | "x-lgw-os-type": "1",
94 | "x-lgw-terminal-type": "2",
95 | "x-locale": "zh-CN",
96 | "x-request-id": generate_long_request_id(),
97 | "x-terminal-type": "2"
98 | }
99 | header = Header()
100 | header.set_header_from_dict(get_user_info_header)
101 | return header
102 |
103 | @staticmethod
104 | def build_send_msg_header():
105 | send_msg_header = {
106 | "accept": "*/*",
107 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
108 | "content-type": "application/x-protobuf",
109 | "locale": "zh_CN",
110 | "origin": "https://open-dev.feishu.cn",
111 | "priority": "u=1, i",
112 | "referer": "https://open-dev.feishu.cn/",
113 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
114 | "sec-ch-ua-mobile": "?0",
115 | "sec-ch-ua-platform": "\"Windows\"",
116 | "sec-fetch-dest": "empty",
117 | "sec-fetch-mode": "cors",
118 | "sec-fetch-site": "same-site",
119 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
120 | "x-appid": "161471",
121 | "x-command": "5",
122 | "x-command-version": "5.7.0",
123 | "x-lgw-os-type": "1",
124 | "x-lgw-terminal-type": "2",
125 | "x-request-id": generate_request_id(),
126 | "x-source": "web",
127 | "x-web-version": "3.9.32"
128 | }
129 | header = Header()
130 | header.set_header_from_dict(send_msg_header)
131 | return header
132 |
133 | @staticmethod
134 | def build_create_chat_header():
135 | create_chat_header = {
136 | "accept": "*/*",
137 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
138 | "content-type": "application/x-protobuf",
139 | "locale": "zh_CN",
140 | "origin": "https://open-dev.feishu.cn",
141 | "priority": "u=1, i",
142 | "referer": "https://open-dev.feishu.cn/",
143 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
144 | "sec-ch-ua-mobile": "?0",
145 | "sec-ch-ua-platform": "\"Windows\"",
146 | "sec-fetch-dest": "empty",
147 | "sec-fetch-mode": "cors",
148 | "sec-fetch-site": "same-site",
149 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
150 | "x-appid": "161471",
151 | "x-command": "13",
152 | "x-command-version": "2.7.0",
153 | "x-lgw-os-type": "1",
154 | "x-lgw-terminal-type": "2",
155 | "x-request-id": generate_request_id(),
156 | "x-source": "web",
157 | "x-web-version": "3.9.32"
158 | }
159 | header = Header()
160 | header.set_header_from_dict(create_chat_header)
161 | return header
162 |
163 |
164 | @staticmethod
165 | def build_search_header():
166 | search_header = {
167 | "accept": "*/*",
168 | "accept-encoding": "gzip, deflate, br, zstd",
169 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
170 | "content-length": "117",
171 | "content-type": "application/x-protobuf",
172 | "locale": "zh_CN",
173 | "origin": "https://open-dev.feishu.cn",
174 | "priority": "u=1, i",
175 | "referer": "https://open-dev.feishu.cn/",
176 | "sec-ch-ua": "\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
177 | "sec-ch-ua-mobile": "?0",
178 | "sec-ch-ua-platform": "\"Windows\"",
179 | "sec-fetch-dest": "empty",
180 | "sec-fetch-mode": "cors",
181 | "sec-fetch-site": "same-site",
182 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
183 | "x-appid": "161471",
184 | "x-command": "11021",
185 | "x-command-version": "2.7.0",
186 | "x-lgw-os-type": "1",
187 | "x-lgw-terminal-type": "2",
188 | "x-request-id": generate_request_id(),
189 | "x-source": "web",
190 | "x-web-version": "3.9.32"
191 | }
192 | header = Header()
193 | header.set_header_from_dict(search_header)
194 | return header
195 |
--------------------------------------------------------------------------------
/builder/params.py:
--------------------------------------------------------------------------------
1 | import re
2 | import time
3 |
4 | import requests
5 |
6 | from builder.header import HeaderBuilder
7 | from utils.fly_book_utils import fly_book_js, generate_access_key, generate_request_id
8 |
9 |
10 | class Params:
11 | def __init__(self):
12 | self.params = {}
13 |
14 | def add_param_by_dict(self, params):
15 | self.params.update(params)
16 |
17 | def add_param(self, key, value):
18 | self.params[key] = value
19 |
20 | def get(self):
21 | return self.params
22 |
23 |
24 | class ParamsBuilder:
25 | base_url = 'https://open-dev.feishu.cn/messenger/'
26 | get_ticket_url = "https://login.feishu.cn/suite/passport/frontier_ticket/"
27 |
28 | @staticmethod
29 | def build_receive_msg_param(auth):
30 | params = Params()
31 | headers = HeaderBuilder.build_common_header().get()
32 |
33 | cookies = auth.cookie
34 | deviceid = cookies.get('passport_web_did')
35 | res = requests.get(ParamsBuilder.base_url, cookies=cookies, headers=headers, verify=False)
36 | res_text = res.text
37 | appKey = re.findall(r'appKey: "(.*?)"', res_text)[0]
38 | mystr = f'2{appKey}{deviceid}f8a69f1719916z'
39 | access_key = generate_access_key(mystr)
40 | request_id = generate_request_id()
41 | params.add_param("local_device_id", deviceid)
42 |
43 | response = requests.get(ParamsBuilder.get_ticket_url, headers=headers, cookies=cookies, params=params.get(), verify=False)
44 | res_json = response.json()
45 | ticket = res_json.get('ticket')
46 |
47 | params = Params()
48 | params.add_param_by_dict({
49 | "access_key": access_key,
50 | "aid": "1",
51 | "ticket": ticket,
52 | "device_id": deviceid,
53 | "fpid": "2",
54 | "accept_encoding": "gzip",
55 | "request_id": request_id
56 | })
57 | return params
58 |
59 | @staticmethod
60 | def build_get_user_info_param():
61 | params = Params()
62 | params.add_param_by_dict({
63 | "app_id": "12",
64 | "_t": str(int(time.time() * 1000))
65 | })
66 | return params
67 |
68 | @staticmethod
69 | def build_get_csrf_token_param():
70 | params = Params()
71 | params.add_param_by_dict({
72 | "_t": str(int(time.time() * 1000))
73 | })
74 | return params
75 |
--------------------------------------------------------------------------------
/builder/proto.py:
--------------------------------------------------------------------------------
1 | import static.proto_pb2 as FLY_BOOK_PROTO
2 |
3 | from protobuf_to_dict import protobuf_to_dict
4 | from utils.fly_book_utils import generate_request_cid
5 |
6 |
7 | class ProtoBuilder:
8 | @staticmethod
9 | def build_send_message_request_proto(sends_text, request_id, chatId):
10 | cid_1 = generate_request_cid()
11 | cid_2 = generate_request_cid()
12 |
13 | Packet = FLY_BOOK_PROTO.Packet()
14 | Packet.payloadType = 1
15 | Packet.cmd = 5
16 | Packet.cid = request_id
17 |
18 | PutMessageRequest = FLY_BOOK_PROTO.PutMessageRequest()
19 | PutMessageRequest.type = 4
20 | PutMessageRequest.chatId = chatId
21 | PutMessageRequest.cid = cid_1
22 | PutMessageRequest.isNotified = 1
23 | PutMessageRequest.version = 1
24 |
25 | PutMessageRequest.content.richText.elementIds.append(cid_2)
26 | PutMessageRequest.content.richText.innerText = sends_text
27 | PutMessageRequest.content.richText.elements.dictionary[cid_2].tag = 1
28 |
29 | TextProperty = FLY_BOOK_PROTO.TextProperty()
30 | TextProperty.content = sends_text
31 | PutMessageRequest.content.richText.elements.dictionary[cid_2].property = TextProperty.SerializeToString()
32 |
33 | Packet.payload = PutMessageRequest.SerializeToString()
34 | return Packet
35 |
36 | @staticmethod
37 | def build_search_request_proto(request_id, query):
38 | request_cid = generate_request_cid()
39 | Packet = FLY_BOOK_PROTO.Packet()
40 | Packet.payloadType = 1
41 | Packet.cmd = 11021
42 | Packet.cid = request_id
43 |
44 | UniversalSearchRequest = FLY_BOOK_PROTO.UniversalSearchRequest()
45 | UniversalSearchRequest.header.searchSession = request_cid
46 | UniversalSearchRequest.header.sessionSeqId = 1
47 | UniversalSearchRequest.header.query = query
48 | UniversalSearchRequest.header.searchContext.tagName = 'SMART_SEARCH'
49 |
50 | EntityItem_1 = FLY_BOOK_PROTO.EntityItem()
51 | EntityItem_1.type = 1
52 | # EntityItem_1.filter.userFilter.isResigned = 1
53 | # EntityItem_1.filter.userFilter.haveChatter = 0
54 | # EntityItem_1.filter.userFilter.exclude = 1
55 |
56 | EntityItem_2 = FLY_BOOK_PROTO.EntityItem()
57 | EntityItem_2.type = 2
58 | EntityFilter = FLY_BOOK_PROTO.EntityItem.EntityFilter()
59 | EntityItem_2.filter.CopyFrom(EntityFilter)
60 |
61 | EntityItem_3 = FLY_BOOK_PROTO.EntityItem()
62 | GroupChatFilter = FLY_BOOK_PROTO.GroupChatFilter()
63 | EntityItem_3.type = 3
64 | EntityItem_3.filter.groupChatFilter.CopyFrom(GroupChatFilter)
65 |
66 | EntityItem_4 = FLY_BOOK_PROTO.EntityItem()
67 | EntityItem_4.type = 10
68 | EntityFilter = FLY_BOOK_PROTO.EntityItem.EntityFilter()
69 | EntityItem_4.filter.CopyFrom(EntityFilter)
70 |
71 | UniversalSearchRequest.header.searchContext.entityItems.append(EntityItem_1)
72 | UniversalSearchRequest.header.searchContext.entityItems.append(EntityItem_2)
73 | UniversalSearchRequest.header.searchContext.entityItems.append(EntityItem_3)
74 | UniversalSearchRequest.header.searchContext.entityItems.append(EntityItem_4)
75 | UniversalSearchRequest.header.searchContext.commonFilter.includeOuterTenant = 1
76 | UniversalSearchRequest.header.searchContext.sourceKey = 'messenger'
77 | UniversalSearchRequest.header.locale = 'zh_CN'
78 | SearchExtraParam = FLY_BOOK_PROTO.SearchExtraParam()
79 | UniversalSearchRequest.header.extraParam.CopyFrom(SearchExtraParam)
80 | Packet.payload = UniversalSearchRequest.SerializeToString()
81 | return Packet
82 |
83 | @staticmethod
84 | def decode_search_response_proto(message):
85 | userAndGroupIds = []
86 | Packet = FLY_BOOK_PROTO.Packet()
87 | Packet.ParseFromString(message)
88 | Packet = protobuf_to_dict(Packet)
89 | if 'payload' in Packet:
90 | payload = Packet['payload']
91 | UniversalSearchResponse = FLY_BOOK_PROTO.UniversalSearchResponse()
92 | UniversalSearchResponse.ParseFromString(payload)
93 | UniversalSearchResponse = protobuf_to_dict(UniversalSearchResponse)
94 | Packet['payload'] = UniversalSearchResponse
95 |
96 | print(UniversalSearchResponse)
97 | for result in UniversalSearchResponse['results']:
98 | if result['type'] == 1:
99 | userAndGroupIds.append({
100 | 'type': 'user',
101 | 'id': result['id']
102 | })
103 | elif result['type'] == 3:
104 | userAndGroupIds.append({
105 | 'type': 'group',
106 | 'id': result['id']
107 | })
108 |
109 | return Packet, userAndGroupIds
110 |
111 |
112 | @staticmethod
113 | def build_create_chat_request_proto(request_id, chatId):
114 | Packet = FLY_BOOK_PROTO.Packet()
115 | Packet.payloadType = 1
116 | Packet.cmd = 13
117 | Packet.cid = request_id
118 |
119 | PutChatRequest = FLY_BOOK_PROTO.PutChatRequest()
120 | PutChatRequest.type = 1
121 | PutChatRequest.chatterIds.append(chatId)
122 | Packet.payload = PutChatRequest.SerializeToString()
123 | return Packet
124 |
125 | @staticmethod
126 | def decode_create_chat_response_proto(message):
127 | chatId = None
128 | Packet = FLY_BOOK_PROTO.Packet()
129 | Packet.ParseFromString(message)
130 | Packet = protobuf_to_dict(Packet)
131 | if 'payload' in Packet:
132 | payload = Packet['payload']
133 | PutChatResponse = FLY_BOOK_PROTO.PutChatResponse()
134 | PutChatResponse.ParseFromString(payload)
135 | PutChatResponse = protobuf_to_dict(PutChatResponse)
136 | Packet['payload'] = PutChatResponse
137 | chatId = PutChatResponse['chat']['id']
138 | return Packet, chatId
139 |
140 | @staticmethod
141 | def decode_receive_msg_proto(message):
142 | fromId = None
143 | ChatId = None
144 | ReceiveTextContent = ''
145 | Frame = FLY_BOOK_PROTO.Frame()
146 | Frame.ParseFromString(message)
147 | Frame = protobuf_to_dict(Frame)
148 | payload = Frame['payload']
149 | Packet = FLY_BOOK_PROTO.Packet()
150 | Packet.ParseFromString(payload)
151 | Packet = protobuf_to_dict(Packet)
152 | Frame['payload'] = Packet
153 | Packet_sid = Packet['sid']
154 | if 'payload' in Packet:
155 | payload = Packet['payload']
156 | PushMessagesRequest = FLY_BOOK_PROTO.PushMessagesRequest()
157 | PushMessagesRequest.ParseFromString(payload)
158 | PushMessagesRequest = protobuf_to_dict(PushMessagesRequest)
159 | Packet['payload'] = PushMessagesRequest
160 | if 'messages' in PushMessagesRequest:
161 | messages = PushMessagesRequest['messages']
162 | for k, v in messages.items():
163 | message_type = v['type']
164 | fromId = v['fromId']
165 | content = v['content']
166 | ChatId = v['chatId']
167 | if message_type == 4:
168 | TextContent = FLY_BOOK_PROTO.TextContent()
169 | TextContent.ParseFromString(content)
170 | TextContent = protobuf_to_dict(TextContent)
171 | v['content'] = TextContent
172 | dictionary = TextContent['richText']['elements']['dictionary']
173 | for k, v in dictionary.items():
174 | property = v['property']
175 | TextProperty = FLY_BOOK_PROTO.TextProperty()
176 | TextProperty.ParseFromString(property)
177 | TextProperty = protobuf_to_dict(TextProperty)
178 | v['property'] = TextProperty
179 | ReceiveTextContent += TextProperty['content']
180 |
181 | return Frame, Packet_sid, fromId, ChatId, ReceiveTextContent
182 |
183 |
184 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | requests
2 | loguru
3 | websocket-client
4 | blackboxprotobuf==1.0.1
5 | protobuf==5.28.3
6 | protobuf3-to-dict==0.1.5
7 |
--------------------------------------------------------------------------------
/static/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/static/__init__.py
--------------------------------------------------------------------------------
/static/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/static/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/static/__pycache__/proto_pb2.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/static/__pycache__/proto_pb2.cpython-39.pyc
--------------------------------------------------------------------------------
/static/fly_book.js:
--------------------------------------------------------------------------------
1 | function T(e, t) {
2 | var n = (65535 & e) + (65535 & t);
3 | return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
4 | }
5 | function f(e, t, n, i, r, a) {
6 | return T((o = T(T(t, e), T(i, a))) << (s = r) | o >>> 32 - s, n);
7 | var o, s
8 | }
9 | function h(e, t, n, i, r, a, o) {
10 | return f(t & n | ~t & i, e, t, r, a, o)
11 | }
12 | function y(e, t, n, i, r, a, o) {
13 | return f(t & i | n & ~i, e, t, r, a, o)
14 | }
15 | function S(e, t, n, i, r, a, o) {
16 | return f(t ^ n ^ i, e, t, r, a, o)
17 | }
18 | function A(e, t, n, i, r, a, o) {
19 | return f(n ^ (t | ~i), e, t, r, a, o)
20 | }
21 | function g(e, t) {
22 | var n, i, r, a, o;
23 | e[t >> 5] |= 128 << t % 32,
24 | e[14 + (t + 64 >>> 9 << 4)] = t;
25 | var s = 1732584193
26 | , c = -271733879
27 | , d = -1732584194
28 | , l = 271733878;
29 | for (n = 0; n < e.length; n += 16)
30 | i = s,
31 | r = c,
32 | a = d,
33 | o = l,
34 | s = h(s, c, d, l, e[n], 7, -680876936),
35 | l = h(l, s, c, d, e[n + 1], 12, -389564586),
36 | d = h(d, l, s, c, e[n + 2], 17, 606105819),
37 | c = h(c, d, l, s, e[n + 3], 22, -1044525330),
38 | s = h(s, c, d, l, e[n + 4], 7, -176418897),
39 | l = h(l, s, c, d, e[n + 5], 12, 1200080426),
40 | d = h(d, l, s, c, e[n + 6], 17, -1473231341),
41 | c = h(c, d, l, s, e[n + 7], 22, -45705983),
42 | s = h(s, c, d, l, e[n + 8], 7, 1770035416),
43 | l = h(l, s, c, d, e[n + 9], 12, -1958414417),
44 | d = h(d, l, s, c, e[n + 10], 17, -42063),
45 | c = h(c, d, l, s, e[n + 11], 22, -1990404162),
46 | s = h(s, c, d, l, e[n + 12], 7, 1804603682),
47 | l = h(l, s, c, d, e[n + 13], 12, -40341101),
48 | d = h(d, l, s, c, e[n + 14], 17, -1502002290),
49 | s = y(s, c = h(c, d, l, s, e[n + 15], 22, 1236535329), d, l, e[n + 1], 5, -165796510),
50 | l = y(l, s, c, d, e[n + 6], 9, -1069501632),
51 | d = y(d, l, s, c, e[n + 11], 14, 643717713),
52 | c = y(c, d, l, s, e[n], 20, -373897302),
53 | s = y(s, c, d, l, e[n + 5], 5, -701558691),
54 | l = y(l, s, c, d, e[n + 10], 9, 38016083),
55 | d = y(d, l, s, c, e[n + 15], 14, -660478335),
56 | c = y(c, d, l, s, e[n + 4], 20, -405537848),
57 | s = y(s, c, d, l, e[n + 9], 5, 568446438),
58 | l = y(l, s, c, d, e[n + 14], 9, -1019803690),
59 | d = y(d, l, s, c, e[n + 3], 14, -187363961),
60 | c = y(c, d, l, s, e[n + 8], 20, 1163531501),
61 | s = y(s, c, d, l, e[n + 13], 5, -1444681467),
62 | l = y(l, s, c, d, e[n + 2], 9, -51403784),
63 | d = y(d, l, s, c, e[n + 7], 14, 1735328473),
64 | s = S(s, c = y(c, d, l, s, e[n + 12], 20, -1926607734), d, l, e[n + 5], 4, -378558),
65 | l = S(l, s, c, d, e[n + 8], 11, -2022574463),
66 | d = S(d, l, s, c, e[n + 11], 16, 1839030562),
67 | c = S(c, d, l, s, e[n + 14], 23, -35309556),
68 | s = S(s, c, d, l, e[n + 1], 4, -1530992060),
69 | l = S(l, s, c, d, e[n + 4], 11, 1272893353),
70 | d = S(d, l, s, c, e[n + 7], 16, -155497632),
71 | c = S(c, d, l, s, e[n + 10], 23, -1094730640),
72 | s = S(s, c, d, l, e[n + 13], 4, 681279174),
73 | l = S(l, s, c, d, e[n], 11, -358537222),
74 | d = S(d, l, s, c, e[n + 3], 16, -722521979),
75 | c = S(c, d, l, s, e[n + 6], 23, 76029189),
76 | s = S(s, c, d, l, e[n + 9], 4, -640364487),
77 | l = S(l, s, c, d, e[n + 12], 11, -421815835),
78 | d = S(d, l, s, c, e[n + 15], 16, 530742520),
79 | s = A(s, c = S(c, d, l, s, e[n + 2], 23, -995338651), d, l, e[n], 6, -198630844),
80 | l = A(l, s, c, d, e[n + 7], 10, 1126891415),
81 | d = A(d, l, s, c, e[n + 14], 15, -1416354905),
82 | c = A(c, d, l, s, e[n + 5], 21, -57434055),
83 | s = A(s, c, d, l, e[n + 12], 6, 1700485571),
84 | l = A(l, s, c, d, e[n + 3], 10, -1894986606),
85 | d = A(d, l, s, c, e[n + 10], 15, -1051523),
86 | c = A(c, d, l, s, e[n + 1], 21, -2054922799),
87 | s = A(s, c, d, l, e[n + 8], 6, 1873313359),
88 | l = A(l, s, c, d, e[n + 15], 10, -30611744),
89 | d = A(d, l, s, c, e[n + 6], 15, -1560198380),
90 | c = A(c, d, l, s, e[n + 13], 21, 1309151649),
91 | s = A(s, c, d, l, e[n + 4], 6, -145523070),
92 | l = A(l, s, c, d, e[n + 11], 10, -1120210379),
93 | d = A(d, l, s, c, e[n + 2], 15, 718787259),
94 | c = A(c, d, l, s, e[n + 9], 21, -343485551),
95 | s = T(s, i),
96 | c = T(c, r),
97 | d = T(d, a),
98 | l = T(l, o);
99 | return [s, c, d, l]
100 | }
101 | function I(e) {
102 | var t, n = "", i = 32 * e.length;
103 | for (t = 0; t < i; t += 8)
104 | n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
105 | return n
106 | }
107 | function m(e) {
108 | var t, n = [];
109 | for (n[(e.length >> 2) - 1] = void 0,
110 | t = 0; t < n.length; t += 1)
111 | n[t] = 0;
112 | var i = 8 * e.length;
113 | for (t = 0; t < i; t += 8)
114 | n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
115 | return n
116 | }
117 | function C(e) {
118 | var t, n, i = "";
119 | for (n = 0; n < e.length; n += 1)
120 | t = e.charCodeAt(n),
121 | i += "0123456789abcdef".charAt(t >>> 4 & 15) + "0123456789abcdef".charAt(15 & t);
122 | return i
123 | }
124 | function N(e) {
125 | return unescape(encodeURIComponent(e))
126 | }
127 | function O(e) {
128 | return function(e) {
129 | return I(g(m(e), 8 * e.length))
130 | }(N(e))
131 | }
132 | function generate_access_key(e) {
133 | return C(O(e))
134 | }
135 |
136 |
137 | // request_id
138 | function generate_request_id() {
139 | return (Math.random().toString(36) + "0000000000").substring(2, 2 + "0000000000".length)
140 | }
141 |
142 | function generate_long_request_id() {
143 | return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function(e) {
144 | var t = 16 * Math.random() | 0;
145 | return ("x" === e ? t : 3 & t | 8).toString(16)
146 | }
147 | ))
148 | }
149 | // request_cid and session_id
150 | function generate_request_cid() {
151 | let e = 10, t = undefined
152 | const n = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("")
153 | , i = [];
154 | let r = null
155 | , a = null
156 | , o = null;
157 | const s = n.length;
158 | if (t = (t = t || s) > s ? s : t,
159 | e)
160 | for (r = 0; r < e; r++)
161 | o = 0 | Math.random() * t,
162 | i[r] = n[o];
163 | else
164 | for (i[8] = "-",
165 | i[13] = "-",
166 | i[18] = "-",
167 | i[23] = "-",
168 | i[14] = "4",
169 | r = 0; r < 36; r++)
170 | i[r] || (a = 0 | 16 * Math.random(),
171 | i[r] = n[19 === r ? 3 & a | 8 : a]);
172 | return i.join("")
173 | }
174 |
175 |
176 | function generate_csrf_token() {
177 | let e = "swp_csrf_token"
178 | let document = {
179 | cookie: "locale=zh-CN; _gcl_au=1.1.1773137480.1713790863; _ga=GA1.1.252483876.1713790863; _ga_VPYRHN104D=GS1.1.1713790863.1.1.1713790872.51.0.0; lang=zh; __tea__ug__uid=1007701713790873353; et=5149005c67cbe62db3d7f613bb9c7440; Hm_lvt_e78c0cb1b97ef970304b53d2097845fd=1716609558; i18n_locale=zh-CN; _csrf_token=36b375aad3381c672c2752df4c2f78c9bc1b51ae-1716787751; ccm_cdn_host=//lf-scm-cn.feishucdn.com; MONITOR_WEB_ID=eb362632-773d-4a6c-b3f7-fd69a73f80e1; msToken=1aL_Z6EfXm8A5YvLxai6CT2XUrk4rk-TS1Tr9VEIqx5dwdqXD_raGfMXYFZPQr3B_aVm00bKlLyYQ6fw2u-BHADiWT81bCZ2Vfft2Dm0_AzIVT8PUcoBPjUu0STE1Q==; swp_csrf_token=b2f409f7-fd71-4915-bf04-9248fcedd78d"
180 | }
181 | return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*".concat(encodeURIComponent(e).replace(/[-.+*]/g, "\\$&"), "\\s*\\=\\s*([^;]*).*$)|^.*$")), "$1")) || ""
182 | }
183 |
184 |
--------------------------------------------------------------------------------
/static/proto.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | message Frame {
4 | uint64 seqid = 1;
5 | uint64 logid = 2;
6 | int32 service = 3;
7 | int32 method = 4;
8 | repeated ExtendedEntry headers = 5;
9 | string payloadEncoding = 6;
10 | string payloadType = 7;
11 | bytes payload = 8;
12 | }
13 |
14 | message Packet {
15 | string sid = 1;
16 | PayloadType payloadType = 2;
17 | int32 cmd = 3;
18 | uint32 status = 4;
19 | bytes payload = 5;
20 | string cid = 6;
21 | PipeEntity pipeEntity = 7;
22 | repeated VersionPayload versionPayloads = 8;
23 | repeated PipeEntity pipeEntities = 9;
24 | uint32 waitRetryInterval = 10;
25 | int32 command = 11;
26 | uint64 cursor = 12;
27 | }
28 |
29 | message PushMessagesRequest {
30 | map messages = 1;
31 | map participatedMessageIds = 3;
32 | map forcePush = 8;
33 | map messagesAtMe = 9;
34 | }
35 |
36 | message PutMessageRequest {
37 | Type type = 1;
38 | Content content = 2;
39 | string chatId = 3;
40 | string rootId = 4;
41 | string parentId = 5;
42 | string cid = 6;
43 | bool isNotified = 7;
44 | bool sendToChat = 8;
45 | int32 version = 9;
46 | bool isThreadGroupTopic = 10;
47 | bool isAnonymous = 11;
48 | repeated string leftStaticResourceKeys = 101;
49 | bytes thriftMessage = 102;
50 | }
51 |
52 |
53 | message PutChatRequest {
54 | Type type = 1;
55 | repeated string userIds = 2;
56 | string groupName = 3;
57 | string groupDesc = 4;
58 | bool isPublic = 5;
59 | repeated string chatterIds = 6;
60 | string organizationId = 7;
61 | string fromChatId = 8;
62 | repeated string initMessageIds = 9;
63 | string iconKey = 10;
64 | map docPerms = 11;
65 | bool isCrossTenant = 12;
66 | bool isPublicV2 = 13;
67 | map docPerms2 = 15;
68 | string cid = 16;
69 |
70 | enum DocPermType {
71 | UNKNOWN = 0;
72 | READ = 1;
73 | EDIT = 2;
74 | }
75 |
76 | message DocPair {
77 | map perms = 1;
78 | }
79 | }
80 |
81 | message PutChatResponse {
82 | Chat chat = 1;
83 | FeedCard feedCard = 2;
84 | }
85 |
86 | message UniversalSearchRequest {
87 | SearchCommonRequestHeader header = 1;
88 | }
89 |
90 |
91 |
92 | message UniversalSearchResponse {
93 | SearchCommonResponseHeader header = 1;
94 | repeated SearchResult results = 2;
95 | SearchExtraFields extraFields = 3;
96 | repeated FailedEntityInfo failedEntityInfos = 5;
97 |
98 |
99 | message SearchResult {
100 | string id = 1;
101 | SearchEntityType type = 2;
102 | string titleHighlighted = 3;
103 | string summaryHighlighted = 4;
104 | string extrasHighlighted = 5;
105 | string avatarKey = 6;
106 | string extraInfoSeparator = 10;
107 | }
108 |
109 | enum SearchEntityType {
110 | UNKNOWN = 0;
111 | USER = 1;
112 | BOT = 2;
113 | GROUP_CHAT = 3;
114 | CRYPTO_P2P_CHAT = 4;
115 | MESSAGE = 5;
116 | DOC = 7;
117 | WIKI = 8;
118 | APP = 9;
119 | ONCALL = 10;
120 | THREAD = 11;
121 | QA_CARD = 12;
122 | URL = 13;
123 | DEPARTMENT = 14;
124 | PANO = 15;
125 | SLASH_COMMAND = 16;
126 | SECTION = 17;
127 | RESOURCE = 18;
128 | CUSTOMIZATION = 19;
129 | FACILITY = 20;
130 | MAIL_CONTACT = 21;
131 | CHAMELEON = 22;
132 | CALENDAR_EVENT = 23;
133 | }
134 |
135 |
136 | message SearchCommonResponseHeader {
137 | string searchSession = 1;
138 | int32 sessionSeqId = 2;
139 | int32 total = 3;
140 | bool hasMore = 4;
141 | string paginationToken = 5;
142 | InvokeAbnormalNotice invokeAbnormalNotice = 6;
143 | ColdAndHotStorageInfo storageInfo = 7;
144 |
145 | enum InvokeAbnormalNotice {
146 | INVOKE_NORMAL = 0;
147 | REQUEST_CANCELED = 1;
148 | VERSION_SWITCH = 2;
149 | QUERY_LENGTH_EXCEEDED = 3;
150 | }
151 |
152 | message ColdAndHotStorageInfo {
153 | bool isNeedColdData = 1;
154 | int32 timeSize = 2;
155 | TimeUnit timeUnit = 3;
156 | string timeText = 4;
157 | HasMoreInfo hasMoreInfo = 5;
158 |
159 | enum TimeUnit {
160 | TimeUNKNOWN = 0;
161 | DAY = 1;
162 | WEEK = 2;
163 | MONTH = 3;
164 | YEAR = 4;
165 | }
166 | enum HasMoreInfo {
167 | UNKNOWN = 0;
168 | HOT_HAS_MORE = 1;
169 | HOT_HAS_NO_MORE = 2;
170 | COLD_HAS_MORE = 3;
171 | COLD_HAS_NO_MORE = 4;
172 | }
173 | }
174 | }
175 |
176 | message SearchExtraFields {
177 | bytes chatterPermissionResponse = 1;
178 | }
179 |
180 | message FailedEntityInfo {
181 | SearchEntityType entityType = 1;
182 | bool isNeedLocalFallback = 2;
183 | string localPaginationToken = 3;
184 |
185 | enum SearchEntityType {
186 | UNKNOWN = 0;
187 | USER = 1;
188 | BOT = 2;
189 | GROUP_CHAT = 3;
190 | CRYPTO_P2P_CHAT = 4;
191 | MESSAGE = 5;
192 | DOC = 7;
193 | WIKI = 8;
194 | APP = 9;
195 | ONCALL = 10;
196 | THREAD = 11;
197 | QA_CARD = 12;
198 | URL = 13;
199 | DEPARTMENT = 14;
200 | PANO = 15;
201 | SLASH_COMMAND = 16;
202 | SECTION = 17;
203 | RESOURCE = 18;
204 | CUSTOMIZATION = 19;
205 | FACILITY = 20;
206 | MAIL_CONTACT = 21;
207 | CHAMELEON = 22;
208 | CALENDAR_EVENT = 23;
209 | }
210 | }
211 | }
212 |
213 | message SearchCommonRequestHeader {
214 | string searchSession = 1;
215 | int32 sessionSeqId = 2;
216 | string query = 3;
217 | string paginationToken = 4;
218 | BaseEntity.SearchContext searchContext = 5;
219 | string locale = 6;
220 | string impressionId = 7;
221 | SearchExtraParam extraParam = 8;
222 | Layout titleLayout = 9;
223 | Layout summaryLayout = 10;
224 | int32 pageSize = 11;
225 | Layout sectionSummaryLayout = 13;
226 | message Layout {
227 | int32 line = 1;
228 | int32 width = 2;
229 | }
230 | }
231 | message SearchExtraParam {
232 | bytes chatterPermissionRequest = 1;
233 | int32 queryInputState = 2;
234 | }
235 | message BaseEntity {
236 | message SearchContext {
237 | string tagName = 1;
238 | repeated EntityItem entityItems = 2;
239 | CommonFilter commonFilter = 3;
240 | string sourceKey = 5;
241 | }
242 | }
243 |
244 | message CommonFilter {
245 | bool includeOuterTenant = 1;
246 | string chatId = 2;
247 | }
248 | message UserFilter {
249 | message FieldValues {
250 | repeated string values = 1;
251 | }
252 | bool isResigned = 1;
253 | bool haveChatter = 2;
254 | map customFields = 3;
255 | bool exclude = 4;
256 | }
257 | message GroupChatFilter {
258 | repeated SearchType searchTypes = 1;
259 | repeated string chatMemberIds = 2;
260 | repeated string excludedChatIds = 3;
261 | bool searchCrypto = 4;
262 | bool addableAsUser = 5;
263 | }
264 |
265 | enum SearchType {
266 | TYPE_UNSPECIFIED = 0;
267 | SEARCH_TYPE_1 = 1;
268 | SEARCH_TYPE_2 = 2;
269 | }
270 | message EntityItem {
271 | SearchEntityType type = 1;
272 | EntityFilter filter = 2;
273 | repeated string boostChatIds = 4;
274 | string localPaginationToken = 5;
275 |
276 | message EntityFilter {
277 | oneof filter {
278 | UserFilter userFilter = 1;
279 | GroupChatFilter groupChatFilter = 2;
280 | }
281 | }
282 | enum SearchEntityType {
283 | UNKNOWN = 0;
284 | USER = 1;
285 | BOT = 2;
286 | GROUP_CHAT = 3;
287 | CRYPTO_P2P_CHAT = 4;
288 | MESSAGE = 5;
289 | DOC = 7;
290 | WIKI = 8;
291 | APP = 9;
292 | ONCALL = 10;
293 | THREAD = 11;
294 | QA_CARD = 12;
295 | URL = 13;
296 | DEPARTMENT = 14;
297 | PANO = 15;
298 | SLASH_COMMAND = 16;
299 | SECTION = 17;
300 | RESOURCE = 18;
301 | CUSTOMIZATION = 19;
302 | FACILITY = 20;
303 | MAIL_CONTACT = 21;
304 | CHAMELEON = 22;
305 | CALENDAR_EVENT = 23;
306 | }
307 | }
308 |
309 | message Content {
310 | string text = 1;
311 | string imageKey = 2;
312 | bool isOriginSource = 31;
313 | string title = 3;
314 | repeated string attachments = 4;
315 | bool isNotified = 5;
316 | string audioKey = 7;
317 | int32 audioDuration = 8;
318 | string chatId = 9;
319 | string cryptoToken = 10;
320 | string fileKey = 6;
321 | string fileName = 11;
322 | string fileMime = 12;
323 | int64 fileSize = 13;
324 | FileTransMode fileTransMode = 28;
325 | string senderDeviceId = 29;
326 | RichText richText = 14;
327 | int32 duration = 15;
328 | int32 attendeesCount = 17;
329 | bool isGroupAnnouncement = 18;
330 | string stickerSetId = 24;
331 | string stickerId = 25;
332 | string shareUserId = 27;
333 |
334 | enum FileTransMode {
335 | UNKNOWN = 0;
336 | LAN_TRANS = 1;
337 | }
338 | }
339 | message entities {
340 | message Message {
341 | string id = 1;
342 | Type type = 2;
343 | string fromId = 3;
344 | int64 createTime = 4;
345 | bytes content = 5;
346 | Status status = 6;
347 | FromType fromType = 7;
348 | string rootId = 8;
349 | string parentId = 9;
350 | string chatId = 10;
351 | int64 lastModifyTime = 11;
352 | string cid = 12;
353 | int32 position = 13;
354 | int64 updateTime = 14;
355 | bool isNotified = 15;
356 | string replyCount = 16;
357 | string parentSourceMessageId = 17;
358 | string rootSourceMessageId = 18;
359 | bool isDing = 19;
360 | string threadId = 20;
361 | bool sendToChat = 21;
362 | bool isTruncated = 22;
363 | bool isRemoved = 23;
364 | string channelId = 24;
365 | int32 threadPosition = 28;
366 | int64 removerId = 29;
367 | string translateLanguage = 30;
368 | RemoverType removerType = 31;
369 | int32 noBadgedCount = 33;
370 | bool isBadged = 34;
371 | int32 badgeCount = 35;
372 | int32 threadBadgeCount = 36;
373 | int32 threadReplyCount = 37;
374 | repeated string atOutChatterIds = 38;
375 | string messageLanguage = 39;
376 | bool isNoTraceRemoved = 41;
377 | bool isAutoTranslatedByReceiver = 42;
378 | MessageSensitivity sensitivity = 43;
379 | bool isVisibleV2 = 44;
380 | ChatType chatType = 46;
381 | string originalSenderId = 47;
382 | bool isStaticResourceMessageDeleted = 48;
383 | int64 messagePipeVersion = 52;
384 | bool isBatchCopyMessages = 53;
385 | bool isSpecialFocus = 56;
386 | bool isIncludeDocUrl = 58;
387 | int64 cipherId = 59;
388 | enum Type {
389 | UNKNOWN = 0;
390 | POST = 2;
391 | FILE = 3;
392 | TEXT = 4;
393 | IMAGE = 5;
394 | SYSTEM = 6;
395 | AUDIO = 7;
396 | EMAIL = 8;
397 | SHARE_GROUP_CHAT = 9;
398 | STICKER = 10;
399 | MERGE_FORWARD = 11;
400 | CALENDAR = 12;
401 | CLOUD_FILE = 13;
402 | CARD = 14;
403 | MEDIA = 15;
404 | SHARE_CALENDAR_EVENT = 16;
405 | HONGBAO = 17;
406 | GENERAL_CALENDAR = 18;
407 | VIDEO_CHAT = 19;
408 | LOCATION = 20;
409 | COMMERCIALIZED_HONGBAO = 22;
410 | SHARE_USER_CARD = 23;
411 | TODO = 24;
412 | FOLDER = 25;
413 | }
414 | }
415 |
416 |
417 | enum FromType {
418 | UNKNOWN_FROMTYPE = 0;
419 | USER = 1;
420 | BOT = 2;
421 | }
422 |
423 | enum Status {
424 | UNKNOWN_STATUS = 0;
425 | NORMAL = 1;
426 | DELETED = 2;
427 | MODIFIED = 3;
428 | }
429 |
430 | enum RemoverType {
431 | UNKNOWN_REMOVERTYPE = 0;
432 | GROUPOWNER = 1;
433 | SYSADMIN = 2;
434 | GROUPADMIN = 3;
435 | }
436 |
437 | enum MessageSensitivity {
438 | UNKNOWN_SENSITIVITY = 0;
439 | SAFE = 1;
440 | DANGEROUS = 2;
441 | }
442 |
443 | enum ChatType {
444 | UNKNOWN_CHAT_TYPE = 0;
445 | P2P = 1;
446 | GROUP = 2;
447 | TOPIC_GROUP = 3;
448 | }
449 |
450 | }
451 |
452 | message TextContent {
453 | string text = 1;
454 | RichText richText = 3;
455 | }
456 |
457 | message RichText {
458 | repeated string elementIds = 1;
459 | string innerText = 2;
460 | RichTextElements elements = 3;
461 | repeated string imageIds = 5;
462 | repeated string atIds = 6;
463 | repeated string anchorIds = 7;
464 | repeated string i18nIds = 8;
465 | repeated string mediaIds = 9;
466 | repeated string docsIds = 10;
467 | repeated string interactiveIds = 11;
468 | repeated string mentionIds = 12;
469 | int32 version = 13;
470 | }
471 |
472 |
473 | message RichTextElements {
474 | map dictionary = 1;
475 | map styleRefs = 2;
476 | repeated RichTextStyle styles = 3;
477 |
478 | message RichTextStyle {
479 | string name = 1;
480 | string value = 2;
481 | }
482 |
483 | message RichTextElementStyleRefs {
484 | repeated int32 styleIds = 1 [packed = false];
485 | }
486 | }
487 |
488 |
489 | message RichTextElement {
490 | Tag tag = 1;
491 | map style = 2;
492 | bytes property = 3;
493 | repeated string childIds = 4;
494 | repeated string styleKeys = 5;
495 | enum Tag {
496 | UNKNOWN_TAG = 0;
497 | TEXT = 1;
498 | IMG = 2;
499 | P = 3;
500 | FIGURE = 4;
501 | AT = 5;
502 | A = 6;
503 | B = 7;
504 | I = 8;
505 | U = 9;
506 | EMOTION = 10;
507 | BUTTON = 11;
508 | SELECT = 12;
509 | PROGRESS_SELECT_OPTION = 13;
510 | DIV = 14;
511 | TEXTABLE_AREA = 15;
512 | TIME = 16;
513 | LINK = 17;
514 | MEDIA = 18;
515 | SELECTMENU = 19;
516 | OVERFLOWMENU = 20;
517 | DATEPICKER = 21;
518 | DOCS = 22;
519 | H1 = 23;
520 | H2 = 24;
521 | H3 = 25;
522 | UL = 26;
523 | OL = 27;
524 | LI = 28;
525 | QUOTE = 29;
526 | CODE = 30;
527 | CODE_BLOCK = 31;
528 | HR = 32;
529 | TIMEPICKER = 33;
530 | DATETIMEPICKER = 34;
531 | REACTION = 35;
532 | MENTION = 36;
533 | }
534 | }
535 |
536 |
537 | message TextProperty {
538 | string content = 1;
539 | string i18nKey = 2;
540 | int32 numberOfLines = 3;
541 | }
542 | message ExtendedEntry {
543 | string key = 1;
544 | string value = 2;
545 | }
546 |
547 |
548 | enum PayloadType {
549 | TYPE_UNKNOWN = 0;
550 | PB2 = 1;
551 | JSON = 2;
552 | }
553 |
554 | message PipeEntity {
555 | string type = 1;
556 | int64 id = 3;
557 | }
558 |
559 | message VersionPayload {
560 | VersionRange versionRange = 1;
561 | bytes payload = 2;
562 | }
563 |
564 | message VersionRange {
565 | string start = 1;
566 | string end = 2;
567 | }
568 |
569 | enum Type {
570 | UNKNOWN = 0;
571 | POST = 2;
572 | FILE = 3;
573 | TEXT = 4;
574 | IMAGE = 5;
575 | SYSTEM = 6;
576 | AUDIO = 7;
577 | EMAIL = 8;
578 | SHARE_GROUP_CHAT = 9;
579 | STICKER = 10;
580 | MERGE_FORWARD = 11;
581 | CALENDAR = 12;
582 | CLOUD_FILE = 13;
583 | CARD = 14;
584 | MEDIA = 15;
585 | SHARE_CALENDAR_EVENT = 16;
586 | HONGBAO = 17;
587 | GENERAL_CALENDAR = 18;
588 | VIDEO_CHAT = 19;
589 | LOCATION = 20;
590 | COMMERCIALIZED_HONGBAO = 22;
591 | SHARE_USER_CARD = 23;
592 | TODO = 24;
593 | FOLDER = 25;
594 | }
595 |
596 | message Chat {
597 | string id = 1;
598 | Type type = 2;
599 | string lastMessageId = 3;
600 | string name = 4;
601 | string ownerId = 6;
602 | int32 newMessageCount = 7;
603 | Status status = 8;
604 | int64 updateTime = 9;
605 | string key = 10;
606 | string description = 11;
607 | int32 memberCount = 12;
608 | bool isDepartment = 13;
609 | bool isPublic = 14;
610 | int32 lastMessagePosition = 15;
611 | int32 userCount = 16;
612 | string namePinyin = 17;
613 | int64 createTime = 18;
614 | bool isCustomerService = 19;
615 | Role role = 20;
616 | bool isCustomIcon = 21;
617 | int32 noBadgedNewMessageCount = 22;
618 | bool offEditGroupChatInfo = 23;
619 | Announcement announcement = 24;
620 | string tenantId = 25;
621 | int64 updateTimeMs = 26;
622 | bool isRemind = 27;
623 | bool isDissolved = 30;
624 | bool isMeeting = 31;
625 | string lastVisibleMessageId = 32;
626 | string lastThreadId = 33;
627 | int32 newThreadCount = 34;
628 | int32 lastThreadPosition = 35;
629 | bool isCrypto = 36;
630 | int32 noBadgedNewThreadCount = 37;
631 | int32 threadStartPosition = 38;
632 | ChatMode chatMode = 39;
633 | bool isCrossTenant = 41;
634 | bool isTenant = 42;
635 | SupportView supportView = 43;
636 | int64 joinTimeMs = 44;
637 | int64 oncallId = 45;
638 | int32 lastVisibleMessagePosition = 46;
639 | int32 lastVisibleMessageNoBadgedCount = 47;
640 | int32 readPosition = 48;
641 | int32 readPositionBadgeCount = 49;
642 | int32 lastMessagePositionBadgeCount = 50;
643 | bool enableWatermark = 51;
644 | string sidebarId = 53;
645 | string namePy = 100;
646 | map i18nNames = 101 [deprecated = true];
647 | I18nInf i18nInf = 102;
648 | int32 readThreadPosition = 103;
649 | int32 readThreadPositionBadgeCount = 104;
650 | int32 lastThreadPositionBadgeCount = 105;
651 | int32 lastVisibleThreadPosition = 106;
652 | string lastVisibleThreadId = 107;
653 | bool isPublicV2 = 109;
654 | bool allowPost = 111;
655 | int64 burnedTime = 112;
656 | int32 putChatterApplyCount = 113;
657 | bool showBanner = 114;
658 | bool isLargeGroup = 115;
659 | int32 firstChatMessagePosition = 116;
660 | repeated int32 tags = 117 [packed = false];
661 | map extra = 118;
662 | bool isSamePageMeeting = 119;
663 | int64 myThreadsReadTimestamp = 120;
664 | int64 myThreadsLastTimestamp = 121;
665 |
666 | enum Type {
667 | UNKNOWN = 0;
668 | P2P = 1;
669 | GROUP = 2;
670 | TOPIC_GROUP = 3;
671 | }
672 |
673 | enum Status {
674 | NORMAL = 0;
675 | ARCHIVE = 1;
676 | DELETED = 2;
677 | }
678 |
679 | enum ChatMode {
680 | UNKNOWN_CHAT_MODE = 0;
681 | DEFAULT = 1;
682 | THREAD = 2;
683 | THREAD_V2 = 3;
684 | }
685 |
686 | enum SupportView {
687 | VIEW_UNKNOWN = 0;
688 | VIEW_P2PGROUP = 1;
689 | VIEW_MEETING = 2;
690 | VIEW_THREAD = 3;
691 | VIEW_CRYPTO = 4;
692 | }
693 |
694 | enum Role {
695 | IGNORE = 0;
696 | MEMBER = 1;
697 | VISITOR = 2;
698 | THREAD_FOLLOWER = 3;
699 | }
700 |
701 | message Announcement {
702 | string content = 1;
703 | int64 updateTime = 2;
704 | string lastEditorId = 3;
705 | string docUrl = 4;
706 | bool enableOpendoc = 5;
707 | }
708 |
709 | message I18nInf {
710 | map i18nNames = 1;
711 | }
712 | }
713 |
714 |
715 | message FeedCard {
716 | string id = 1;
717 | Type type = 2;
718 | int64 updateTime = 3;
719 | bool isDelayed = 4;
720 | int64 parentCardId = 5;
721 | int64 rankTime = 6;
722 | FeedType feedType = 7;
723 | string imprId = 8;
724 | int64 updateTimeMs = 9;
725 |
726 | enum Type {
727 | UNKNOWN_TYPE = 0;
728 | CHAT = 1;
729 | MAIL = 2;
730 | DOC = 3;
731 | THREAD = 4;
732 | BOX = 5;
733 | OPENAPP = 6;
734 | TOPIC = 7;
735 | APP_CHAT = 8;
736 | }
737 |
738 | enum FeedType {
739 | TYPE_UNKNOWN = 0;
740 | TYPE_NEWS = 1;
741 | TYPE_SOCIAL = 2;
742 | }
743 | }
--------------------------------------------------------------------------------
/static/proto_pb2.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # Generated by the protocol buffer compiler. DO NOT EDIT!
3 | # source: proto.proto
4 | """Generated protocol buffer code."""
5 | from google.protobuf import descriptor as _descriptor
6 | from google.protobuf import descriptor_pool as _descriptor_pool
7 | from google.protobuf import symbol_database as _symbol_database
8 | from google.protobuf.internal import builder as _builder
9 | # @@protoc_insertion_point(imports)
10 |
11 | _sym_db = _symbol_database.Default()
12 |
13 |
14 |
15 |
16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bproto.proto\"\xa6\x01\n\x05\x46rame\x12\r\n\x05seqid\x18\x01 \x01(\x04\x12\r\n\x05logid\x18\x02 \x01(\x04\x12\x0f\n\x07service\x18\x03 \x01(\x05\x12\x0e\n\x06method\x18\x04 \x01(\x05\x12\x1f\n\x07headers\x18\x05 \x03(\x0b\x32\x0e.ExtendedEntry\x12\x17\n\x0fpayloadEncoding\x18\x06 \x01(\t\x12\x13\n\x0bpayloadType\x18\x07 \x01(\t\x12\x0f\n\x07payload\x18\x08 \x01(\x0c\"\x9d\x02\n\x06Packet\x12\x0b\n\x03sid\x18\x01 \x01(\t\x12!\n\x0bpayloadType\x18\x02 \x01(\x0e\x32\x0c.PayloadType\x12\x0b\n\x03\x63md\x18\x03 \x01(\x05\x12\x0e\n\x06status\x18\x04 \x01(\r\x12\x0f\n\x07payload\x18\x05 \x01(\x0c\x12\x0b\n\x03\x63id\x18\x06 \x01(\t\x12\x1f\n\npipeEntity\x18\x07 \x01(\x0b\x32\x0b.PipeEntity\x12(\n\x0fversionPayloads\x18\x08 \x03(\x0b\x32\x0f.VersionPayload\x12!\n\x0cpipeEntities\x18\t \x03(\x0b\x32\x0b.PipeEntity\x12\x19\n\x11waitRetryInterval\x18\n \x01(\r\x12\x0f\n\x07\x63ommand\x18\x0b \x01(\x05\x12\x0e\n\x06\x63ursor\x18\x0c \x01(\x04\"\x8f\x01\n\x13PushMessagesRequest\x12\x34\n\x08messages\x18\x01 \x03(\x0b\x32\".PushMessagesRequest.MessagesEntry\x1a\x42\n\rMessagesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.entities.Message:\x02\x38\x01\"\xa3\x02\n\x11PutMessageRequest\x12\x13\n\x04type\x18\x01 \x01(\x0e\x32\x05.Type\x12\x19\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x08.Content\x12\x0e\n\x06\x63hatId\x18\x03 \x01(\t\x12\x0e\n\x06rootId\x18\x04 \x01(\t\x12\x10\n\x08parentId\x18\x05 \x01(\t\x12\x0b\n\x03\x63id\x18\x06 \x01(\t\x12\x12\n\nisNotified\x18\x07 \x01(\x08\x12\x12\n\nsendToChat\x18\x08 \x01(\x08\x12\x0f\n\x07version\x18\t \x01(\x05\x12\x1a\n\x12isThreadGroupTopic\x18\n \x01(\x08\x12\x13\n\x0bisAnonymous\x18\x0b \x01(\x08\x12\x1e\n\x16leftStaticResourceKeys\x18\x65 \x03(\t\x12\x15\n\rthriftMessage\x18\x66 \x01(\x0c\"\xc6\x05\n\x0ePutChatRequest\x12\x13\n\x04type\x18\x01 \x01(\x0e\x32\x05.Type\x12\x0f\n\x07userIds\x18\x02 \x03(\t\x12\x11\n\tgroupName\x18\x03 \x01(\t\x12\x11\n\tgroupDesc\x18\x04 \x01(\t\x12\x10\n\x08isPublic\x18\x05 \x01(\x08\x12\x12\n\nchatterIds\x18\x06 \x03(\t\x12\x16\n\x0eorganizationId\x18\x07 \x01(\t\x12\x12\n\nfromChatId\x18\x08 \x01(\t\x12\x16\n\x0einitMessageIds\x18\t \x03(\t\x12\x0f\n\x07iconKey\x18\n \x01(\t\x12/\n\x08\x64ocPerms\x18\x0b \x03(\x0b\x32\x1d.PutChatRequest.DocPermsEntry\x12\x15\n\risCrossTenant\x18\x0c \x01(\x08\x12\x12\n\nisPublicV2\x18\r \x01(\x08\x12\x31\n\tdocPerms2\x18\x0f \x03(\x0b\x32\x1e.PutChatRequest.DocPerms2Entry\x12\x0b\n\x03\x63id\x18\x10 \x01(\t\x1aL\n\rDocPermsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12*\n\x05value\x18\x02 \x01(\x0e\x32\x1b.PutChatRequest.DocPermType:\x02\x38\x01\x1aI\n\x0e\x44ocPerms2Entry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.PutChatRequest.DocPair:\x02\x38\x01\x1a\x87\x01\n\x07\x44ocPair\x12\x31\n\x05perms\x18\x01 \x03(\x0b\x32\".PutChatRequest.DocPair.PermsEntry\x1aI\n\nPermsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12*\n\x05value\x18\x02 \x01(\x0e\x32\x1b.PutChatRequest.DocPermType:\x02\x38\x01\".\n\x0b\x44ocPermType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04READ\x10\x01\x12\x08\n\x04\x45\x44IT\x10\x02\"C\n\x0fPutChatResponse\x12\x13\n\x04\x63hat\x18\x01 \x01(\x0b\x32\x05.Chat\x12\x1b\n\x08\x66\x65\x65\x64\x43\x61rd\x18\x02 \x01(\x0b\x32\t.FeedCard\"D\n\x16UniversalSearchRequest\x12*\n\x06header\x18\x01 \x01(\x0b\x32\x1a.SearchCommonRequestHeader\"\xff\x11\n\x17UniversalSearchResponse\x12\x43\n\x06header\x18\x01 \x01(\x0b\x32\x33.UniversalSearchResponse.SearchCommonResponseHeader\x12\x36\n\x07results\x18\x02 \x03(\x0b\x32%.UniversalSearchResponse.SearchResult\x12?\n\x0b\x65xtraFields\x18\x03 \x01(\x0b\x32*.UniversalSearchResponse.SearchExtraFields\x12\x44\n\x11\x66\x61iledEntityInfos\x18\x05 \x03(\x0b\x32).UniversalSearchResponse.FailedEntityInfo\x1a\xd3\x01\n\x0cSearchResult\x12\n\n\x02id\x18\x01 \x01(\t\x12\x37\n\x04type\x18\x02 \x01(\x0e\x32).UniversalSearchResponse.SearchEntityType\x12\x18\n\x10titleHighlighted\x18\x03 \x01(\t\x12\x1a\n\x12summaryHighlighted\x18\x04 \x01(\t\x12\x19\n\x11\x65xtrasHighlighted\x18\x05 \x01(\t\x12\x11\n\tavatarKey\x18\x06 \x01(\t\x12\x1a\n\x12\x65xtraInfoSeparator\x18\n \x01(\t\x1a\x93\x07\n\x1aSearchCommonResponseHeader\x12\x15\n\rsearchSession\x18\x01 \x01(\t\x12\x14\n\x0csessionSeqId\x18\x02 \x01(\x05\x12\r\n\x05total\x18\x03 \x01(\x05\x12\x0f\n\x07hasMore\x18\x04 \x01(\x08\x12\x17\n\x0fpaginationToken\x18\x05 \x01(\t\x12\x66\n\x14invokeAbnormalNotice\x18\x06 \x01(\x0e\x32H.UniversalSearchResponse.SearchCommonResponseHeader.InvokeAbnormalNotice\x12^\n\x0bstorageInfo\x18\x07 \x01(\x0b\x32I.UniversalSearchResponse.SearchCommonResponseHeader.ColdAndHotStorageInfo\x1a\xd6\x03\n\x15\x43oldAndHotStorageInfo\x12\x16\n\x0eisNeedColdData\x18\x01 \x01(\x08\x12\x10\n\x08timeSize\x18\x02 \x01(\x05\x12\x64\n\x08timeUnit\x18\x03 \x01(\x0e\x32R.UniversalSearchResponse.SearchCommonResponseHeader.ColdAndHotStorageInfo.TimeUnit\x12\x10\n\x08timeText\x18\x04 \x01(\t\x12j\n\x0bhasMoreInfo\x18\x05 \x01(\x0e\x32U.UniversalSearchResponse.SearchCommonResponseHeader.ColdAndHotStorageInfo.HasMoreInfo\"C\n\x08TimeUnit\x12\x0f\n\x0bTimeUNKNOWN\x10\x00\x12\x07\n\x03\x44\x41Y\x10\x01\x12\x08\n\x04WEEK\x10\x02\x12\t\n\x05MONTH\x10\x03\x12\x08\n\x04YEAR\x10\x04\"j\n\x0bHasMoreInfo\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0cHOT_HAS_MORE\x10\x01\x12\x13\n\x0fHOT_HAS_NO_MORE\x10\x02\x12\x11\n\rCOLD_HAS_MORE\x10\x03\x12\x14\n\x10\x43OLD_HAS_NO_MORE\x10\x04\"n\n\x14InvokeAbnormalNotice\x12\x11\n\rINVOKE_NORMAL\x10\x00\x12\x14\n\x10REQUEST_CANCELED\x10\x01\x12\x12\n\x0eVERSION_SWITCH\x10\x02\x12\x19\n\x15QUERY_LENGTH_EXCEEDED\x10\x03\x1a\x36\n\x11SearchExtraFields\x12!\n\x19\x63hatterPermissionResponse\x18\x01 \x01(\x0c\x1a\xec\x03\n\x10\x46\x61iledEntityInfo\x12N\n\nentityType\x18\x01 \x01(\x0e\x32:.UniversalSearchResponse.FailedEntityInfo.SearchEntityType\x12\x1b\n\x13isNeedLocalFallback\x18\x02 \x01(\x08\x12\x1c\n\x14localPaginationToken\x18\x03 \x01(\t\"\xcc\x02\n\x10SearchEntityType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04USER\x10\x01\x12\x07\n\x03\x42OT\x10\x02\x12\x0e\n\nGROUP_CHAT\x10\x03\x12\x13\n\x0f\x43RYPTO_P2P_CHAT\x10\x04\x12\x0b\n\x07MESSAGE\x10\x05\x12\x07\n\x03\x44OC\x10\x07\x12\x08\n\x04WIKI\x10\x08\x12\x07\n\x03\x41PP\x10\t\x12\n\n\x06ONCALL\x10\n\x12\n\n\x06THREAD\x10\x0b\x12\x0b\n\x07QA_CARD\x10\x0c\x12\x07\n\x03URL\x10\r\x12\x0e\n\nDEPARTMENT\x10\x0e\x12\x08\n\x04PANO\x10\x0f\x12\x11\n\rSLASH_COMMAND\x10\x10\x12\x0b\n\x07SECTION\x10\x11\x12\x0c\n\x08RESOURCE\x10\x12\x12\x11\n\rCUSTOMIZATION\x10\x13\x12\x0c\n\x08\x46\x41\x43ILITY\x10\x14\x12\x10\n\x0cMAIL_CONTACT\x10\x15\x12\r\n\tCHAMELEON\x10\x16\x12\x12\n\x0e\x43\x41LENDAR_EVENT\x10\x17\"\xcc\x02\n\x10SearchEntityType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04USER\x10\x01\x12\x07\n\x03\x42OT\x10\x02\x12\x0e\n\nGROUP_CHAT\x10\x03\x12\x13\n\x0f\x43RYPTO_P2P_CHAT\x10\x04\x12\x0b\n\x07MESSAGE\x10\x05\x12\x07\n\x03\x44OC\x10\x07\x12\x08\n\x04WIKI\x10\x08\x12\x07\n\x03\x41PP\x10\t\x12\n\n\x06ONCALL\x10\n\x12\n\n\x06THREAD\x10\x0b\x12\x0b\n\x07QA_CARD\x10\x0c\x12\x07\n\x03URL\x10\r\x12\x0e\n\nDEPARTMENT\x10\x0e\x12\x08\n\x04PANO\x10\x0f\x12\x11\n\rSLASH_COMMAND\x10\x10\x12\x0b\n\x07SECTION\x10\x11\x12\x0c\n\x08RESOURCE\x10\x12\x12\x11\n\rCUSTOMIZATION\x10\x13\x12\x0c\n\x08\x46\x41\x43ILITY\x10\x14\x12\x10\n\x0cMAIL_CONTACT\x10\x15\x12\r\n\tCHAMELEON\x10\x16\x12\x12\n\x0e\x43\x41LENDAR_EVENT\x10\x17\"\xdb\x03\n\x19SearchCommonRequestHeader\x12\x15\n\rsearchSession\x18\x01 \x01(\t\x12\x14\n\x0csessionSeqId\x18\x02 \x01(\x05\x12\r\n\x05query\x18\x03 \x01(\t\x12\x17\n\x0fpaginationToken\x18\x04 \x01(\t\x12\x30\n\rsearchContext\x18\x05 \x01(\x0b\x32\x19.BaseEntity.SearchContext\x12\x0e\n\x06locale\x18\x06 \x01(\t\x12\x14\n\x0cimpressionId\x18\x07 \x01(\t\x12%\n\nextraParam\x18\x08 \x01(\x0b\x32\x11.SearchExtraParam\x12\x36\n\x0btitleLayout\x18\t \x01(\x0b\x32!.SearchCommonRequestHeader.Layout\x12\x38\n\rsummaryLayout\x18\n \x01(\x0b\x32!.SearchCommonRequestHeader.Layout\x12\x10\n\x08pageSize\x18\x0b \x01(\x05\x12?\n\x14sectionSummaryLayout\x18\r \x01(\x0b\x32!.SearchCommonRequestHeader.Layout\x1a%\n\x06Layout\x12\x0c\n\x04line\x18\x01 \x01(\x05\x12\r\n\x05width\x18\x02 \x01(\x05\"M\n\x10SearchExtraParam\x12 \n\x18\x63hatterPermissionRequest\x18\x01 \x01(\x0c\x12\x17\n\x0fqueryInputState\x18\x02 \x01(\x05\"\x88\x01\n\nBaseEntity\x1az\n\rSearchContext\x12\x0f\n\x07tagName\x18\x01 \x01(\t\x12 \n\x0b\x65ntityItems\x18\x02 \x03(\x0b\x32\x0b.EntityItem\x12#\n\x0c\x63ommonFilter\x18\x03 \x01(\x0b\x32\r.CommonFilter\x12\x11\n\tsourceKey\x18\x05 \x01(\t\":\n\x0c\x43ommonFilter\x12\x1a\n\x12includeOuterTenant\x18\x01 \x01(\x08\x12\x0e\n\x06\x63hatId\x18\x02 \x01(\t\"\xe8\x01\n\nUserFilter\x12\x12\n\nisResigned\x18\x01 \x01(\x08\x12\x13\n\x0bhaveChatter\x18\x02 \x01(\x08\x12\x33\n\x0c\x63ustomFields\x18\x03 \x03(\x0b\x32\x1d.UserFilter.CustomFieldsEntry\x12\x0f\n\x07\x65xclude\x18\x04 \x01(\x08\x1a\x1d\n\x0b\x46ieldValues\x12\x0e\n\x06values\x18\x01 \x03(\t\x1aL\n\x11\x43ustomFieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.UserFilter.FieldValues:\x02\x38\x01\"\x90\x01\n\x0fGroupChatFilter\x12 \n\x0bsearchTypes\x18\x01 \x03(\x0e\x32\x0b.SearchType\x12\x15\n\rchatMemberIds\x18\x02 \x03(\t\x12\x17\n\x0f\x65xcludedChatIds\x18\x03 \x03(\t\x12\x14\n\x0csearchCrypto\x18\x04 \x01(\x08\x12\x15\n\raddableAsUser\x18\x05 \x01(\x08\"\xcf\x04\n\nEntityItem\x12*\n\x04type\x18\x01 \x01(\x0e\x32\x1c.EntityItem.SearchEntityType\x12(\n\x06\x66ilter\x18\x02 \x01(\x0b\x32\x18.EntityItem.EntityFilter\x12\x14\n\x0c\x62oostChatIds\x18\x04 \x03(\t\x12\x1c\n\x14localPaginationToken\x18\x05 \x01(\t\x1ah\n\x0c\x45ntityFilter\x12!\n\nuserFilter\x18\x01 \x01(\x0b\x32\x0b.UserFilterH\x00\x12+\n\x0fgroupChatFilter\x18\x02 \x01(\x0b\x32\x10.GroupChatFilterH\x00\x42\x08\n\x06\x66ilter\"\xcc\x02\n\x10SearchEntityType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04USER\x10\x01\x12\x07\n\x03\x42OT\x10\x02\x12\x0e\n\nGROUP_CHAT\x10\x03\x12\x13\n\x0f\x43RYPTO_P2P_CHAT\x10\x04\x12\x0b\n\x07MESSAGE\x10\x05\x12\x07\n\x03\x44OC\x10\x07\x12\x08\n\x04WIKI\x10\x08\x12\x07\n\x03\x41PP\x10\t\x12\n\n\x06ONCALL\x10\n\x12\n\n\x06THREAD\x10\x0b\x12\x0b\n\x07QA_CARD\x10\x0c\x12\x07\n\x03URL\x10\r\x12\x0e\n\nDEPARTMENT\x10\x0e\x12\x08\n\x04PANO\x10\x0f\x12\x11\n\rSLASH_COMMAND\x10\x10\x12\x0b\n\x07SECTION\x10\x11\x12\x0c\n\x08RESOURCE\x10\x12\x12\x11\n\rCUSTOMIZATION\x10\x13\x12\x0c\n\x08\x46\x41\x43ILITY\x10\x14\x12\x10\n\x0cMAIL_CONTACT\x10\x15\x12\r\n\tCHAMELEON\x10\x16\x12\x12\n\x0e\x43\x41LENDAR_EVENT\x10\x17\"\xa4\x04\n\x07\x43ontent\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x10\n\x08imageKey\x18\x02 \x01(\t\x12\x16\n\x0eisOriginSource\x18\x1f \x01(\x08\x12\r\n\x05title\x18\x03 \x01(\t\x12\x13\n\x0b\x61ttachments\x18\x04 \x03(\t\x12\x12\n\nisNotified\x18\x05 \x01(\x08\x12\x10\n\x08\x61udioKey\x18\x07 \x01(\t\x12\x15\n\raudioDuration\x18\x08 \x01(\x05\x12\x0e\n\x06\x63hatId\x18\t \x01(\t\x12\x13\n\x0b\x63ryptoToken\x18\n \x01(\t\x12\x0f\n\x07\x66ileKey\x18\x06 \x01(\t\x12\x10\n\x08\x66ileName\x18\x0b \x01(\t\x12\x10\n\x08\x66ileMime\x18\x0c \x01(\t\x12\x10\n\x08\x66ileSize\x18\r \x01(\x03\x12-\n\rfileTransMode\x18\x1c \x01(\x0e\x32\x16.Content.FileTransMode\x12\x16\n\x0esenderDeviceId\x18\x1d \x01(\t\x12\x1b\n\x08richText\x18\x0e \x01(\x0b\x32\t.RichText\x12\x10\n\x08\x64uration\x18\x0f \x01(\x05\x12\x16\n\x0e\x61ttendeesCount\x18\x11 \x01(\x05\x12\x1b\n\x13isGroupAnnouncement\x18\x12 \x01(\x08\x12\x14\n\x0cstickerSetId\x18\x18 \x01(\t\x12\x11\n\tstickerId\x18\x19 \x01(\t\x12\x13\n\x0bshareUserId\x18\x1b \x01(\t\"+\n\rFileTransMode\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tLAN_TRANS\x10\x01\"\xe2\x0e\n\x08\x65ntities\x1a\xf5\x0b\n\x07Message\x12\n\n\x02id\x18\x01 \x01(\t\x12$\n\x04type\x18\x02 \x01(\x0e\x32\x16.entities.Message.Type\x12\x0e\n\x06\x66romId\x18\x03 \x01(\t\x12\x12\n\ncreateTime\x18\x04 \x01(\x03\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\x0c\x12 \n\x06status\x18\x06 \x01(\x0e\x32\x10.entities.Status\x12$\n\x08\x66romType\x18\x07 \x01(\x0e\x32\x12.entities.FromType\x12\x0e\n\x06rootId\x18\x08 \x01(\t\x12\x10\n\x08parentId\x18\t \x01(\t\x12\x0e\n\x06\x63hatId\x18\n \x01(\t\x12\x16\n\x0elastModifyTime\x18\x0b \x01(\x03\x12\x0b\n\x03\x63id\x18\x0c \x01(\t\x12\x10\n\x08position\x18\r \x01(\x05\x12\x12\n\nupdateTime\x18\x0e \x01(\x03\x12\x12\n\nisNotified\x18\x0f \x01(\x08\x12\x12\n\nreplyCount\x18\x10 \x01(\t\x12\x1d\n\x15parentSourceMessageId\x18\x11 \x01(\t\x12\x1b\n\x13rootSourceMessageId\x18\x12 \x01(\t\x12\x0e\n\x06isDing\x18\x13 \x01(\x08\x12\x10\n\x08threadId\x18\x14 \x01(\t\x12\x12\n\nsendToChat\x18\x15 \x01(\x08\x12\x13\n\x0bisTruncated\x18\x16 \x01(\x08\x12\x11\n\tisRemoved\x18\x17 \x01(\x08\x12\x11\n\tchannelId\x18\x18 \x01(\t\x12\x16\n\x0ethreadPosition\x18\x1c \x01(\x05\x12\x11\n\tremoverId\x18\x1d \x01(\x03\x12\x19\n\x11translateLanguage\x18\x1e \x01(\t\x12*\n\x0bremoverType\x18\x1f \x01(\x0e\x32\x15.entities.RemoverType\x12\x15\n\rnoBadgedCount\x18! \x01(\x05\x12\x10\n\x08isBadged\x18\" \x01(\x08\x12\x12\n\nbadgeCount\x18# \x01(\x05\x12\x18\n\x10threadBadgeCount\x18$ \x01(\x05\x12\x18\n\x10threadReplyCount\x18% \x01(\x05\x12\x17\n\x0f\x61tOutChatterIds\x18& \x03(\t\x12\x17\n\x0fmessageLanguage\x18\' \x01(\t\x12\x18\n\x10isNoTraceRemoved\x18) \x01(\x08\x12\"\n\x1aisAutoTranslatedByReceiver\x18* \x01(\x08\x12\x31\n\x0bsensitivity\x18+ \x01(\x0e\x32\x1c.entities.MessageSensitivity\x12\x13\n\x0bisVisibleV2\x18, \x01(\x08\x12$\n\x08\x63hatType\x18. \x01(\x0e\x32\x12.entities.ChatType\x12\x18\n\x10originalSenderId\x18/ \x01(\t\x12&\n\x1eisStaticResourceMessageDeleted\x18\x30 \x01(\x08\x12\x1a\n\x12messagePipeVersion\x18\x34 \x01(\x03\x12\x1b\n\x13isBatchCopyMessages\x18\x35 \x01(\x08\x12\x16\n\x0eisSpecialFocus\x18\x38 \x01(\x08\x12\x17\n\x0fisIncludeDocUrl\x18: \x01(\x08\x12\x10\n\x08\x63ipherId\x18; \x01(\x03\"\xe9\x02\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04POST\x10\x02\x12\x08\n\x04\x46ILE\x10\x03\x12\x08\n\x04TEXT\x10\x04\x12\t\n\x05IMAGE\x10\x05\x12\n\n\x06SYSTEM\x10\x06\x12\t\n\x05\x41UDIO\x10\x07\x12\t\n\x05\x45MAIL\x10\x08\x12\x14\n\x10SHARE_GROUP_CHAT\x10\t\x12\x0b\n\x07STICKER\x10\n\x12\x11\n\rMERGE_FORWARD\x10\x0b\x12\x0c\n\x08\x43\x41LENDAR\x10\x0c\x12\x0e\n\nCLOUD_FILE\x10\r\x12\x08\n\x04\x43\x41RD\x10\x0e\x12\t\n\x05MEDIA\x10\x0f\x12\x18\n\x14SHARE_CALENDAR_EVENT\x10\x10\x12\x0b\n\x07HONGBAO\x10\x11\x12\x14\n\x10GENERAL_CALENDAR\x10\x12\x12\x0e\n\nVIDEO_CHAT\x10\x13\x12\x0c\n\x08LOCATION\x10\x14\x12\x1a\n\x16\x43OMMERCIALIZED_HONGBAO\x10\x16\x12\x13\n\x0fSHARE_USER_CARD\x10\x17\x12\x08\n\x04TODO\x10\x18\x12\n\n\x06\x46OLDER\x10\x19\"3\n\x08\x46romType\x12\x14\n\x10UNKNOWN_FROMTYPE\x10\x00\x12\x08\n\x04USER\x10\x01\x12\x07\n\x03\x42OT\x10\x02\"C\n\x06Status\x12\x12\n\x0eUNKNOWN_STATUS\x10\x00\x12\n\n\x06NORMAL\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\x12\x0c\n\x08MODIFIED\x10\x03\"T\n\x0bRemoverType\x12\x17\n\x13UNKNOWN_REMOVERTYPE\x10\x00\x12\x0e\n\nGROUPOWNER\x10\x01\x12\x0c\n\x08SYSADMIN\x10\x02\x12\x0e\n\nGROUPADMIN\x10\x03\"F\n\x12MessageSensitivity\x12\x17\n\x13UNKNOWN_SENSITIVITY\x10\x00\x12\x08\n\x04SAFE\x10\x01\x12\r\n\tDANGEROUS\x10\x02\"F\n\x08\x43hatType\x12\x15\n\x11UNKNOWN_CHAT_TYPE\x10\x00\x12\x07\n\x03P2P\x10\x01\x12\t\n\x05GROUP\x10\x02\x12\x0f\n\x0bTOPIC_GROUP\x10\x03\"8\n\x0bTextContent\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x1b\n\x08richText\x18\x03 \x01(\x0b\x32\t.RichText\"\xfb\x01\n\x08RichText\x12\x12\n\nelementIds\x18\x01 \x03(\t\x12\x11\n\tinnerText\x18\x02 \x01(\t\x12#\n\x08\x65lements\x18\x03 \x01(\x0b\x32\x11.RichTextElements\x12\x10\n\x08imageIds\x18\x05 \x03(\t\x12\r\n\x05\x61tIds\x18\x06 \x03(\t\x12\x11\n\tanchorIds\x18\x07 \x03(\t\x12\x0f\n\x07i18nIds\x18\x08 \x03(\t\x12\x10\n\x08mediaIds\x18\t \x03(\t\x12\x0f\n\x07\x64ocsIds\x18\n \x03(\t\x12\x16\n\x0einteractiveIds\x18\x0b \x03(\t\x12\x12\n\nmentionIds\x18\x0c \x03(\t\x12\x0f\n\x07version\x18\r \x01(\x05\"\xb2\x03\n\x10RichTextElements\x12\x35\n\ndictionary\x18\x01 \x03(\x0b\x32!.RichTextElements.DictionaryEntry\x12\x33\n\tstyleRefs\x18\x02 \x03(\x0b\x32 .RichTextElements.StyleRefsEntry\x12/\n\x06styles\x18\x03 \x03(\x0b\x32\x1f.RichTextElements.RichTextStyle\x1a\x43\n\x0f\x44ictionaryEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.RichTextElement:\x02\x38\x01\x1a\\\n\x0eStyleRefsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.RichTextElements.RichTextElementStyleRefs:\x02\x38\x01\x1a,\n\rRichTextStyle\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x1a\x30\n\x18RichTextElementStyleRefs\x12\x14\n\x08styleIds\x18\x01 \x03(\x05\x42\x02\x10\x00\"\xfc\x04\n\x0fRichTextElement\x12!\n\x03tag\x18\x01 \x01(\x0e\x32\x14.RichTextElement.Tag\x12*\n\x05style\x18\x02 \x03(\x0b\x32\x1b.RichTextElement.StyleEntry\x12\x10\n\x08property\x18\x03 \x01(\x0c\x12\x10\n\x08\x63hildIds\x18\x04 \x03(\t\x12\x11\n\tstyleKeys\x18\x05 \x03(\t\x1a,\n\nStyleEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb4\x03\n\x03Tag\x12\x0f\n\x0bUNKNOWN_TAG\x10\x00\x12\x08\n\x04TEXT\x10\x01\x12\x07\n\x03IMG\x10\x02\x12\x05\n\x01P\x10\x03\x12\n\n\x06\x46IGURE\x10\x04\x12\x06\n\x02\x41T\x10\x05\x12\x05\n\x01\x41\x10\x06\x12\x05\n\x01\x42\x10\x07\x12\x05\n\x01I\x10\x08\x12\x05\n\x01U\x10\t\x12\x0b\n\x07\x45MOTION\x10\n\x12\n\n\x06\x42UTTON\x10\x0b\x12\n\n\x06SELECT\x10\x0c\x12\x1a\n\x16PROGRESS_SELECT_OPTION\x10\r\x12\x07\n\x03\x44IV\x10\x0e\x12\x11\n\rTEXTABLE_AREA\x10\x0f\x12\x08\n\x04TIME\x10\x10\x12\x08\n\x04LINK\x10\x11\x12\t\n\x05MEDIA\x10\x12\x12\x0e\n\nSELECTMENU\x10\x13\x12\x10\n\x0cOVERFLOWMENU\x10\x14\x12\x0e\n\nDATEPICKER\x10\x15\x12\x08\n\x04\x44OCS\x10\x16\x12\x06\n\x02H1\x10\x17\x12\x06\n\x02H2\x10\x18\x12\x06\n\x02H3\x10\x19\x12\x06\n\x02UL\x10\x1a\x12\x06\n\x02OL\x10\x1b\x12\x06\n\x02LI\x10\x1c\x12\t\n\x05QUOTE\x10\x1d\x12\x08\n\x04\x43ODE\x10\x1e\x12\x0e\n\nCODE_BLOCK\x10\x1f\x12\x06\n\x02HR\x10 \x12\x0e\n\nTIMEPICKER\x10!\x12\x12\n\x0e\x44\x41TETIMEPICKER\x10\"\x12\x0c\n\x08REACTION\x10#\x12\x0b\n\x07MENTION\x10$\"G\n\x0cTextProperty\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x0f\n\x07i18nKey\x18\x02 \x01(\t\x12\x15\n\rnumberOfLines\x18\x03 \x01(\x05\"+\n\rExtendedEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"&\n\nPipeEntity\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\x03\"F\n\x0eVersionPayload\x12#\n\x0cversionRange\x18\x01 \x01(\x0b\x32\r.VersionRange\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"*\n\x0cVersionRange\x12\r\n\x05start\x18\x01 \x01(\t\x12\x0b\n\x03\x65nd\x18\x02 \x01(\t\"\xf7\x12\n\x04\x43hat\x12\n\n\x02id\x18\x01 \x01(\t\x12\x18\n\x04type\x18\x02 \x01(\x0e\x32\n.Chat.Type\x12\x15\n\rlastMessageId\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07ownerId\x18\x06 \x01(\t\x12\x17\n\x0fnewMessageCount\x18\x07 \x01(\x05\x12\x1c\n\x06status\x18\x08 \x01(\x0e\x32\x0c.Chat.Status\x12\x12\n\nupdateTime\x18\t \x01(\x03\x12\x0b\n\x03key\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x0b \x01(\t\x12\x13\n\x0bmemberCount\x18\x0c \x01(\x05\x12\x14\n\x0cisDepartment\x18\r \x01(\x08\x12\x10\n\x08isPublic\x18\x0e \x01(\x08\x12\x1b\n\x13lastMessagePosition\x18\x0f \x01(\x05\x12\x11\n\tuserCount\x18\x10 \x01(\x05\x12\x12\n\nnamePinyin\x18\x11 \x01(\t\x12\x12\n\ncreateTime\x18\x12 \x01(\x03\x12\x19\n\x11isCustomerService\x18\x13 \x01(\x08\x12\x18\n\x04role\x18\x14 \x01(\x0e\x32\n.Chat.Role\x12\x14\n\x0cisCustomIcon\x18\x15 \x01(\x08\x12\x1f\n\x17noBadgedNewMessageCount\x18\x16 \x01(\x05\x12\x1c\n\x14offEditGroupChatInfo\x18\x17 \x01(\x08\x12(\n\x0c\x61nnouncement\x18\x18 \x01(\x0b\x32\x12.Chat.Announcement\x12\x10\n\x08tenantId\x18\x19 \x01(\t\x12\x14\n\x0cupdateTimeMs\x18\x1a \x01(\x03\x12\x10\n\x08isRemind\x18\x1b \x01(\x08\x12\x13\n\x0bisDissolved\x18\x1e \x01(\x08\x12\x11\n\tisMeeting\x18\x1f \x01(\x08\x12\x1c\n\x14lastVisibleMessageId\x18 \x01(\t\x12\x14\n\x0clastThreadId\x18! \x01(\t\x12\x16\n\x0enewThreadCount\x18\" \x01(\x05\x12\x1a\n\x12lastThreadPosition\x18# \x01(\x05\x12\x10\n\x08isCrypto\x18$ \x01(\x08\x12\x1e\n\x16noBadgedNewThreadCount\x18% \x01(\x05\x12\x1b\n\x13threadStartPosition\x18& \x01(\x05\x12 \n\x08\x63hatMode\x18\' \x01(\x0e\x32\x0e.Chat.ChatMode\x12\x15\n\risCrossTenant\x18) \x01(\x08\x12\x10\n\x08isTenant\x18* \x01(\x08\x12&\n\x0bsupportView\x18+ \x01(\x0e\x32\x11.Chat.SupportView\x12\x12\n\njoinTimeMs\x18, \x01(\x03\x12\x10\n\x08oncallId\x18- \x01(\x03\x12\"\n\x1alastVisibleMessagePosition\x18. \x01(\x05\x12\'\n\x1flastVisibleMessageNoBadgedCount\x18/ \x01(\x05\x12\x14\n\x0creadPosition\x18\x30 \x01(\x05\x12\x1e\n\x16readPositionBadgeCount\x18\x31 \x01(\x05\x12%\n\x1dlastMessagePositionBadgeCount\x18\x32 \x01(\x05\x12\x17\n\x0f\x65nableWatermark\x18\x33 \x01(\x08\x12\x11\n\tsidebarId\x18\x35 \x01(\t\x12\x0e\n\x06namePy\x18\x64 \x01(\t\x12+\n\ti18nNames\x18\x65 \x03(\x0b\x32\x14.Chat.I18nNamesEntryB\x02\x18\x01\x12\x1e\n\x07i18nInf\x18\x66 \x01(\x0b\x32\r.Chat.I18nInf\x12\x1a\n\x12readThreadPosition\x18g \x01(\x05\x12$\n\x1creadThreadPositionBadgeCount\x18h \x01(\x05\x12$\n\x1clastThreadPositionBadgeCount\x18i \x01(\x05\x12!\n\x19lastVisibleThreadPosition\x18j \x01(\x05\x12\x1b\n\x13lastVisibleThreadId\x18k \x01(\t\x12\x12\n\nisPublicV2\x18m \x01(\x08\x12\x11\n\tallowPost\x18o \x01(\x08\x12\x12\n\nburnedTime\x18p \x01(\x03\x12\x1c\n\x14putChatterApplyCount\x18q \x01(\x05\x12\x12\n\nshowBanner\x18r \x01(\x08\x12\x14\n\x0cisLargeGroup\x18s \x01(\x08\x12 \n\x18\x66irstChatMessagePosition\x18t \x01(\x05\x12\x10\n\x04tags\x18u \x03(\x05\x42\x02\x10\x00\x12\x1f\n\x05\x65xtra\x18v \x03(\x0b\x32\x10.Chat.ExtraEntry\x12\x19\n\x11isSamePageMeeting\x18w \x01(\x08\x12\x1e\n\x16myThreadsReadTimestamp\x18x \x01(\x03\x12\x1e\n\x16myThreadsLastTimestamp\x18y \x01(\x03\x1a\x30\n\x0eI18nNamesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1ap\n\x0c\x41nnouncement\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x12\n\nupdateTime\x18\x02 \x01(\x03\x12\x14\n\x0clastEditorId\x18\x03 \x01(\t\x12\x0e\n\x06\x64ocUrl\x18\x04 \x01(\t\x12\x15\n\renableOpendoc\x18\x05 \x01(\x08\x1al\n\x07I18nInf\x12/\n\ti18nNames\x18\x01 \x03(\x0b\x32\x1c.Chat.I18nInf.I18nNamesEntry\x1a\x30\n\x0eI18nNamesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03P2P\x10\x01\x12\t\n\x05GROUP\x10\x02\x12\x0f\n\x0bTOPIC_GROUP\x10\x03\".\n\x06Status\x12\n\n\x06NORMAL\x10\x00\x12\x0b\n\x07\x41RCHIVE\x10\x01\x12\x0b\n\x07\x44\x45LETED\x10\x02\"I\n\x08\x43hatMode\x12\x15\n\x11UNKNOWN_CHAT_MODE\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\n\n\x06THREAD\x10\x02\x12\r\n\tTHREAD_V2\x10\x03\"f\n\x0bSupportView\x12\x10\n\x0cVIEW_UNKNOWN\x10\x00\x12\x11\n\rVIEW_P2PGROUP\x10\x01\x12\x10\n\x0cVIEW_MEETING\x10\x02\x12\x0f\n\x0bVIEW_THREAD\x10\x03\x12\x0f\n\x0bVIEW_CRYPTO\x10\x04\"@\n\x04Role\x12\n\n\x06IGNORE\x10\x00\x12\n\n\x06MEMBER\x10\x01\x12\x0b\n\x07VISITOR\x10\x02\x12\x13\n\x0fTHREAD_FOLLOWER\x10\x03\"\xff\x02\n\x08\x46\x65\x65\x64\x43\x61rd\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x04type\x18\x02 \x01(\x0e\x32\x0e.FeedCard.Type\x12\x12\n\nupdateTime\x18\x03 \x01(\x03\x12\x11\n\tisDelayed\x18\x04 \x01(\x08\x12\x14\n\x0cparentCardId\x18\x05 \x01(\x03\x12\x10\n\x08rankTime\x18\x06 \x01(\x03\x12$\n\x08\x66\x65\x65\x64Type\x18\x07 \x01(\x0e\x32\x12.FeedCard.FeedType\x12\x0e\n\x06imprId\x18\x08 \x01(\t\x12\x14\n\x0cupdateTimeMs\x18\t \x01(\x03\"p\n\x04Type\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\x08\n\x04\x43HAT\x10\x01\x12\x08\n\x04MAIL\x10\x02\x12\x07\n\x03\x44OC\x10\x03\x12\n\n\x06THREAD\x10\x04\x12\x07\n\x03\x42OX\x10\x05\x12\x0b\n\x07OPENAPP\x10\x06\x12\t\n\x05TOPIC\x10\x07\x12\x0c\n\x08\x41PP_CHAT\x10\x08\"<\n\x08\x46\x65\x65\x64Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\r\n\tTYPE_NEWS\x10\x01\x12\x0f\n\x0bTYPE_SOCIAL\x10\x02*H\n\nSearchType\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x11\n\rSEARCH_TYPE_1\x10\x01\x12\x11\n\rSEARCH_TYPE_2\x10\x02*2\n\x0bPayloadType\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x07\n\x03PB2\x10\x01\x12\x08\n\x04JSON\x10\x02*\xe9\x02\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04POST\x10\x02\x12\x08\n\x04\x46ILE\x10\x03\x12\x08\n\x04TEXT\x10\x04\x12\t\n\x05IMAGE\x10\x05\x12\n\n\x06SYSTEM\x10\x06\x12\t\n\x05\x41UDIO\x10\x07\x12\t\n\x05\x45MAIL\x10\x08\x12\x14\n\x10SHARE_GROUP_CHAT\x10\t\x12\x0b\n\x07STICKER\x10\n\x12\x11\n\rMERGE_FORWARD\x10\x0b\x12\x0c\n\x08\x43\x41LENDAR\x10\x0c\x12\x0e\n\nCLOUD_FILE\x10\r\x12\x08\n\x04\x43\x41RD\x10\x0e\x12\t\n\x05MEDIA\x10\x0f\x12\x18\n\x14SHARE_CALENDAR_EVENT\x10\x10\x12\x0b\n\x07HONGBAO\x10\x11\x12\x14\n\x10GENERAL_CALENDAR\x10\x12\x12\x0e\n\nVIDEO_CHAT\x10\x13\x12\x0c\n\x08LOCATION\x10\x14\x12\x1a\n\x16\x43OMMERCIALIZED_HONGBAO\x10\x16\x12\x13\n\x0fSHARE_USER_CARD\x10\x17\x12\x08\n\x04TODO\x10\x18\x12\n\n\x06\x46OLDER\x10\x19\x62\x06proto3')
17 |
18 | _globals = globals()
19 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
20 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'proto_pb2', _globals)
21 | if _descriptor._USE_C_DESCRIPTORS == False:
22 |
23 | DESCRIPTOR._options = None
24 | _PUSHMESSAGESREQUEST_MESSAGESENTRY._options = None
25 | _PUSHMESSAGESREQUEST_MESSAGESENTRY._serialized_options = b'8\001'
26 | _PUTCHATREQUEST_DOCPERMSENTRY._options = None
27 | _PUTCHATREQUEST_DOCPERMSENTRY._serialized_options = b'8\001'
28 | _PUTCHATREQUEST_DOCPERMS2ENTRY._options = None
29 | _PUTCHATREQUEST_DOCPERMS2ENTRY._serialized_options = b'8\001'
30 | _PUTCHATREQUEST_DOCPAIR_PERMSENTRY._options = None
31 | _PUTCHATREQUEST_DOCPAIR_PERMSENTRY._serialized_options = b'8\001'
32 | _USERFILTER_CUSTOMFIELDSENTRY._options = None
33 | _USERFILTER_CUSTOMFIELDSENTRY._serialized_options = b'8\001'
34 | _RICHTEXTELEMENTS_DICTIONARYENTRY._options = None
35 | _RICHTEXTELEMENTS_DICTIONARYENTRY._serialized_options = b'8\001'
36 | _RICHTEXTELEMENTS_STYLEREFSENTRY._options = None
37 | _RICHTEXTELEMENTS_STYLEREFSENTRY._serialized_options = b'8\001'
38 | _RICHTEXTELEMENTS_RICHTEXTELEMENTSTYLEREFS.fields_by_name['styleIds']._options = None
39 | _RICHTEXTELEMENTS_RICHTEXTELEMENTSTYLEREFS.fields_by_name['styleIds']._serialized_options = b'\020\000'
40 | _RICHTEXTELEMENT_STYLEENTRY._options = None
41 | _RICHTEXTELEMENT_STYLEENTRY._serialized_options = b'8\001'
42 | _CHAT_I18NNAMESENTRY._options = None
43 | _CHAT_I18NNAMESENTRY._serialized_options = b'8\001'
44 | _CHAT_EXTRAENTRY._options = None
45 | _CHAT_EXTRAENTRY._serialized_options = b'8\001'
46 | _CHAT_I18NINF_I18NNAMESENTRY._options = None
47 | _CHAT_I18NINF_I18NNAMESENTRY._serialized_options = b'8\001'
48 | _CHAT.fields_by_name['i18nNames']._options = None
49 | _CHAT.fields_by_name['i18nNames']._serialized_options = b'\030\001'
50 | _CHAT.fields_by_name['tags']._options = None
51 | _CHAT.fields_by_name['tags']._serialized_options = b'\020\000'
52 | _globals['_SEARCHTYPE']._serialized_start=12720
53 | _globals['_SEARCHTYPE']._serialized_end=12792
54 | _globals['_PAYLOADTYPE']._serialized_start=12794
55 | _globals['_PAYLOADTYPE']._serialized_end=12844
56 | _globals['_TYPE']._serialized_start=7531
57 | _globals['_TYPE']._serialized_end=7892
58 | _globals['_FRAME']._serialized_start=16
59 | _globals['_FRAME']._serialized_end=182
60 | _globals['_PACKET']._serialized_start=185
61 | _globals['_PACKET']._serialized_end=470
62 | _globals['_PUSHMESSAGESREQUEST']._serialized_start=473
63 | _globals['_PUSHMESSAGESREQUEST']._serialized_end=616
64 | _globals['_PUSHMESSAGESREQUEST_MESSAGESENTRY']._serialized_start=550
65 | _globals['_PUSHMESSAGESREQUEST_MESSAGESENTRY']._serialized_end=616
66 | _globals['_PUTMESSAGEREQUEST']._serialized_start=619
67 | _globals['_PUTMESSAGEREQUEST']._serialized_end=910
68 | _globals['_PUTCHATREQUEST']._serialized_start=913
69 | _globals['_PUTCHATREQUEST']._serialized_end=1623
70 | _globals['_PUTCHATREQUEST_DOCPERMSENTRY']._serialized_start=1286
71 | _globals['_PUTCHATREQUEST_DOCPERMSENTRY']._serialized_end=1362
72 | _globals['_PUTCHATREQUEST_DOCPERMS2ENTRY']._serialized_start=1364
73 | _globals['_PUTCHATREQUEST_DOCPERMS2ENTRY']._serialized_end=1437
74 | _globals['_PUTCHATREQUEST_DOCPAIR']._serialized_start=1440
75 | _globals['_PUTCHATREQUEST_DOCPAIR']._serialized_end=1575
76 | _globals['_PUTCHATREQUEST_DOCPAIR_PERMSENTRY']._serialized_start=1502
77 | _globals['_PUTCHATREQUEST_DOCPAIR_PERMSENTRY']._serialized_end=1575
78 | _globals['_PUTCHATREQUEST_DOCPERMTYPE']._serialized_start=1577
79 | _globals['_PUTCHATREQUEST_DOCPERMTYPE']._serialized_end=1623
80 | _globals['_PUTCHATRESPONSE']._serialized_start=1625
81 | _globals['_PUTCHATRESPONSE']._serialized_end=1692
82 | _globals['_UNIVERSALSEARCHREQUEST']._serialized_start=1694
83 | _globals['_UNIVERSALSEARCHREQUEST']._serialized_end=1762
84 | _globals['_UNIVERSALSEARCHRESPONSE']._serialized_start=1765
85 | _globals['_UNIVERSALSEARCHRESPONSE']._serialized_end=4068
86 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHRESULT']._serialized_start=2053
87 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHRESULT']._serialized_end=2264
88 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER']._serialized_start=2267
89 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER']._serialized_end=3182
90 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO']._serialized_start=2600
91 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO']._serialized_end=3070
92 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO_TIMEUNIT']._serialized_start=2895
93 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO_TIMEUNIT']._serialized_end=2962
94 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO_HASMOREINFO']._serialized_start=2964
95 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_COLDANDHOTSTORAGEINFO_HASMOREINFO']._serialized_end=3070
96 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_INVOKEABNORMALNOTICE']._serialized_start=3072
97 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHCOMMONRESPONSEHEADER_INVOKEABNORMALNOTICE']._serialized_end=3182
98 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHEXTRAFIELDS']._serialized_start=3184
99 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHEXTRAFIELDS']._serialized_end=3238
100 | _globals['_UNIVERSALSEARCHRESPONSE_FAILEDENTITYINFO']._serialized_start=3241
101 | _globals['_UNIVERSALSEARCHRESPONSE_FAILEDENTITYINFO']._serialized_end=3733
102 | _globals['_UNIVERSALSEARCHRESPONSE_FAILEDENTITYINFO_SEARCHENTITYTYPE']._serialized_start=3401
103 | _globals['_UNIVERSALSEARCHRESPONSE_FAILEDENTITYINFO_SEARCHENTITYTYPE']._serialized_end=3733
104 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHENTITYTYPE']._serialized_start=3401
105 | _globals['_UNIVERSALSEARCHRESPONSE_SEARCHENTITYTYPE']._serialized_end=3733
106 | _globals['_SEARCHCOMMONREQUESTHEADER']._serialized_start=4071
107 | _globals['_SEARCHCOMMONREQUESTHEADER']._serialized_end=4546
108 | _globals['_SEARCHCOMMONREQUESTHEADER_LAYOUT']._serialized_start=4509
109 | _globals['_SEARCHCOMMONREQUESTHEADER_LAYOUT']._serialized_end=4546
110 | _globals['_SEARCHEXTRAPARAM']._serialized_start=4548
111 | _globals['_SEARCHEXTRAPARAM']._serialized_end=4625
112 | _globals['_BASEENTITY']._serialized_start=4628
113 | _globals['_BASEENTITY']._serialized_end=4764
114 | _globals['_BASEENTITY_SEARCHCONTEXT']._serialized_start=4642
115 | _globals['_BASEENTITY_SEARCHCONTEXT']._serialized_end=4764
116 | _globals['_COMMONFILTER']._serialized_start=4766
117 | _globals['_COMMONFILTER']._serialized_end=4824
118 | _globals['_USERFILTER']._serialized_start=4827
119 | _globals['_USERFILTER']._serialized_end=5059
120 | _globals['_USERFILTER_FIELDVALUES']._serialized_start=4952
121 | _globals['_USERFILTER_FIELDVALUES']._serialized_end=4981
122 | _globals['_USERFILTER_CUSTOMFIELDSENTRY']._serialized_start=4983
123 | _globals['_USERFILTER_CUSTOMFIELDSENTRY']._serialized_end=5059
124 | _globals['_GROUPCHATFILTER']._serialized_start=5062
125 | _globals['_GROUPCHATFILTER']._serialized_end=5206
126 | _globals['_ENTITYITEM']._serialized_start=5209
127 | _globals['_ENTITYITEM']._serialized_end=5800
128 | _globals['_ENTITYITEM_ENTITYFILTER']._serialized_start=5361
129 | _globals['_ENTITYITEM_ENTITYFILTER']._serialized_end=5465
130 | _globals['_ENTITYITEM_SEARCHENTITYTYPE']._serialized_start=3401
131 | _globals['_ENTITYITEM_SEARCHENTITYTYPE']._serialized_end=3733
132 | _globals['_CONTENT']._serialized_start=5803
133 | _globals['_CONTENT']._serialized_end=6351
134 | _globals['_CONTENT_FILETRANSMODE']._serialized_start=6308
135 | _globals['_CONTENT_FILETRANSMODE']._serialized_end=6351
136 | _globals['_ENTITIES']._serialized_start=6354
137 | _globals['_ENTITIES']._serialized_end=8244
138 | _globals['_ENTITIES_MESSAGE']._serialized_start=6367
139 | _globals['_ENTITIES_MESSAGE']._serialized_end=7892
140 | _globals['_ENTITIES_MESSAGE_TYPE']._serialized_start=7531
141 | _globals['_ENTITIES_MESSAGE_TYPE']._serialized_end=7892
142 | _globals['_ENTITIES_FROMTYPE']._serialized_start=7894
143 | _globals['_ENTITIES_FROMTYPE']._serialized_end=7945
144 | _globals['_ENTITIES_STATUS']._serialized_start=7947
145 | _globals['_ENTITIES_STATUS']._serialized_end=8014
146 | _globals['_ENTITIES_REMOVERTYPE']._serialized_start=8016
147 | _globals['_ENTITIES_REMOVERTYPE']._serialized_end=8100
148 | _globals['_ENTITIES_MESSAGESENSITIVITY']._serialized_start=8102
149 | _globals['_ENTITIES_MESSAGESENSITIVITY']._serialized_end=8172
150 | _globals['_ENTITIES_CHATTYPE']._serialized_start=8174
151 | _globals['_ENTITIES_CHATTYPE']._serialized_end=8244
152 | _globals['_TEXTCONTENT']._serialized_start=8246
153 | _globals['_TEXTCONTENT']._serialized_end=8302
154 | _globals['_RICHTEXT']._serialized_start=8305
155 | _globals['_RICHTEXT']._serialized_end=8556
156 | _globals['_RICHTEXTELEMENTS']._serialized_start=8559
157 | _globals['_RICHTEXTELEMENTS']._serialized_end=8993
158 | _globals['_RICHTEXTELEMENTS_DICTIONARYENTRY']._serialized_start=8736
159 | _globals['_RICHTEXTELEMENTS_DICTIONARYENTRY']._serialized_end=8803
160 | _globals['_RICHTEXTELEMENTS_STYLEREFSENTRY']._serialized_start=8805
161 | _globals['_RICHTEXTELEMENTS_STYLEREFSENTRY']._serialized_end=8897
162 | _globals['_RICHTEXTELEMENTS_RICHTEXTSTYLE']._serialized_start=8899
163 | _globals['_RICHTEXTELEMENTS_RICHTEXTSTYLE']._serialized_end=8943
164 | _globals['_RICHTEXTELEMENTS_RICHTEXTELEMENTSTYLEREFS']._serialized_start=8945
165 | _globals['_RICHTEXTELEMENTS_RICHTEXTELEMENTSTYLEREFS']._serialized_end=8993
166 | _globals['_RICHTEXTELEMENT']._serialized_start=8996
167 | _globals['_RICHTEXTELEMENT']._serialized_end=9632
168 | _globals['_RICHTEXTELEMENT_STYLEENTRY']._serialized_start=9149
169 | _globals['_RICHTEXTELEMENT_STYLEENTRY']._serialized_end=9193
170 | _globals['_RICHTEXTELEMENT_TAG']._serialized_start=9196
171 | _globals['_RICHTEXTELEMENT_TAG']._serialized_end=9632
172 | _globals['_TEXTPROPERTY']._serialized_start=9634
173 | _globals['_TEXTPROPERTY']._serialized_end=9705
174 | _globals['_EXTENDEDENTRY']._serialized_start=9707
175 | _globals['_EXTENDEDENTRY']._serialized_end=9750
176 | _globals['_PIPEENTITY']._serialized_start=9752
177 | _globals['_PIPEENTITY']._serialized_end=9790
178 | _globals['_VERSIONPAYLOAD']._serialized_start=9792
179 | _globals['_VERSIONPAYLOAD']._serialized_end=9862
180 | _globals['_VERSIONRANGE']._serialized_start=9864
181 | _globals['_VERSIONRANGE']._serialized_end=9906
182 | _globals['_CHAT']._serialized_start=9909
183 | _globals['_CHAT']._serialized_end=12332
184 | _globals['_CHAT_I18NNAMESENTRY']._serialized_start=11663
185 | _globals['_CHAT_I18NNAMESENTRY']._serialized_end=11711
186 | _globals['_CHAT_EXTRAENTRY']._serialized_start=11713
187 | _globals['_CHAT_EXTRAENTRY']._serialized_end=11757
188 | _globals['_CHAT_ANNOUNCEMENT']._serialized_start=11759
189 | _globals['_CHAT_ANNOUNCEMENT']._serialized_end=11871
190 | _globals['_CHAT_I18NINF']._serialized_start=11873
191 | _globals['_CHAT_I18NINF']._serialized_end=11981
192 | _globals['_CHAT_I18NINF_I18NNAMESENTRY']._serialized_start=11663
193 | _globals['_CHAT_I18NINF_I18NNAMESENTRY']._serialized_end=11711
194 | _globals['_CHAT_TYPE']._serialized_start=11983
195 | _globals['_CHAT_TYPE']._serialized_end=12039
196 | _globals['_CHAT_STATUS']._serialized_start=12041
197 | _globals['_CHAT_STATUS']._serialized_end=12087
198 | _globals['_CHAT_CHATMODE']._serialized_start=12089
199 | _globals['_CHAT_CHATMODE']._serialized_end=12162
200 | _globals['_CHAT_SUPPORTVIEW']._serialized_start=12164
201 | _globals['_CHAT_SUPPORTVIEW']._serialized_end=12266
202 | _globals['_CHAT_ROLE']._serialized_start=12268
203 | _globals['_CHAT_ROLE']._serialized_end=12332
204 | _globals['_FEEDCARD']._serialized_start=12335
205 | _globals['_FEEDCARD']._serialized_end=12718
206 | _globals['_FEEDCARD_TYPE']._serialized_start=12544
207 | _globals['_FEEDCARD_TYPE']._serialized_end=12656
208 | _globals['_FEEDCARD_FEEDTYPE']._serialized_start=12658
209 | _globals['_FEEDCARD_FEEDTYPE']._serialized_end=12718
210 | # @@protoc_insertion_point(module_scope)
211 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/utils/__init__.py
--------------------------------------------------------------------------------
/utils/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/utils/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/utils/__pycache__/fly_book_utils.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cv-cat/OpenFeiShuApis/8395ecdbb8f545467739d48e2b0cb4c98a19d02a/utils/__pycache__/fly_book_utils.cpython-39.pyc
--------------------------------------------------------------------------------
/utils/fly_book_utils.py:
--------------------------------------------------------------------------------
1 | import json
2 | import subprocess
3 | from functools import partial
4 | subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
5 | import execjs
6 |
7 | try:
8 | fly_book_js = execjs.compile(open(r'../static/fly_book.js', 'r', encoding='utf-8').read())
9 | except:
10 | fly_book_js = execjs.compile(open(r'static/fly_book.js', 'r', encoding='utf-8').read())
11 |
12 | def trans_cookies(cookies_str):
13 | cookies = dict()
14 | for i in cookies_str.split("; "):
15 | try:
16 | cookies[i.split('=')[0]] = '='.join(i.split('=')[1:])
17 | except:
18 | continue
19 | return cookies
20 |
21 |
22 | def generate_access_key(mystr):
23 | access_key = fly_book_js.call('generate_access_key', mystr)
24 | return access_key
25 |
26 | def generate_request_id():
27 | request_id = fly_book_js.call('generate_request_id')
28 | return request_id
29 |
30 |
31 | def generate_long_request_id():
32 | request_id = fly_book_js.call('generate_long_request_id')
33 | return request_id
34 |
35 | def generate_request_cid():
36 | request_cid = fly_book_js.call('generate_request_cid')
37 | return request_cid
38 |
39 |
--------------------------------------------------------------------------------