From 20d51b21baba03ccfe55a213bffaa69ed2919c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 04:32:11 +0000 Subject: [PATCH 1/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/CallServerAPIs.py | 120 +++++++++++------------------------------ 1 file changed, 30 insertions(+), 90 deletions(-) diff --git a/core/CallServerAPIs.py b/core/CallServerAPIs.py index cd7a027..94a0927 100644 --- a/core/CallServerAPIs.py +++ b/core/CallServerAPIs.py @@ -1,103 +1,43 @@ -import requests -from requests.exceptions import RequestException -import json - -DOMAIN = "https://solian.app/api" - -def _make_request(method: str, url: str, headers: dict, params: dict = None, data: dict = None) -> dict: - """内部辅助函数,用于发送HTTP请求并处理响应""" - try: - if method == 'GET': - response = requests.get(url, headers=headers, params=params) - elif method == 'POST': - response = requests.post(url, headers=headers, data=data) - elif method == 'DELETE': - response = requests.delete(url, headers=headers, params=params) - elif method == 'PATCH': - response = requests.patch(url, headers=headers, data=data) - else: - return {"error": "Unsupported HTTP method"} - - if response.status_code != 200: - return {"error": response.status_code} - - return response.json() - - except json.JSONDecodeError: - return {"error": response.text} - except RequestException as e: - return {"error": str(e)} +from ProjectCfg import DOMAIN +from SNAPI.CallServer import _make_request +from typing import List,Any,Optional,Dict +from SNAPI import * +###=========================活动API================================= def ActivityAPIs(cursor: str = '', filter: str = '', take: int = 20, debuginclude: str = '', Authorization: str = '') -> dict: """获取首页内容""" url = f"{DOMAIN}/activities" headers = {'accept': 'application/json', 'Authorization': Authorization} params = {"cursor": cursor, "filter": filter, "take": take, "debuginclude": debuginclude} - return _make_request('GET', url, headers, params) + return _make_request('GET', url, headers, params=params) -def ChatSummary(Authorization: str) -> dict: - """获取聊天摘要""" - url = f"{DOMAIN}/chat/summary" + +###==========================领域的发现========================== +def GetDiscover(query: str = '', take: int = 20, offset: int = 0, Authorization: str = '') -> dict: + """获取发现""" + url = f"{DOMAIN}/discovery/realms" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {'query': query, 'take': take, 'offset': offset} + return _make_request('GET', url, headers, params=params) + +###==========================领域聊天========================== +def RealmChat(Authorization: str,slug:str ) -> dict: + """获取领域聊天""" + url = f"{DOMAIN}/realms/{slug}/chat" headers = {'accept': 'application/json', 'Authorization': Authorization} return _make_request('GET', url, headers) -def GetChatMessageAllInfo(Authorization: str, roomid: str, offset: int = 0, take: int = 20) -> dict: - """获取聊天消息""" - url = f"{DOMAIN}/chat/{roomid}/message" - headers = {'accept': 'application/json', 'Authorization': Authorization} - params = {"offset": offset, "take": take} - return _make_request('GET', url, headers, params) +###==========================尊贵的Solar Network 恒星计划订阅用户专属翻译功能======= :(呜呜呜,没钱订阅 -def GetChatMessageBaseInfo(Authorization: str, roomid: str) -> dict: - """获取聊天消息基础信息""" - url = f"{DOMAIN}/chat/{roomid}/message/base" +def TranslationText(Authorization: str,text:str ,Tolang:str,FromLang:str) -> dict: + """翻译文本""" + url = f"{DOMAIN}/translation" headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('POST', url, headers) + params = {"to":Tolang,"from":FromLang} + return _make_request('POST', url, headers, params=params,request_body=text) -def GetAMessageAllInfo(Authorization: str, roomid: str, messageid: str) -> dict: - """获取具体聊天消息所有信息""" - url = f"{DOMAIN}/chat/{roomid}/message/{messageid}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('GET', url, headers) - -def GetAMessageInfo(Authorization: str, roomid: str, messageid: str) -> dict: - """获取聊天消息基础信息。暂时作为保留""" - url = f"{DOMAIN}/chat/{roomid}/message/{messageid}/info" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('POST', url, headers) - -def DelMessage(Authorization: str, roomid: str, messageid: str) -> dict: - """删除聊天消息""" - url = f"{DOMAIN}/chat/{roomid}/message/{messageid}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('DELETE', url, headers) - -def GetChatRoomInfo(Authorization: str, id: str) -> dict: - """获取聊天房间信息""" - url = f"{DOMAIN}/chat/{id}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('GET', url, headers) - -def ModifyChatRoomInfo(Authorization: str, id: str, data: dict) -> dict: - """修改聊天房间信息""" - url = f"{DOMAIN}/chat/{id}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('PATCH', url, headers, data=data) - -def DeleteChatRoom(Authorization: str, id: str) -> dict: - """删除聊天房间""" - url = f"{DOMAIN}/chat/{id}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('DELETE', url, headers) - -def CreateChatWithRealm(Authorization: str) -> dict: - """创建聊天房间""" - url = f"{DOMAIN}/chat" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('POST', url, headers) - -def GetChatToAccount(Authorization: str,accountid: str) -> dict: - """获取聊天对象用户信息""" - url = f"{DOMAIN}/chat/direct/{accountid}" - headers = {'accept': 'application/json', 'Authorization': Authorization} - return _make_request('GET', url, headers) +def GetServerVersion() -> dict: + """获取服务器版本""" + url = f"{DOMAIN}/version" + headers = {'accept': 'application/json'} + return _make_request('GET', url, headers) \ No newline at end of file From aab073e6f457cebfa9a13a1ee168e845e246b7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 04:33:05 +0000 Subject: [PATCH 2/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/Chat.py | 199 +++++++++++++++++++++++++++++++++++++ core/SNAPI/Poll.py | 69 +++++++++++++ core/SNAPI/Post.py | 148 +++++++++++++++++++++++++++ core/SNAPI/PostCategory.py | 42 ++++++++ core/SNAPI/PostTag.py | 42 ++++++++ 5 files changed, 500 insertions(+) create mode 100644 core/SNAPI/Chat.py create mode 100644 core/SNAPI/Poll.py create mode 100644 core/SNAPI/Post.py create mode 100644 core/SNAPI/PostCategory.py create mode 100644 core/SNAPI/PostTag.py diff --git a/core/SNAPI/Chat.py b/core/SNAPI/Chat.py new file mode 100644 index 0000000..39dec33 --- /dev/null +++ b/core/SNAPI/Chat.py @@ -0,0 +1,199 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict + +###=========================聊天API================================= +def ChatSummary(Authorization: str) -> dict: + """获取聊天摘要""" + url = f"{DOMAIN}/chat/summary" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetChatMessages(Authorization: str, room_id: str, offset: int = 0, take: int = 20) -> dict: + """获取聊天消息""" + url = f"{DOMAIN}/chat/{room_id}/messages" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset": offset, "take": take} + return _make_request('GET', url, headers, params=params) + +def PostChatMessage(Authorization: str, room_id: str, content: str, nonce: Optional[str] = None, attachments_id: Optional[List[str]] = None, meta: Optional[Dict[str, Any]] = None, replied_message_id: Optional[str] = None, forwarded_message_id: Optional[str] = None) -> dict: + """发送聊天消息""" + body = { + "content": content, + "nonce": nonce, + "attachments_id": attachments_id, + "meta": meta, + "replied_message_id": replied_message_id, + "forwarded_message_id": forwarded_message_id, + } + url = f"{DOMAIN}/chat/{room_id}/messages" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetChatMessageById(Authorization: str, room_id: str, message_id: str) -> dict: + """获取具体聊天消息所有信息""" + url = f"{DOMAIN}/chat/{room_id}/messages/{message_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PatchChatMessage(Authorization: str, room_id: str, message_id: str, content: Optional[str] = None, nonce: Optional[str] = None, attachments_id: Optional[List[str]] = None, meta: Optional[Dict[str, Any]] = None, replied_message_id: Optional[str] = None, forwarded_message_id: Optional[str] = None) -> dict: + """修改聊天消息""" + body = { + "content": content, + "nonce": nonce, + "attachments_id": attachments_id, + "meta": meta, + "replied_message_id": replied_message_id, + "forwarded_message_id": forwarded_message_id, + } + url = f"{DOMAIN}/chat/{room_id}/messages/{message_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body) + +def DeleteChatMessage(Authorization: str, room_id: str, message_id: str) -> dict: + """删除聊天消息""" + url = f"{DOMAIN}/chat/{room_id}/messages/{message_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def PostChatSync(Authorization: str, room_id: str, last_sync_timestamp: int) -> dict: + """同步聊天消息""" + body = {"last_sync_timestamp": last_sync_timestamp} + url = f"{DOMAIN}/chat/{room_id}/sync" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body) + +###=========================聊天室API================================= +def GetChatRoom(Authorization: str, id: str) -> dict: + """获取聊天房间信息""" + url = f"{DOMAIN}/chat/{id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PatchChatRoom(Authorization: str, id: str, name: Optional[str] = None, description: Optional[str] = None, picture_id: Optional[str] = None, background_id: Optional[str] = None, realm_id: Optional[str] = None, is_community: Optional[bool] = None, is_public: Optional[bool] = None) -> dict: + """修改聊天房间信息""" + body = { + "name": name, + "description": description, + "picture_id": picture_id, + "background_id": background_id, + "realm_id": realm_id, + "is_community": is_community, + "is_public": is_public, + } + url = f"{DOMAIN}/chat/{id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body) + +def DeleteChatRoom(Authorization: str, id: str) -> dict: + """删除聊天房间""" + url = f"{DOMAIN}/chat/{id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetChatRooms(Authorization: str) -> dict: + """获取聊天列表""" + url = f"{DOMAIN}/chat" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostChatRoom(Authorization: str, name: str, description: Optional[str] = None, picture_id: Optional[str] = None, background_id: Optional[str] = None, realm_id: Optional[str] = None, is_community: Optional[bool] = None, is_public: Optional[bool] = None) -> dict: + """创建聊天房间""" + body = { + "name": name, + "description": description, + "picture_id": picture_id, + "background_id": background_id, + "realm_id": realm_id, + "is_community": is_community, + "is_public": is_public, + } + url = f"{DOMAIN}/chat" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetDirectChat(Authorization: str, account_id: str) -> dict: + """获取聊天对象用户信息""" + url = f"{DOMAIN}/chat/direct/{account_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetChatRoomSelfInfo(Authorization: str, room_id: str) -> dict: + """获取聊天房间自己信息""" + url = f"{DOMAIN}/chat/{room_id}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def JoinChatRoom(Authorization: str, room_id: str) -> dict: + """加入聊天房间""" + url = f"{DOMAIN}/chat/{room_id}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def LeaveChatRoom(Authorization: str, room_id: str) -> dict: + """退出聊天房间""" + url = f"{DOMAIN}/chat/{room_id}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetChatRoomMembers(Authorization: str, room_id: str, offset: int = 0, take: int = 20, with_status: bool = False) -> dict: + """获取聊天房间成员""" + params = { + "offset": offset, + "take": take, + "withStatus": with_status, + } + url = f"{DOMAIN}/chat/{room_id}/members" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers, params=params) + +def PostChatMemberInvite(Authorization: str, room_id: str, related_user_id: str, role: int) -> dict: + """发送聊天邀请""" + body = { + "related_user_id": related_user_id, + "role": role, + } + url = f"{DOMAIN}/chat/invites/{room_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetChatInvites(Authorization: str) -> dict: + """获取聊天邀请""" + url = f"{DOMAIN}/chat/invites" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def AcceptChatInvite(Authorization: str, room_id: str) -> dict: + """接受聊天邀请""" + url = f"{DOMAIN}/chat/invites/{room_id}/accept" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers) + +def DeclineChatInvite(Authorization: str, room_id: str) -> dict: + """拒绝聊天邀请""" + url = f"{DOMAIN}/chat/invites/{room_id}/decline" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers) + +def SetChatNotify(Authorization: str, room_id: str, notify_level: int, break_until: Optional[str] = None) -> dict: + """设置聊天通知级别""" + body = { + "notify_level": notify_level, + "break_until": break_until, + } + url = f"{DOMAIN}/chat/{room_id}/members/me/notify" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body, normal_codes=[201]) + +def SetChatMemberRole(Authorization: str, room_id: str, member_id: str, role: int) -> dict: + """设置聊天成员角色""" + body = {"role": role} + url = f"{DOMAIN}/chat/{room_id}/members/{member_id}/role" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body, normal_codes=[201]) + +def KickChatMember(Authorization: str, room_id: str, member_id: str) -> dict: + """踢出聊天成员""" + url = f"{DOMAIN}/chat/{room_id}/members/{member_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) diff --git a/core/SNAPI/Poll.py b/core/SNAPI/Poll.py new file mode 100644 index 0000000..a36898b --- /dev/null +++ b/core/SNAPI/Poll.py @@ -0,0 +1,69 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict + +###==========================投票功能============================ +def GetPoll(poll_id: str, Authorization: str) -> dict: + """获取投票""" + url = f"{DOMAIN}/polls/{poll_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostPoll(Authorization: str, title: Optional[str] = None, description: Optional[str] = None, ended_at: Optional[str] = None, is_anonymous: Optional[bool] = None, questions: Optional[List[Dict[str, Any]]] = None) -> dict: + """创建投票""" + body = { + "title": title, + "description": description, + "ended_at": ended_at, + "is_anonymous": is_anonymous, + "questions": questions, + } + url = f"{DOMAIN}/polls" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def DeletePoll(Authorization: str, poll_id: str) -> dict: + """删除投票""" + url = f"{DOMAIN}/polls/{poll_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def AnswerPoll(Authorization: str, poll_id: str, answer: Dict[str, Any]) -> dict: + """回答投票""" + body = {"answer": answer} + url = f"{DOMAIN}/polls/{poll_id}/answer" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def DeletePollAnswer(Authorization: str, poll_id: str) -> dict: + """删除投票回答""" + url = f"{DOMAIN}/polls/{poll_id}/answer" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetPollFeedback(Authorization: str, poll_id: str, offset: int = 0, take: int = 20) -> dict: + """获取投票反馈""" + url = f"{DOMAIN}/polls/{poll_id}/feedback" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {'offset': offset, 'take': take} + return _make_request('GET', url, headers, params=params) + +def GetMyPolls(Authorization: str, pub: Optional[str] = None, active: bool = False, offset: int = 0, take: int = 20) -> dict: + """获取我的投票""" + url = f"{DOMAIN}/polls/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {'offset': offset, 'take': take, 'pub': pub, 'active': active} + return _make_request('GET', url, headers, params=params) + +def PatchPoll(Authorization: str, poll_id: str, title: Optional[str] = None, description: Optional[str] = None, ended_at: Optional[str] = None, is_anonymous: Optional[bool] = None, questions: Optional[List[Dict[str, Any]]] = None) -> dict: + """修改投票""" + body = { + "title": title, + "description": description, + "ended_at": ended_at, + "is_anonymous": is_anonymous, + "questions": questions, + } + url = f"{DOMAIN}/polls/{poll_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body, normal_codes=[201]) diff --git a/core/SNAPI/Post.py b/core/SNAPI/Post.py new file mode 100644 index 0000000..a75bd8a --- /dev/null +++ b/core/SNAPI/Post.py @@ -0,0 +1,148 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict +###==========================帖子管理============================ +def GetFeaturedPosts(Authorization: str) -> dict: + """获取精选帖子""" + url = f"{DOMAIN}/posts/featured" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPosts(Authorization: str, offset: int = 0, take: int = 20, pub: Optional[str] = None, realm: Optional[str] = None, post_type: Optional[int] = None, categories: Optional[List[str]] = None, tags: Optional[List[str]] = None, query: Optional[str] = None, vector: bool = False, media: bool = False, shuffle: bool = False, replies: Optional[bool] = None, pinned: Optional[bool] = None) -> dict: + """获取帖子列表""" + url = f"{DOMAIN}/posts" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = { + "offset": offset, + "take": take, + "pub": pub, + "realm": realm, + "type": post_type, + "categories": categories, + "tags": tags, + "query": query, + "vector": vector, + "media": media, + "shuffle": shuffle, + "replies": replies, + "pinned": pinned, + } + return _make_request('GET', url, headers, params=params) + +def PostPost(Authorization: str, title: str, description: str, slug: str, content: str, visibility: int, post_type: int, embed_view: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, categories: Optional[List[str]] = None, attachments: Optional[List[str]] = None, published_at: Optional[str] = None, replied_post_id: Optional[str] = None, forwarded_post_id: Optional[str] = None, realm_id: Optional[str] = None, poll_id: Optional[str] = None) -> dict: + """创建帖子""" + body = { + "title": title, + "description": description, + "slug": slug, + "content": content, + "visibility": visibility, + "type": post_type, + "embed_view": embed_view, + "tags": tags, + "categories": categories, + "attachments": attachments, + "published_at": published_at, + "replied_post_id": replied_post_id, + "forwarded_post_id": forwarded_post_id, + "realm_id": realm_id, + "poll_id": poll_id, + } + url = f"{DOMAIN}/posts" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetPostById(Authorization: str, post_id: str) -> dict: + """获取帖子详情""" + url = f"{DOMAIN}/posts/{post_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PatchPost(Authorization: str, post_id: str, title: Optional[str] = None, description: Optional[str] = None, slug: Optional[str] = None, content: Optional[str] = None, visibility: Optional[int] = None, post_type: Optional[int] = None, embed_view: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, categories: Optional[List[str]] = None, attachments: Optional[List[str]] = None, published_at: Optional[str] = None, replied_post_id: Optional[str] = None, forwarded_post_id: Optional[str] = None, realm_id: Optional[str] = None, poll_id: Optional[str] = None) -> dict: + """修改帖子""" + body = { + "title": title, + "description": description, + "slug": slug, + "content": content, + "visibility": visibility, + "type": post_type, + "embed_view": embed_view, + "tags": tags, + "categories": categories, + "attachments": attachments, + "published_at": published_at, + "replied_post_id": replied_post_id, + "forwarded_post_id": forwarded_post_id, + "realm_id": realm_id, + "poll_id": poll_id, + } + url = f"{DOMAIN}/posts/{post_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body) + +def DeletePost(Authorization: str, post_id: str) -> dict: + """删除帖子""" + url = f"{DOMAIN}/posts/{post_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetPostReactions(Authorization: str, post_id: str, symbol: Optional[str] = None, offset: int = 0, take: int = 20) -> dict: + """获取帖子反应""" + url = f"{DOMAIN}/posts/{post_id}/reactions" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"symbol": symbol, "offset": offset, "take": take} + return _make_request('GET', url, headers, params=params) + +def PostPostReaction(Authorization: str, post_id: str, symbol: str, attitude: int) -> dict: + """发送帖子反应""" + body = {"symbol": symbol, "attitude": attitude} + url = f"{DOMAIN}/posts/{post_id}/reactions" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetFeaturedPostReplies(Authorization: str, post_id: str) -> dict: + """获取精选帖子回复""" + url = f"{DOMAIN}/posts/{post_id}/replies/featured" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPinnedPostReplies(Authorization: str, post_id: str) -> dict: + """获取置顶帖子回复""" + url = f"{DOMAIN}/posts/{post_id}/replies/pinned" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPostReplies(Authorization: str, post_id: str, offset: int = 0, take: int = 20) -> dict: + """获取帖子回复""" + url = f"{DOMAIN}/posts/{post_id}/replies" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset": offset, "take": take} + return _make_request('GET', url, headers, params=params) + +def GetPostAwards(Authorization: str, post_id: str, offset: int = 0, take: int = 20) -> dict: + """获取帖子奖励""" + url = f"{DOMAIN}/posts/{post_id}/awards" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset": offset, "take": take} + return _make_request('GET', url, headers, params=params) + +def PostPostAward(Authorization: str, post_id: str, amount: float, attitude: int, message: Optional[str] = None) -> dict: + """发送帖子奖励""" + body = {"amount": amount, "attitude": attitude, "message": message} + url = f"{DOMAIN}/posts/{post_id}/awards" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def PostPinPost(Authorization: str, post_id: str, mode: int) -> dict: + """置顶帖子""" + body = {"mode": mode} + url = f"{DOMAIN}/posts/{post_id}/pin" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def DeletePinPost(Authorization: str, post_id: str) -> dict: + """取消置顶帖子""" + url = f"{DOMAIN}/posts/{post_id}/pin" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) diff --git a/core/SNAPI/PostCategory.py b/core/SNAPI/PostCategory.py new file mode 100644 index 0000000..9eadc2d --- /dev/null +++ b/core/SNAPI/PostCategory.py @@ -0,0 +1,42 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict + +###==========================帖子分类管理============================ +def GetPostCategories(Authorization: str, query: Optional[str] = None, offset: int = 0, take: int = 20, order: Optional[str] = None) -> dict: + """获取帖子分类""" + url = f"{DOMAIN}/posts/categories" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"query": query, "offset": offset, "take": take, "order": order} + return _make_request('GET', url, headers, params=params) + +def PostPostCategory(Authorization: str, slug: Optional[str] = None, name: Optional[str] = None) -> dict: + """创建帖子分类""" + body = {"slug": slug, "name": name} + url = f"{DOMAIN}/posts/categories" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetPostCategoryBySlug(Authorization: str, slug: str) -> dict: + """获取帖子分类详情""" + url = f"{DOMAIN}/posts/categories/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostSubscribeCategory(Authorization: str, slug: str) -> dict: + """订阅帖子分类""" + url = f"{DOMAIN}/posts/categories/{slug}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def PostUnsubscribeCategory(Authorization: str, slug: str) -> dict: + """取消订阅帖子分类""" + url = f"{DOMAIN}/posts/categories/{slug}/unsubscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def GetCategorySubscription(Authorization: str, slug: str) -> dict: + """获取分类订阅状态""" + url = f"{DOMAIN}/posts/categories/{slug}/subscription" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) diff --git a/core/SNAPI/PostTag.py b/core/SNAPI/PostTag.py new file mode 100644 index 0000000..bb7fe2d --- /dev/null +++ b/core/SNAPI/PostTag.py @@ -0,0 +1,42 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict + +###==========================帖子标签管理============================ +def GetPostTags(Authorization: str, query: Optional[str] = None, offset: int = 0, take: int = 20, order: Optional[str] = None) -> dict: + """获取帖子标签""" + url = f"{DOMAIN}/posts/tags" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"query": query, "offset": offset, "take": take, "order": order} + return _make_request('GET', url, headers, params=params) + +def PostTag(Authorization: str, slug: Optional[str] = None, name: Optional[str] = None) -> dict: + """创建帖子标签""" + body = {"slug": slug, "name": name} + url = f"{DOMAIN}/posts/tags" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetTagBySlug(Authorization: str, slug: str) -> dict: + """获取标签详情""" + url = f"{DOMAIN}/posts/tags/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostSubscribeTag(Authorization: str, slug: str) -> dict: + """订阅标签""" + url = f"{DOMAIN}/posts/tags/{slug}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def PostUnsubscribeTag(Authorization: str, slug: str) -> dict: + """取消订阅标签""" + url = f"{DOMAIN}/posts/tags/{slug}/unsubscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def GetTagSubscription(Authorization: str, slug: str) -> dict: + """获取标签订阅状态""" + url = f"{DOMAIN}/posts/tags/{slug}/subscription" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) From 87bf2e4ef5737074c739ecad508c7a69083a65a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 04:33:15 +0000 Subject: [PATCH 3/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/CallServer.py | 30 ++++++++ core/SNAPI/Publisher.py | 149 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 core/SNAPI/CallServer.py create mode 100644 core/SNAPI/Publisher.py diff --git a/core/SNAPI/CallServer.py b/core/SNAPI/CallServer.py new file mode 100644 index 0000000..5653fbb --- /dev/null +++ b/core/SNAPI/CallServer.py @@ -0,0 +1,30 @@ +import requests +import json +from requests.exceptions import RequestException +import platform + +UA = f"SolianForPythonApp/0.000.001 ({platform.system()})" + +def _make_request(method: str, url: str, headers: dict, params: dict = None, normal_codes: list = [200], request_body: dict = None) -> dict: + """内部辅助函数,用于发送HTTP请求并处理响应""" + headers['User-Agent'] = UA + try: + if method == 'GET': + response = requests.get(url, headers=headers, params=params) + elif method == 'POST': + response = requests.post(url, headers=headers, data=json.dumps(request_body)) + elif method == 'DELETE': + response = requests.delete(url, headers=headers, params=params) + elif method == 'PATCH': + response = requests.patch(url, headers=headers, data=json.dumps(request_body)) + else: + return {"error": "Unsupported HTTP method"} + + if response.status_code not in normal_codes: + return {"error": f"Unexpected status code: {response.status_code}"} + + return response.json() + except json.JSONDecodeError: + return {"error": response.text} + except RequestException as e: + return {"error": str(e)} \ No newline at end of file diff --git a/core/SNAPI/Publisher.py b/core/SNAPI/Publisher.py new file mode 100644 index 0000000..54baa59 --- /dev/null +++ b/core/SNAPI/Publisher.py @@ -0,0 +1,149 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request +from typing import List,Any,Optional,Dict +###==========================发布者管理============================ +def GetPublisher(Authorization: str, name: str) -> dict: + """获取发布者信息""" + url = f"{DOMAIN}/publishers/{name}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PatchPublisher(Authorization: str, name: str, nick: Optional[str] = None, bio: Optional[str] = None, picture_id: Optional[str] = None, background_id: Optional[str] = None) -> dict: + """修改发布者信息""" + body = { + "nick": nick, + "bio": bio, + "picture_id": picture_id, + "background_id": background_id, + } + url = f"{DOMAIN}/publishers/{name}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers, request_body=body, normal_codes=[201]) + +def DeletePublisher(Authorization: str, name: str) -> dict: + """删除发布者""" + url = f"{DOMAIN}/publishers/{name}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetPublisherStats(Authorization: str, name: str) -> dict: + """获取发布者统计信息""" + url = f"{DOMAIN}/publishers/{name}/stats" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPublishersOfAccountId(Authorization: str, account_id: str) -> dict: + """获取指定账户的发布者""" + url = f"{DOMAIN}/publishers/of/{account_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPublishers(Authorization: str) -> dict: + """获取所有发布者""" + url = f"{DOMAIN}/publishers" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostPublisherInvite(Authorization: str, name: str, related_user_id: str, role: int) -> dict: + """发送发布者邀请""" + body = {"related_user_id": related_user_id, "role": role} + url = f"{DOMAIN}/publishers/invites/{name}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetPublisherInvites(Authorization: str, name: str) -> dict: + """获取发布者邀请""" + url = f"{DOMAIN}/publishers/invites/{name}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def AcceptPublisherInvite(Authorization: str, name: str) -> dict: + """接受发布者邀请""" + url = f"{DOMAIN}/publishers/invites/{name}/accept" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def DeclinePublisherInvite(Authorization: str, name: str) -> dict: + """拒绝发布者邀请""" + url = f"{DOMAIN}/publishers/invites/{name}/decline" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, normal_codes=[201]) + +def DeletePublisherMember(Authorization: str, name: str, member_id: str) -> dict: + """删除发布者成员""" + url = f"{DOMAIN}/publishers/{name}/members/{member_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def PostIndividualPublisher(Authorization: str, name: str, nick: Optional[str] = None, bio: Optional[str] = None, picture_id: Optional[str] = None, background_id: Optional[str] = None) -> dict: + """创建个人发布者""" + body = { + "name": name, + "nick": nick, + "bio": bio, + "picture_id": picture_id, + "background_id": background_id, + } + url = f"{DOMAIN}/publishers/individual" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def PostOrganizationPublisher(Authorization: str, name: str, realm_slug: str) -> dict: + """创建组织发布者""" + body = {"name": name, "realm_slug": realm_slug} + url = f"{DOMAIN}/publishers/organization/{realm_slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def GetPublisherMembers(Authorization: str, name: str, offset: int = 0, take: int = 20) -> dict: + """获取发布者成员""" + url = f"{DOMAIN}/publishers/{name}/members" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset": offset, "take": take} + return _make_request('GET', url, headers, params=params) + +def GetMyPublisherMember(Authorization: str, name: str) -> dict: + """获取我的发布者成员信息""" + url = f"{DOMAIN}/publishers/{name}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostPublisherFeature(Authorization: str, name: str, flag: str, expired_at: Optional[str] = None) -> dict: + """创建发布者特性""" + body = {"flag": flag, "expired_at": expired_at} + url = f"{DOMAIN}/publishers/{name}/features" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=body, normal_codes=[201]) + +def DeletePublisherFeature(Authorization: str, name: str, flag: str) -> dict: + """删除发布者特性""" + url = f"{DOMAIN}/publishers/{name}/features/{flag}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers, normal_codes=[204]) + +def GetPublisherSubscriptions(Authorization: str) -> dict: + """获取发布者订阅状态""" + url = f"{DOMAIN}/publishers/subscriptions" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPublisherSubscription(Authorization: str, name: str) -> dict: + """获取特定发布者的订阅状态""" + url = f"{DOMAIN}/api/publishers/{name}/subscription" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def PostPublisherSubscribe(Authorization: str, name: str, subscribeRequest: Optional[dict] = None,tier:int=0) -> dict: + """订阅特定发布者""" + RequestsBody={ + "tier":tier + } + url = f"{DOMAIN}/api/publishers/{name}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers, request_body=subscribeRequest) + +def PostPublisherUnsubscribe(Authorization: str, name: str) -> dict: + """取消订阅特定发布者""" + url = f"{DOMAIN}/api/publishers/{name}/unsubscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers) From 2fead18237c87d20aca6bd6333a30819d391905e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 06:57:00 +0000 Subject: [PATCH 4/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/PostCategory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/SNAPI/PostCategory.py b/core/SNAPI/PostCategory.py index 9eadc2d..08c4cc0 100644 --- a/core/SNAPI/PostCategory.py +++ b/core/SNAPI/PostCategory.py @@ -1,6 +1,6 @@ from ProjectCfg import DOMAIN from CallServer import _make_request -from typing import List,Any,Optional,Dict +from typing import Optional ###==========================帖子分类管理============================ def GetPostCategories(Authorization: str, query: Optional[str] = None, offset: int = 0, take: int = 20, order: Optional[str] = None) -> dict: From 0e04dfb10da51aca17fdaf06ed3894135615d267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 06:57:12 +0000 Subject: [PATCH 5/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/PostTag.py | 2 +- core/SNAPI/Publisher.py | 2 +- core/SNAPI/Realm.py | 117 ++++++++++++++++++++++++++++++++++++ core/SNAPI/RealtimeCall.py | 28 +++++++++ core/SNAPI/Sticker.py | 118 +++++++++++++++++++++++++++++++++++++ 5 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 core/SNAPI/Realm.py create mode 100644 core/SNAPI/RealtimeCall.py create mode 100644 core/SNAPI/Sticker.py diff --git a/core/SNAPI/PostTag.py b/core/SNAPI/PostTag.py index bb7fe2d..c4fa394 100644 --- a/core/SNAPI/PostTag.py +++ b/core/SNAPI/PostTag.py @@ -1,6 +1,6 @@ from ProjectCfg import DOMAIN from CallServer import _make_request -from typing import List,Any,Optional,Dict +from typing import Optional ###==========================帖子标签管理============================ def GetPostTags(Authorization: str, query: Optional[str] = None, offset: int = 0, take: int = 20, order: Optional[str] = None) -> dict: diff --git a/core/SNAPI/Publisher.py b/core/SNAPI/Publisher.py index 54baa59..ae2e957 100644 --- a/core/SNAPI/Publisher.py +++ b/core/SNAPI/Publisher.py @@ -1,6 +1,6 @@ from ProjectCfg import DOMAIN from CallServer import _make_request -from typing import List,Any,Optional,Dict +from typing import Optional ###==========================发布者管理============================ def GetPublisher(Authorization: str, name: str) -> dict: """获取发布者信息""" diff --git a/core/SNAPI/Realm.py b/core/SNAPI/Realm.py new file mode 100644 index 0000000..a4a9d7a --- /dev/null +++ b/core/SNAPI/Realm.py @@ -0,0 +1,117 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================领域部分========================== + +def GetRealm(slug:str,Authorization: str = '') -> dict: + """获取领域详情""" + url = f"{DOMAIN}/realms/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def ModifyRealm(slug:str,Authorization: str ,name:str='',description:str='',picture_id:str='',background_id:str='',is_community:bool=True,is_public:bool=True) -> dict: + """修改领域""" + request_body={ + "slug": slug, + "name": name, + "description": description, + "picture_id": picture_id, + "background_id": background_id, + "is_community": is_community, + "is_public": is_public +} + url = f"{DOMAIN}/realms/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers,request_body=request_body,normal_codes=[201]) + +def DeleteRealm(slug:str,Authorization: str) -> dict: + """删除领域""" + url = f"{DOMAIN}/realms/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def GetJoinedRealms(Authorization: str) -> dict: + """获取加入的领域""" + url = f"{DOMAIN}/realms" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def CreateRealm(slug:str,Authorization: str,name:str='',description:str='',picture_id:str='',background_id:str='',is_community:bool=True,is_public:bool=True) -> dict: + """创建领域""" + request_body={ + "slug": slug, + "name": name, + "description": description, + "picture_id": picture_id, + "background_id": background_id, + "is_community": is_community, + "is_public": is_public +} + url = f"{DOMAIN}/realms" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,request_body=request_body,normal_codes=[201]) + +def GetRealmInvites(Authorization: str) -> dict: + """获取领域邀请""" + url = f"{DOMAIN}/realms/invites" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def SendRealmInvite(slug:str,Authorization: str,user_id:str,role:int=0) -> dict: + """发送领域邀请""" + request_body={ + "related_user_id": user_id, + "role": role +} + url = f"{DOMAIN}/realms/invites/{slug}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,request_body=request_body,normal_codes=[201]) + +def AcceptRealmInvite(slug:str,Authorization: str) -> dict: + """接受领域邀请""" + url = f"{DOMAIN}/realms/invites/{slug}/accept" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def DeclineRealmInvite(slug:str,Authorization: str) -> dict: + """拒绝领域邀请""" + url = f"{DOMAIN}/realms/invites/{slug}/decline" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def GetRealmMembers(slug:str,Authorization: str,offset:int=0,take:int=20,withStatus:bool=False) -> dict: + """获取领域成员""" + url = f"{DOMAIN}/realms/{slug}/members" + params = {"offset":offset,"take":take,"withStatus":withStatus} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers,params=params) + +def GetRealmMemberMe(slug:str,Authorization: str) -> dict: + """获取领域成员""" + url = f"{DOMAIN}/realms/{slug}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def LeaveRealm(slug:str,Authorization: str) -> dict: + """退出领域""" + url = f"{DOMAIN}/realms/{slug}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def JoinRealm(slug:str,Authorization: str) -> dict: + """加入领域""" + url = f"{DOMAIN}/realms/{slug}/members/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def KickMemberRealm(slug:str,Authorization: str,user_id:str) -> dict: + """踢出领域成员""" + url = f"{DOMAIN}/realms/{slug}/members/{user_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def SetMemberRoleRealm(slug:str,Authorization: str,user_id:str,role:int) -> dict: + """设置领域成员角色""" + url = f"{DOMAIN}/realms/{slug}/members/{user_id}/role" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers,normal_codes=[201],request_body=role) diff --git a/core/SNAPI/RealtimeCall.py b/core/SNAPI/RealtimeCall.py new file mode 100644 index 0000000..fdc90dd --- /dev/null +++ b/core/SNAPI/RealtimeCall.py @@ -0,0 +1,28 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================实时聊天========================== + +def GetRealtimeChat(Authorization: str,roomid:str ) -> dict: + """获取实时聊天""" + url = f"{DOMAIN}/chat/realtime/{roomid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def CreateRealtimeChat(Authorization: str,roomid:str ) -> dict: + """创建实时聊天""" + url = f"{DOMAIN}/chat/realtime/{roomid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def LeaveRealtimeChat(Authorization: str,roomid:str ) -> dict: + """离开实时聊天""" + url = f"{DOMAIN}/chat/realtime/{roomid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def JoinRealtimeChat(Authorization: str,roomid:str ) -> dict: + """加入实时聊天""" + url = f"{DOMAIN}/chat/realtime/{roomid}/join" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) \ No newline at end of file diff --git a/core/SNAPI/Sticker.py b/core/SNAPI/Sticker.py new file mode 100644 index 0000000..876c9ad --- /dev/null +++ b/core/SNAPI/Sticker.py @@ -0,0 +1,118 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================贴纸========================== + +def GetStickerPackageList(Authorization: str,offset:int=0,take:int=20,pub:str='',order:str='',query:str="") -> dict: + """获取贴纸包列表""" + url = f"{DOMAIN}/stickers" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset":offset,"take":take,"pub":pub,"order":order,"query":query} + return _make_request('GET', url, headers,params=params) + +def CreateStickerPackage(Authorization: str,pub:str,name:str,description:str,prefix:str) -> dict: + """创建贴纸包""" + url = f"{DOMAIN}/stickers" + RequestsBody={ + "name":name, + "description": description, + "prefix": prefix +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,request_body=RequestsBody,params={"pub":pub},normal_codes=[201]) + +def GetMyStickerList(Authorization: str) -> dict: + """获取我的贴纸列表""" + url = f"{DOMAIN}/stickers/me" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetAStickerPackageInfo(Authorization: str,sticker_id:str) -> dict: + """获取贴纸包信息""" + url = f"{DOMAIN}/stickers/{sticker_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def ModifyStickerPackage(Authorization: str,sticker_id:str,name:str,description:str,prefix:str) -> dict: + """修改贴纸包""" + url = f"{DOMAIN}/stickers/{sticker_id}" + RequestsBody={ + "name":name, + "description": description, + "prefix": prefix +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers,request_body=RequestsBody,normal_codes=[201]) + +def DeleteStickerPackage(Authorization: str,sticker_id:str) -> dict: + """删除贴纸包""" + url = f"{DOMAIN}/stickers/{sticker_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def GetStickerPackageContent(Authorization: str,sticker_id:str) -> dict: + """获取贴纸包内容""" + url = f"{DOMAIN}/stickers/{sticker_id}/content" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def ModifyStickerPackageContent(Authorization: str,sticker_id:str,slug:str,image_id:str) -> dict: + """修改贴纸包内容""" + url = f"{DOMAIN}/stickers/{sticker_id}/content" + RequestsBody={ + "slug":slug, + "image_id": image_id +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,request_body=RequestsBody,normal_codes=[201]) +def GetStickerInfo(Authorization: str,sticker_id:str) -> dict: + """获取贴纸信息""" + url = f"{DOMAIN}/stickers/lookup/{sticker_id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetStickerImg(Authorization: str,sticker_id:str) -> dict: + """获取贴纸图片""" + url = f"{DOMAIN}/stickers/lookup/{sticker_id}/open" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetPackageStickerInfo(Authorization: str,packid:str,id:str) -> dict: + """获取贴纸包信息""" + url = f"{DOMAIN}/stickers/{packid}/content/{id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def CreateStickerImageInPackage(Authorization: str,packid:str,slug:str,image_id:str) -> dict: + """创建贴纸包图片""" + url = f"{DOMAIN}/stickers/{packid}/content" + RequestsBody={ + "slug":slug, + "image_id": image_id +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers,request_body=RequestsBody,normal_codes=[201]) + +def DeleteStickerImageInPackage(Authorization: str,packid:str,id:str) -> dict: + """删除贴纸包图片""" + url = f"{DOMAIN}/stickers/{packid}/content/{id}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def GetSelfHadStickerPackageInfo(Authorization: str,packid:str) -> dict: + """获取自己已拥有的贴纸包信息""" + url = f"{DOMAIN}/stickers/{packid}/own" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def AddStickerPackage(Authorization: str,packid:str) -> dict: + """添加贴纸包""" + url = f"{DOMAIN}/stickers/{packid}/own" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def RemoveStickerPackage(Authorization: str,packid:str) -> dict: + """移除贴纸包""" + url = f"{DOMAIN}/stickers/{packid}/own" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) \ No newline at end of file From 0e8d3e0e71c148778eb7dda618ff120e449374cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 06:57:20 +0000 Subject: [PATCH 6/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/WebArticle.py | 24 ++++++++++++++++ core/SNAPI/WebFeed.py | 57 +++++++++++++++++++++++++++++++++++++ core/SNAPI/WebFeedPublic.py | 56 ++++++++++++++++++++++++++++++++++++ core/SNAPI/WebReader.py | 23 +++++++++++++++ 4 files changed, 160 insertions(+) create mode 100644 core/SNAPI/WebArticle.py create mode 100644 core/SNAPI/WebFeed.py create mode 100644 core/SNAPI/WebFeedPublic.py create mode 100644 core/SNAPI/WebReader.py diff --git a/core/SNAPI/WebArticle.py b/core/SNAPI/WebArticle.py new file mode 100644 index 0000000..fc64d2d --- /dev/null +++ b/core/SNAPI/WebArticle.py @@ -0,0 +1,24 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================网页文章========================== + +def GetWebArticle(feedid:str,publisherid:str,limit:int=20,offset:int=0,Authorization: str='' ) -> dict: + """获取网页文章""" + url = f"{DOMAIN}/feeds/articles" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"feedid":feedid,"publisherid":publisherid,"limit":limit,"offset":offset} + return _make_request('GET', url, headers,params=params) + +def GetWebArticleDetail(articleid:str,Authorization: str='' ) -> dict: + """获取网页文章详情""" + url = f"{DOMAIN}/feeds/articles/{articleid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def RandomWebArticle(Authorization: str='',limit:int=5 ) -> dict: + """随机获取网页文章""" + url = f"{DOMAIN}/feeds/articles/random" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"limit":limit} + return _make_request('GET', url, headers,params=params) diff --git a/core/SNAPI/WebFeed.py b/core/SNAPI/WebFeed.py new file mode 100644 index 0000000..555709b --- /dev/null +++ b/core/SNAPI/WebFeed.py @@ -0,0 +1,57 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================网页流========================== + +def GetWebFeed(pubname:str,Authorization: str='') -> dict: + """获取网页流""" + url = f"{DOMAIN}/publishers/{pubname}/feeds" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + + +def SendWebFeed(pubname:str,Authorization: str='',URL:str='',Title:str='',Description:str='',ScrapPage:bool=True) -> dict: + """发送网页流""" + url = f"{DOMAIN}/publishers/{pubname}/feeds" + RequestsBody={ + "url": URL, + "title": Title, + "description": Description, + "config": { + "scrap_page": ScrapPage, + } +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,request_body=RequestsBody,normal_codes=[201]) + +def GetWebFeedDetail(feedid:str,pubname:str,Authorization: str='') -> dict: + """获取网页流详情""" + url = f"{DOMAIN}/publishers/{pubname}/feeds/{feedid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def ModifyWebFeed(feedid:str,pubname:str,Authorization: str='',URL:str='',Title:str='',Description:str='',ScrapPage:bool=True) -> dict: + """修改网页流""" + url = f"{DOMAIN}/publishers/{pubname}/feeds/{feedid}" + RequestsBody={ + "url": URL, + "title": Title, + "description": Description, + "config": { + "scrap_page": ScrapPage, + } +} + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('PATCH', url, headers,request_body=RequestsBody,normal_codes=[200]) + +def DeleteWebFeed(feedid:str,pubname:str,Authorization: str='') -> dict: + """删除网页流""" + url = f"{DOMAIN}/publishers/{pubname}/feeds/{feedid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def SetScrapPage(pubname:str,id:str,Authorization: str='') -> dict: + """设置是否采集网页""" + url = f"{DOMAIN}/publishers/{pubname}/feeds/{id}/scrap" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) diff --git a/core/SNAPI/WebFeedPublic.py b/core/SNAPI/WebFeedPublic.py new file mode 100644 index 0000000..6da67cf --- /dev/null +++ b/core/SNAPI/WebFeedPublic.py @@ -0,0 +1,56 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================公共网页流========================== + +def SubscribeWebFeed(feedid:str,Authorization: str) -> dict: + """订阅公共网页流""" + url = f"{DOMAIN}/feeds/{feedid}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('POST', url, headers,normal_codes=[201]) + +def UnsubscribeWebFeed(feedid:str,Authorization: str) -> dict: + """取消订阅公共网页流""" + url = f"{DOMAIN}/feeds/{feedid}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers,normal_codes=[204]) + +def GetWebFeedSubscription(feedid:str,Authorization: str='') -> dict: + """获取公共网页流订阅""" + url = f"{DOMAIN}/feeds/{feedid}/subscribe" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetWebFeedSubscribed(offset:int=0,take:int=20,Authorization: str='') -> dict: + """获取公共网页流订阅""" + url = f"{DOMAIN}/feeds/subscribed" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset":offset,"take":take} + return _make_request('GET', url, headers,params=params) + +def GetWebFeedInfo(offset:int=0,take:int=20,Authorization: str='') -> dict: + """获取公共网页流信息""" + url = f"{DOMAIN}/feeds" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset":offset,"take":take} + return _make_request('GET', url, headers,params=params) + +def GetWebFeedDetail(feedid:str,Authorization: str='') -> dict: + """获取公共网页流详情""" + url = f"{DOMAIN}/feeds/{feedid}" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('GET', url, headers) + +def GetWebFeedArticles(feedid:str,offset:int=0,take:int=20,Authorization: str='') -> dict: + """获取公共网页流文章""" + url = f"{DOMAIN}/feeds/{feedid}/articles" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset":offset,"take":take} + return _make_request('GET', url, headers,params=params) + +def GetWebFeedExplore(offset:int=0,take:int=20,query='',Authorization: str='') -> dict: + """获取公共网页流探索""" + url = f"{DOMAIN}/feeds/explore" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"offset":offset,"take":take,"query":query} + return _make_request('GET', url, headers,params=params) diff --git a/core/SNAPI/WebReader.py b/core/SNAPI/WebReader.py new file mode 100644 index 0000000..93da714 --- /dev/null +++ b/core/SNAPI/WebReader.py @@ -0,0 +1,23 @@ +from ProjectCfg import DOMAIN +from CallServer import _make_request + +###==========================网页阅读器========================== +def ReadForURL(url:str,Authorization: str='' ) -> dict: + """通过URL读取网页""" + url = f"{DOMAIN}/scrap/link" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"url":url} + return _make_request('GET', url, headers,params=params) + +def ClearReaderCache(url:str,Authorization: str='') -> dict: + """清除缓存""" + url = f"{DOMAIN}/scrap/link/cache" + headers = {'accept': 'application/json', 'Authorization': Authorization} + params = {"url":url} + return _make_request('DELETE', url, headers,params=params) + +def ClearAllReaderCache(Authorization: str='') -> dict: + """清除所有缓存""" + url = f"{DOMAIN}/scrap/cache/all" + headers = {'accept': 'application/json', 'Authorization': Authorization} + return _make_request('DELETE', url, headers) \ No newline at end of file From 0dbe1e0ccb7044ee524f23e93cacc0ce0514a5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 06:57:34 +0000 Subject: [PATCH 7/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/CallServerAPIs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/CallServerAPIs.py b/core/CallServerAPIs.py index 94a0927..3da853a 100644 --- a/core/CallServerAPIs.py +++ b/core/CallServerAPIs.py @@ -1,6 +1,5 @@ from ProjectCfg import DOMAIN from SNAPI.CallServer import _make_request -from typing import List,Any,Optional,Dict from SNAPI import * ###=========================活动API================================= @@ -36,6 +35,8 @@ def TranslationText(Authorization: str,text:str ,Tolang:str,FromLang:str) -> dic params = {"to":Tolang,"from":FromLang} return _make_request('POST', url, headers, params=params,request_body=text) +###==========================服务器版本========================== + def GetServerVersion() -> dict: """获取服务器版本""" url = f"{DOMAIN}/version" From f1f1dbd5fcd131f28fde4b1b0c47fe8b62753459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 07:05:21 +0000 Subject: [PATCH 8/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core/SNAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/SNAPI/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 core/SNAPI/__init__.py diff --git a/core/SNAPI/__init__.py b/core/SNAPI/__init__.py new file mode 100644 index 0000000..670c892 --- /dev/null +++ b/core/SNAPI/__init__.py @@ -0,0 +1 @@ +from . import Chat, Poll, Post,PostCategory,PostTag,Publisher,WebArticle,WebFeed,WebFeedPublic,WebReader,Sticker,CallServer,Realm,RealtimeCall From 967cea4c47a481e79c92fda0760c423de7fbcedf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E8=BE=9E?= Date: Sat, 13 Sep 2025 07:05:36 +0000 Subject: [PATCH 9/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/CallServerAPIs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/CallServerAPIs.py b/core/CallServerAPIs.py index 3da853a..3692264 100644 --- a/core/CallServerAPIs.py +++ b/core/CallServerAPIs.py @@ -3,6 +3,7 @@ from SNAPI.CallServer import _make_request from SNAPI import * ###=========================活动API================================= + def ActivityAPIs(cursor: str = '', filter: str = '', take: int = 20, debuginclude: str = '', Authorization: str = '') -> dict: """获取首页内容""" url = f"{DOMAIN}/activities" @@ -41,4 +42,4 @@ def GetServerVersion() -> dict: """获取服务器版本""" url = f"{DOMAIN}/version" headers = {'accept': 'application/json'} - return _make_request('GET', url, headers) \ No newline at end of file + return _make_request('GET', url, headers)