From f1d9a0b2f0a73b962629ddd69157a52a0a78233a Mon Sep 17 00:00:00 2001 From: firedotguy Date: Thu, 29 Jan 2026 23:39:35 +0300 Subject: [PATCH] feat: add files uploading; add banner updating --- README.md | 2 +- itd/client.py | 12 +++++++++--- itd/files.py | 5 +++++ itd/request.py | 4 ++-- itd/users.py | 4 +++- 5 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 itd/files.py diff --git a/README.md b/README.md index ac6e22f..b0fc313 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ fetch(c.token, 'метод', 'эндпоинт', {'данные': 'данные' Из методов поддерживается `get`, `post`, `put` итд, которые есть в `requests` К названию эндпоинта добавляется домен итд и `api`, то есть в этом примере отпарвится `https://xn--d1ah4a.com/api/эндпоинт`. -> [!INFO] +> [!NOTE] > `xn--d1ah4a.com` - punycode от "итд.com" ## прочее diff --git a/itd/client.py b/itd/client.py index 2be6aa1..c387dd5 100644 --- a/itd/client.py +++ b/itd/client.py @@ -8,6 +8,7 @@ from itd.notifications import get_notifications, mark_as_read, mark_all_as_read, from itd.posts import create_post, get_posts, get_post, edit_post, delete_post, pin_post, repost, view_post from itd.reports import report from itd.search import search +from itd.files import upload_file from itd.request import refresh_auth @@ -50,8 +51,8 @@ class Client: return self.get_user('me') @refresh_on_error - def update_profile(self, username: str | None = None, display_name: str | None = None, bio: str | None = None) -> dict: - return update_profile(self.token, bio, display_name, username) + def update_profile(self, username: str | None = None, display_name: str | None = None, bio: str | None = None, banner_id: str | None = None) -> dict: + return update_profile(self.token, bio, display_name, username, banner_id) @refresh_on_error def follow(self, username: str) -> dict: @@ -190,4 +191,9 @@ class Client: @refresh_on_error def search_hashtag(self, query: str, limit: int = 5): - return search(self.token, query, 0, limit) \ No newline at end of file + return search(self.token, query, 0, limit) + + + @refresh_on_error + def upload_file(self, name: str, data: bytes): + return upload_file(self.token, name, data) \ No newline at end of file diff --git a/itd/files.py b/itd/files.py new file mode 100644 index 0000000..6d4af1d --- /dev/null +++ b/itd/files.py @@ -0,0 +1,5 @@ +from itd.request import fetch + + +def upload_file(token: str, name: str, data: bytes): + return fetch(token, 'post', 'files/upload', files={'file': (name, data)}) \ No newline at end of file diff --git a/itd/request.py b/itd/request.py index 0bb463a..8138cc7 100644 --- a/itd/request.py +++ b/itd/request.py @@ -3,7 +3,7 @@ from requests import Session s = Session() -def fetch(token: str, method: str, url: str, params: dict = {}, files: list = []): +def fetch(token: str, method: str, url: str, params: dict = {}, files: dict[str, tuple[str, bytes]] = {}): base = f'https://xn--d1ah4a.com/api/{url}' headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", @@ -23,7 +23,7 @@ def fetch(token: str, method: str, url: str, params: dict = {}, files: list = [] } method = method.lower() if method == "get": - res = s.get(base, timeout=20, params=params, headers=headers) + res = s.get(base, timeout=120 if files else 20, params=params, headers=headers) else: res = s.request(method.upper(), base, timeout=20, json=params, headers=headers, files=files) diff --git a/itd/users.py b/itd/users.py index 41fd335..f7bb74f 100644 --- a/itd/users.py +++ b/itd/users.py @@ -4,7 +4,7 @@ from itd.request import fetch def get_user(token: str, username: str): return fetch(token, 'get', f'users/{username}') -def update_profile(token: str, bio: str | None = None, display_name: str | None = None, username: str | None = None): +def update_profile(token: str, bio: str | None = None, display_name: str | None = None, username: str | None = None, banner_id: str | None = None): data = {} if bio: data['bio'] = bio @@ -12,6 +12,8 @@ def update_profile(token: str, bio: str | None = None, display_name: str | None data['displayName'] = display_name if username: data['username'] = username + if banner_id: + data['bannerId'] = banner_id return fetch(token, 'put', 'users/me', data) def follow(token: str, username: str):