From d0c81565196096f5e7ce5b3f336a4c085800bc73 Mon Sep 17 00:00:00 2001 From: bot Date: Mon, 1 Sep 2025 16:39:03 +0000 Subject: [PATCH] New build. --- dist/devranta-1.1.0-py3-none-any.whl | Bin 11016 -> 12630 bytes dist/devranta-1.1.0.tar.gz | Bin 10907 -> 14145 bytes src/devranta.egg-info/PKG-INFO | 344 ++++++++++++++++++++++----- 3 files changed, 280 insertions(+), 64 deletions(-) diff --git a/dist/devranta-1.1.0-py3-none-any.whl b/dist/devranta-1.1.0-py3-none-any.whl index f8dc617f0cfe3b8807c2ef4854c5b247b611cc67..fb8355e233a642c6c227156d8d0c163cd84e626a 100644 GIT binary patch delta 11235 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 aFVuhm0LcGS0?-t=@lPNd95wSl=>Gyg#z(LK delta 9610 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 literal 10907 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 diff --git a/src/devranta.egg-info/PKG-INFO b/src/devranta.egg-info/PKG-INFO index 6317f0d..3d0f81b 100644 --- a/src/devranta.egg-info/PKG-INFO +++ b/src/devranta.egg-info/PKG-INFO @@ -12,68 +12,40 @@ Requires-Dist: aiohttp Requires-Dist: dataset # devRanta - devRanta is the best async devRant client written in Python. Authentication is only needed for half of the functionality; thus, the username and password are optional parameters when constructing the main class of this package (Api). You can find the latest packages in tar and wheel format [here](https://retoor.molodetz.nl/retoor/devranta/packages). - ## Running ``` make run ``` - ## Testing Tests are only made for methods not requireing authentication. I do not see value in mocking requests. ``` make test ``` - ## How to use Implementation: ``` -from devranta.api import Api - +from devranta.api import Api api = Api(username="optional!", password="optional!") - async def list_rants(): async for rant in api.get_rants(): print(rant["user_username"], ":", rant["text"]) ``` -See [tests](src/devranta/tests.py) for [examples](src/devranta/tests.py) on how to use. - - +See [tests](src/devranta/tests.py) for [examples](src/devranta/tests.py) on how to use. # devRant API Documentation - For people wanting to build their own client. - TODO: document responses. - ## Base URL `https://devrant.com/api` - ## Authentication - Uses `dr_token` cookie with `token_id`, `token_key`, and `user_id`. - Required for endpoints needing user authentication. - `guid`, `plat`, `sid`, `seid` included in requests for session tracking. - ## Endpoints - ### User Management -1. **Register User** - - **URL**: `/api/users` - - **Method**: POST - - **Parameters**: - - `app`: 3 (constant) - - `type`: 1 (constant) - - `email`: User email - - `username`: User username - - `password`: User password - - `guid`: Unique identifier (from `getMyGuid`) - - `plat`: 3 (constant) - - `sid`: Session start time (from `getSessionStartTime`) - - `seid`: Session event ID (from `getSessionEventId`) - - **Response**: JSON with `success`, `auth_token`, or `error` and `error_field` - - **Description**: Creates a new user account. - +1. **Registering user** + - Ommitted, you know why. 2. **Login User** - **URL**: `/api/users/auth-token` - **Method**: POST @@ -86,8 +58,26 @@ TODO: document responses. - `sid`: Session start time - `seid`: Session event ID - **Response**: JSON with `success`, `auth_token`, or `error` + - **Success Example**: + ```json + { + "success": true, + "auth_token": { + "id": 18966518, + "key": "z6uXRZrQ_Ekx59wfYEjpbnS!fDeVznVqmmKujhT8", + "expire_time": 1756765587, + "user_id": 18959632 + } + } + ``` + - **Error Example**: + ```json + { + "success": false, + "error": "Invalid login credentials entered. Please try again." + } + ``` - **Description**: Authenticates user and returns auth token. - 3. **Edit Profile** - **URL**: `/api/users/me/edit-profile` - **Method**: POST @@ -103,8 +93,13 @@ TODO: document responses. - `profile_website`: User website - `profile_github`: GitHub username - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Updates user profile information. - 4. **Forgot Password** - **URL**: `/api/users/forgot-password` - **Method**: POST @@ -113,8 +108,13 @@ TODO: document responses. - `username`: User username - `guid`, `plat`, `sid`, `seid` - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Initiates password reset process. - 5. **Resend Confirmation Email** - **URL**: `/api/users/me/resend-confirm` - **Method**: POST @@ -122,8 +122,13 @@ TODO: document responses. - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Resends account confirmation email. - 6. **Delete Account** - **URL**: `/api/users/me` - **Method**: DELETE @@ -132,7 +137,6 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - **Response**: JSON with `success` - **Description**: Deletes user account. - 7. **Mark News as Read** - **URL**: `/api/users/me/mark-news-read` - **Method**: POST @@ -141,8 +145,13 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `news_id`: News item ID - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Marks a news item as read for logged-in users. - ### Rants 1. **Get Rant** - **URL**: `/api/devrant/rants/{rant_id}` @@ -152,9 +161,45 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `last_comment_id`: 999999999999 (optional) - `links`: 0 (optional) - - **Response**: JSON with `rant` (text, tags) + - **Response**: JSON with `rant` (text, tags), `comments`, `success`, `subscribed` + - **Success Example**: + ```json + { + "rant": { + "id": 18960811, + "text": "You know, I'm getting tired of this HR-speak in job applications, specifically this:\n\n- [tech] has no secrets for you\n\nWhat, really? So I am the undisputed and absolute expert of - let's say - JavaScript? Do you know how long it takes to master that so that it holds no secrets? It even holds secrets to decade-long experts! The same goes for most other technologies in software development.\n\nSigh. Hhhhh. Ree.", + "score": 3, + "created_time": 1754065322, + "attached_image": "", + "num_comments": 10, + "tags": [ + "too-much", + "qualifications", + "job-hunting" + ], + "vote_state": 0, + "edited": false, + "link": "rants/18960811/you-know-im-getting-tired-of-this-hr-speak-in-job-applications-specifically-this", + "rt": 1, + "rc": 1, + "user_id": 1366654, + "user_username": "CaptainRant", + "user_score": 4179, + "user_avatar": { + "b": "2a8b9d", + "i": "v-37_c-3_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.jpg" + }, + "user_avatar_lg": { + "b": "2a8b9d", + "i": "v-37_c-1_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.png" + } + }, + "comments": [], + "success": true, + "subscribed": 0 + } + ``` - **Description**: Retrieves a specific rant by ID. - 2. **Post Rant** - **URL**: `/api/devrant/rants` - **Method**: POST @@ -166,8 +211,14 @@ TODO: document responses. - `type`: Rant type ID - `image`: Optional image file (img/gif) - **Response**: JSON with `success`, `rant_id`, or `error` + - **Error Example**: + ```json + { + "success": false, + "error": "It looks like you just posted this same rant! Your connection might have timed out while posting so you might have seen an error, but sometimes the rant still gets posted and in this case it seems it did, so please check :) If this was not the case please contact info@devrant.io. Thanks!" + } + ``` - **Description**: Creates a new rant. - 3. **Edit Rant** - **URL**: `/api/devrant/rants/{rant_id}` - **Method**: POST @@ -178,17 +229,29 @@ TODO: document responses. - `token_id`, `token_key`, `user_id` - `image`: Optional image file - **Response**: JSON with `success` or `fail_reason` + - **Error Example**: + ```json + { + "success": false, + "fail_reason": "" + } + ``` - **Description**: Updates an existing rant. - 4. **Delete Rant** - **URL**: `/api/devrant/rants/{rant_id}` - **Method**: DELETE - **Parameters**: - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - - **Response**: JSON with `success` + - **Response**: JSON with `success` or `error` + - **Error Example**: + ```json + { + "success": false, + "error": "An unknown error occurred and this rant can't be deleted. Please contact support@devrant.com for help with this." + } + ``` - **Description**: Deletes a rant. - 5. **Vote on Rant** - **URL**: `/api/devrant/rants/{rant_id}/vote` - **Method**: POST @@ -197,9 +260,43 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `vote`: 1 (upvote), -1 (downvote), 0 (remove vote) - `reason`: Downvote reason ID (required for downvote) - - **Response**: JSON with `success` or `confirmed` (false if unverified) + - **Response**: JSON with `success`, `rant`, or `confirmed` (false if unverified) + - **Success Example**: + ```json + { + "success": true, + "rant": { + "id": 18960811, + "text": "You know, I'm getting tired of this HR-speak in job applications, specifically this:\n\n- [tech] has no secrets for you\n\nWhat, really? So I am the undisputed and absolute expert of - let's say - JavaScript? Do you know how long it takes to master that so that it holds no secrets? It even holds secrets to decade-long experts! The same goes for most other technologies in software development.\n\nSigh. Hhhhh. Ree.", + "score": 3, + "created_time": 1754065322, + "attached_image": "", + "num_comments": 10, + "tags": [ + "rant", + "too-much", + "qualifications", + "job-hunting" + ], + "vote_state": -1, + "edited": false, + "rt": 1, + "rc": 1, + "user_id": 1366654, + "user_username": "CaptainRant", + "user_score": 4180, + "user_avatar": { + "b": "2a8b9d", + "i": "v-37_c-3_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.jpg" + }, + "user_avatar_lg": { + "b": "2a8b9d", + "i": "v-37_c-1_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.png" + } + } + } + ``` - **Description**: Votes on a rant. - 6. **Favorite/Unfavorite Rant** - **URL**: `/api/devrant/rants/{rant_id}/{favorite|unfavorite}` - **Method**: POST @@ -207,8 +304,13 @@ TODO: document responses. - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Favorites or unfavorites a rant. - 7. **Get Rant Feed** - **URL**: `/api/devrant/rants` - **Method**: GET @@ -216,9 +318,66 @@ TODO: document responses. - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `ids`: JSON string of IDs (optional) - - **Response**: JSON with `success`, `num_notifs` + - **Response**: JSON with `success`, `rants`, `settings`, `set`, `wrw`, `dpp`, `num_notifs`, `unread`, `news` + - **Success Example**: + ```json + { + "success": true, + "rants": [ + { + "id": 18960811, + "text": "You know, I'm getting tired of this HR-speak in job applications, specifically this:\n\n- [tech] has no secrets for you\n\nWhat, really? So I am the undisputed and absolute expert of - let's say - JavaScript? Do you know how long it takes to master that so that it holds no secrets? It even holds secrets to decade-long experts! The same goes for most other technologies in software development.\n\nSigh. Hhhhh. Ree.", + "score": 3, + "created_time": 1754065322, + "attached_image": "", + "num_comments": 9, + "tags": [ + "rant", + "too-much", + "qualifications", + "job-hunting" + ], + "vote_state": 0, + "edited": false, + "rt": 1, + "rc": 1, + "user_id": 1366654, + "user_username": "CaptainRant", + "user_score": 4179, + "user_avatar": { + "b": "2a8b9d", + "i": "v-37_c-3_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.jpg" + }, + "user_avatar_lg": { + "b": "2a8b9d", + "i": "v-37_c-1_b-4_g-m_9-1_1-2_16-6_3-1_8-1_7-1_5-2_12-2_6-3_10-1_2-10_22-2_11-2_18-1_19-3_4-2_20-1_21-2.png" + } + } + // ... more rants + ], + "settings": { + "notif_state": -1, + "notif_token": "" + }, + "set": "688e90b7cf77f", + "wrw": 385, + "dpp": 0, + "num_notifs": 0, + "unread": { + "total": 0 + }, + "news": { + "id": 356, + "type": "intlink", + "headline": "Weekly Group Rant", + "body": "Tips for staying productive?", + "footer": "Add tag 'wk247' to your rant", + "height": 100, + "action": "grouprant" + } + } + ``` - **Description**: Retrieves rant feed with notification count. - ### Comments 1. **Get Comment** - **URL**: `/api/comments/{comment_id}` @@ -227,9 +386,15 @@ TODO: document responses. - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `links`: 0 (optional) - - **Response**: JSON with `comment` (body) + - **Response**: JSON with `comment` (body), or `error` + - **Error Example**: + ```json + { + "success": false, + "error": "Invalid comment specified in path." + } + ``` - **Description**: Retrieves a specific comment by ID. - 2. **Post Comment** - **URL**: `/api/devrant/rants/{rant_id}/comments` - **Method**: POST @@ -239,8 +404,13 @@ TODO: document responses. - `token_id`, `token_key`, `user_id` - `image`: Optional image file (img/gif) - **Response**: JSON with `success` or `confirmed` (false if unverified) + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Posts a comment on a rant. - 3. **Edit Comment** - **URL**: `/api/comments/{comment_id}` - **Method**: POST @@ -249,17 +419,29 @@ TODO: document responses. - `comment`: Comment text - `token_id`, `token_key`, `user_id` - **Response**: JSON with `success` or `fail_reason` + - **Error Example**: + ```json + { + "success": false, + "error": "Invalid comment specified in path." + } + ``` - **Description**: Updates an existing comment. - 4. **Delete Comment** - **URL**: `/api/comments/{comment_id}` - **Method**: DELETE - **Parameters**: - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - - **Response**: JSON with `success` + - **Response**: JSON with `success` or `error` + - **Error Example**: + ```json + { + "success": false, + "error": "Invalid comment specified in path." + } + ``` - **Description**: Deletes a comment. - 5. **Vote on Comment** - **URL**: `/api/comments/{comment_id}/vote` - **Method**: POST @@ -268,9 +450,15 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `vote`: 1 (upvote), -1 (downvote), 0 (remove vote) - `reason`: Downvote reason ID (required for downvote) - - **Response**: JSON with `success` or `confirmed` (false if unverified) + - **Response**: JSON with `success` or `error` + - **Error Example**: + ```json + { + "success": false, + "error": "Invalid comment specified in path." + } + ``` - **Description**: Votes on a comment. - ### Notifications 1. **Get Notification Feed** - **URL**: `/api/users/me/notif-feed` @@ -280,9 +468,28 @@ TODO: document responses. - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - `ext_prof`: 1 (optional) - `last_time`: Last notification check time - - **Response**: JSON with `success`, `data` (items, check_time, username_map) + - **Response**: JSON with `success`, `data` (items, check_time, username_map, unread, num_unread) + - **Success Example**: + ```json + { + "success": true, + "data": { + "items": [], + "check_time": 1754173634, + "username_map": [], + "unread": { + "all": 0, + "upvotes": 0, + "mentions": 0, + "comments": 0, + "subs": 0, + "total": 0 + }, + "num_unread": 0 + } + } + ``` - **Description**: Retrieves user notifications. - 2. **Clear Notifications** - **URL**: `/api/users/me/notif-feed` - **Method**: DELETE @@ -290,9 +497,14 @@ TODO: document responses. - `app`: 3 - `token_id`, `token_key`, `user_id`, `guid`, `plat`, `sid`, `seid` - **Response**: JSON with `success` + - **Success Example**: + ```json + { + "success": true + } + ``` - **Description**: Clears user notifications. - -## External API +### External API - **Beta List Signup** - **URL**: `https://www.hexicallabs.com/api/beta-list` - **Method**: GET (JSONP) @@ -300,8 +512,14 @@ TODO: document responses. - `email`: User email - `platform`: Platform name - `app`: 3 + - **Response**: JSON with `error` + - **Error Example**: + ```json + { + "error": "Expecting value: line 1 column 1 (char 0)" + } + ``` - **Description**: Signs up user for beta list (external service). - ## Notes - All endpoints expect `app=3` for identification. - Authenticated endpoints require `dr_token` cookie with `token_id`, `token_key`, `user_id`. @@ -310,5 +528,3 @@ TODO: document responses. - Downvotes require a reason ID, prompting a modal if not provided. - Responses typically include `success` boolean; errors include `error` or `fail_reason`. - Cookies (`dr_token`, `dr_guid`, `dr_session_start`, `dr_event_id`, `dr_feed_sort`, `dr_theme`, `dr_rants_viewed`, `dr_stickers_seen`, `rant_type_filters`, `news_seen`) manage state and preferences. - -