├── .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 | [![Python Version](https://img.shields.io/badge/python-3.7%2B-blue)](https://www.python.org/) 4 | [![Python Version](https://img.shields.io/badge/nodejs-18%2B-blue)](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 | Star History Chart 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 | --------------------------------------------------------------------------------