From 0ab41b6a888cedfffeb757c1016658def6b4457e Mon Sep 17 00:00:00 2001 From: Deepak Soni Date: Sun, 10 Mar 2024 16:51:39 +0530 Subject: [PATCH] featuring Mobile.py --- README.md | 356 +++++++++++++-------------- README_OLD.md | 625 ++++++++++++++++++++++++++++++++++++++++++++++++ ensta/Mobile.py | 2 +- setup.py | 4 +- 4 files changed, 806 insertions(+), 181 deletions(-) create mode 100644 README_OLD.md diff --git a/README.md b/README.md index 6d5d9dd..5cf9d7e 100644 --- a/README.md +++ b/README.md @@ -52,21 +52,21 @@ If you're being rate limited when using Ensta on your home network or Ensta does 3. Configure Ensta to use that proxy. See the [**Supported Actions**](https://github.com/diezo/ensta?tab=readme-ov-file#supported-actions) section.--> ## Features -Tap on the headings to view code: +These features use the **Mobile API**.
Using Proxies
-When you should use a proxy: -- You're being rate limited when using the **Guest Class**. +When to use a proxy: +- You're being rate limited. - Ensta is not working because your Home IP is flagged. - You're deploying Ensta to the cloud. (Instagram blocks requests from IPs of cloud providers, so a proxy must be used) ```python -from ensta import Host +from ensta import Mobile -host = Host( +mobile = Mobile( username, password, proxy={ @@ -84,135 +84,44 @@ Ensta uses the same proxy settings as the **requests** module. Username-Password Login
-We recommend using your email address to sign in. But if you have multiple accounts created on the same email address, you may consider using your username instead. +Username is recommended to sign in. However, email can also be used. ```python -from ensta import Host +from ensta import Mobile # Recommended -host = Host(email, password) +mobile = Mobile(username, password) # This also works -host = Host(username, password) -``` - -
- -
- -SessionData Login
- -Ensta will automatically save your login session in a file named ```ensta-session.json``` and reuse it until it expires. - -But, if you wish to load a session manually, you can use the **SessionHost Class** instead of **Host Class** by passing your session data (which is stored inside ```ensta-session.json```) as a string. - -```python -from ensta import SessionHost - -host = SessionHost(session_data) -``` - -
- -
- -2FA Login
- -**Authenticator App** - -```python -from ensta import Host - -# The key you got from Instagram when setting up your Authenticator App -key = "R65I7XTTHNHTQ2NKMQL36NCWKNUPBSDG" - -host = Host( - username, # or email - password, - totp_token=key -) -``` - -**SMS Based:** Ensta will prompt you for the OTP in the runtime. - -
- -
- -Upload Photo (Single Post)
- -```python -from ensta import Host - -host = Host(username, password) - -upload = host.upload_image("Picture.jpg") - -host.pub_photo(upload, caption="Travelling 🌆") +mobile = Mobile(email, password) ```
-Upload Multiple Medias (Single Post)
- -```python -from ensta import Host - -host = Host(username, password) - -upload1 = host.upload_image("First.jpg") -upload2 = host.upload_image("Second.jpg") -upload3 = host.upload_video_for_carousel("Video.mp4", thumbnail="Thumbnail.jpg") - -host.pub_carousel([upload1, upload2, upload3], caption="Travelling 🌆") -``` - -
- -
- -Upload Reel
+Change Profile Picture
```python -from ensta import Host - -host = Host(username, password) +from ensta import Mobile -video_id = host.upload_video_for_reel("Video.mp4", thumbnail="Thumbnail.jpg") +mobile = Mobile(username, password) -host.pub_reel( - video_id, - caption="Enjoying the winter! ⛄" -) +mobile.change_profile_picture("image.jpg") ```
-Check Username Availability
+Fetch Profile Information
```python -from ensta import Guest - -guest = Guest() - -print(guest.username_availability("theusernameiwant")) -``` - -
- -
- -Fetch Profile Data
+from ensta import Mobile -```python -from ensta import Host +mobile = Mobile(username, password) -host = Host(username, password) -profile = host.profile("leomessi") +profile = mobile.profile("leomessi") print(profile.full_name) print(profile.biography) @@ -223,183 +132,186 @@ print(profile.follower_count)
-Username to UserID, and vice versa.
+Follow/Unfollow Account
```python -from ensta import Host - -host = Host(username, password) +from ensta import Mobile -username = host.get_username(427553890) -uid = host.get_uid("leomessi") +mobile = Mobile(username, password) -print(username, uid) +mobile.follow("leomessi") +mobile.unfollow("leomessi") ```
-Follow / Unfollow Users
+Change Biography
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) +mobile = Mobile(username, password) -print(host.follow("leomessi")) -print(host.unfollow("leomessi")) +mobile.change_biography("New bio here.") ```
-Generate Followers / Followings List
+Switch to Private/Public Account
```python -from ensta import Host - -host = Host(username, password) - -followers = host.followers("leomessi", count=100) # Want full list? Set count to '0' -followings = host.followings("leomessi", count=100) # Want full list? Set count to '0' +from ensta import Mobile -for user in followers: - print(user.username) +mobile = Mobile(username, password) -for user in followings: - print(user.username) +mobile.switch_to_private_account() +mobile.switch_to_public_account() ```
-Switch Account Type - Public/Private
+Username to UserID / UserID to Username
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) +mobile = Mobile(username, password) -print(host.switch_to_public_account()) -print(host.switch_to_private_account()) +mobile.username_to_userid("leomessi") +mobile.userid_to_username("12345678") ```
-Fetch Someone's Feed
+Like/Unlike Post
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) -posts = host.posts("leomessi", 100) # Want full list? Set count to '0' +mobile = Mobile(username, password) -for post in posts: - print(post.caption_text) - print(post.like_count) +mobile.like(media_id) +mobile.unlike(media_id) ```
-Add Comment on Posts
+Fetch Followers/Followings
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) +mobile = Mobile(username, password) -post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") +followers = mobile.followers("leomessi") +followings = mobile.followings("leomessi") + +for user in followers.list: + print(user.full_name) + +for user in followings.list: + print(user.full_name) -host.comment("Looks great!", post_id) +# Fetching next chunk +followers = mobile.followers( + "leomessi", + next_cursor=followers.next_cursor +) ```
-Like/Unlike Posts
+Add Comment to Post
```python -from ensta import Host - -host = Host(username, password) +from ensta import Mobile -post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") +mobile = Mobile(username, password) -host.like(post_id) -host.unlike(post_id) +mobile.comment("Hello", media_id) ```
-Fetch Post's Likers
+Upload Photo
```python -from ensta import Host - -host = Host(username, password) +from ensta import Mobile -post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") -likers = host.likers(post_id) +mobile = Mobile(username, password) -for user in likers.users: - print(user.username) - print(user.profile_picture_url) +mobile.upload_photo( + upload_id=upload_id, + caption="Hello" +) ```
-Change Profile Picture
+Upload Sidecar (Multiple Photos)
```python from ensta import Mobile +from ensta.structures import SidecarChild mobile = Mobile(username, password) -mobile.change_profile_picture("image.jpg") +mobile.upload_sidecar( + children=[ + SidecarChild(uploda_id), + SidecarChild(uploda_id), + SidecarChild(uploda_id) + ], + caption="Hello" +) ```
-Edit Biography, Display Name
+Fetch Private Information (Yours)
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) +mobile = Mobile(username, password) + +account = mobile.private_info() -host.change_display_name("Lionel Messi") -host.change_bio("Athlete") +print(account.email) +print(account.account_type) +print(account.phone_number) ```
-Fetch Your Email, Gender, Birthday, etc.
+Update Display Name
```python -from ensta import Host +from ensta import Mobile -host = Host(username, password) -me = host.private_info() +mobile = Mobile(username, password) -print(me.email) -print(me.gender) -print(me.birthday) +mobile.update_display_name("Lionel Messi") ```
@@ -568,6 +480,94 @@ mobile.clear_bio_links()
+### Deprecated Features (Web API) + +
+ +Upload Reel
+ +```python +from ensta import Host + +host = Host(username, password) + +video_id = host.upload_video_for_reel("Video.mp4", thumbnail="Thumbnail.jpg") + +host.pub_reel( + video_id, + caption="Enjoying the winter! ⛄" +) +``` + +
+ +
+ +Check Username Availability
+ +```python +from ensta import Guest + +guest = Guest() + +print(guest.username_availability("theusernameiwant")) +``` + +
+ +
+ +Fetch Profile Data
+ +```python +from ensta import Host + +host = Host(username, password) +profile = host.profile("leomessi") + +print(profile.full_name) +print(profile.biography) +print(profile.follower_count) +``` + +
+ +
+ +Fetch Someone's Feed
+ +```python +from ensta import Host + +host = Host(username, password) +posts = host.posts("leomessi", 100) # Want full list? Set count to '0' + +for post in posts: + print(post.caption_text) + print(post.like_count) +``` + +
+ +
+ +Fetch Post's Likers
+ +```python +from ensta import Host + +host = Host(username, password) + +post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") +likers = host.likers(post_id) + +for user in likers.users: + print(user.username) + print(user.profile_picture_url) +``` + +
+ ## Supported Classes
diff --git a/README_OLD.md b/README_OLD.md new file mode 100644 index 0000000..6d5d9dd --- /dev/null +++ b/README_OLD.md @@ -0,0 +1,625 @@ +# Ensta - Simple Instagram API +[![PyPI](https://img.shields.io/pypi/v/ensta)](https://pypi.org/project/ensta) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/ensta)]() +[![Downloads](https://static.pepy.tech/badge/ensta)](https://pepy.tech/project/ensta) + + + +![Logo](https://raw.githubusercontent.com/diezo/Ensta/master/assets/image.jpg) + +Ensta is a simple, reliable and up-to-date python package for Instagram API. + +Both **authenticated** and **anonymous** requests are supported. + +[](https://buymeacoffee.com/sonii) + + + +## Installation +Read the [**Pre-Requisites**](https://github.com/diezo/Ensta/wiki/Pre%E2%80%90requisites) here. + + pip install ensta + +## Example +Fetching profile info by username: + +```python +from ensta import Host + +host = Host(username, password) + +profile = host.profile("leomessi") + +print(profile.biography) +print(profile.is_private) +print(profile.profile_picture_url_hd) +``` + + + +## Features +Tap on the headings to view code: + +
+ +Using Proxies
+ +When you should use a proxy: +- You're being rate limited when using the **Guest Class**. +- Ensta is not working because your Home IP is flagged. +- You're deploying Ensta to the cloud. (Instagram blocks requests from IPs of cloud providers, so a proxy must be used) + +```python +from ensta import Host + +host = Host( + username, + password, + proxy={ + "http": "socks5://username:password@host:port", + "https": "socks5://username:password@host:port" + } +) +``` + +Ensta uses the same proxy settings as the **requests** module. + +
+ +
+ +Username-Password Login
+ +We recommend using your email address to sign in. But if you have multiple accounts created on the same email address, you may consider using your username instead. + +```python +from ensta import Host + +# Recommended +host = Host(email, password) + +# This also works +host = Host(username, password) +``` + +
+ +
+ +SessionData Login
+ +Ensta will automatically save your login session in a file named ```ensta-session.json``` and reuse it until it expires. + +But, if you wish to load a session manually, you can use the **SessionHost Class** instead of **Host Class** by passing your session data (which is stored inside ```ensta-session.json```) as a string. + +```python +from ensta import SessionHost + +host = SessionHost(session_data) +``` + +
+ +
+ +2FA Login
+ +**Authenticator App** + +```python +from ensta import Host + +# The key you got from Instagram when setting up your Authenticator App +key = "R65I7XTTHNHTQ2NKMQL36NCWKNUPBSDG" + +host = Host( + username, # or email + password, + totp_token=key +) +``` + +**SMS Based:** Ensta will prompt you for the OTP in the runtime. + +
+ +
+ +Upload Photo (Single Post)
+ +```python +from ensta import Host + +host = Host(username, password) + +upload = host.upload_image("Picture.jpg") + +host.pub_photo(upload, caption="Travelling 🌆") +``` + +
+ +
+ +Upload Multiple Medias (Single Post)
+ +```python +from ensta import Host + +host = Host(username, password) + +upload1 = host.upload_image("First.jpg") +upload2 = host.upload_image("Second.jpg") +upload3 = host.upload_video_for_carousel("Video.mp4", thumbnail="Thumbnail.jpg") + +host.pub_carousel([upload1, upload2, upload3], caption="Travelling 🌆") +``` + +
+ +
+ +Upload Reel
+ +```python +from ensta import Host + +host = Host(username, password) + +video_id = host.upload_video_for_reel("Video.mp4", thumbnail="Thumbnail.jpg") + +host.pub_reel( + video_id, + caption="Enjoying the winter! ⛄" +) +``` + +
+ +
+ +Check Username Availability
+ +```python +from ensta import Guest + +guest = Guest() + +print(guest.username_availability("theusernameiwant")) +``` + +
+ +
+ +Fetch Profile Data
+ +```python +from ensta import Host + +host = Host(username, password) +profile = host.profile("leomessi") + +print(profile.full_name) +print(profile.biography) +print(profile.follower_count) +``` + +
+ +
+ +Username to UserID, and vice versa.
+ +```python +from ensta import Host + +host = Host(username, password) + +username = host.get_username(427553890) +uid = host.get_uid("leomessi") + +print(username, uid) +``` + +
+ +
+ +Follow / Unfollow Users
+ +```python +from ensta import Host + +host = Host(username, password) + +print(host.follow("leomessi")) +print(host.unfollow("leomessi")) +``` + +
+ +
+ +Generate Followers / Followings List
+ +```python +from ensta import Host + +host = Host(username, password) + +followers = host.followers("leomessi", count=100) # Want full list? Set count to '0' +followings = host.followings("leomessi", count=100) # Want full list? Set count to '0' + +for user in followers: + print(user.username) + +for user in followings: + print(user.username) +``` + +
+ +
+ +Switch Account Type - Public/Private
+ +```python +from ensta import Host + +host = Host(username, password) + +print(host.switch_to_public_account()) +print(host.switch_to_private_account()) +``` + +
+ +
+ +Fetch Someone's Feed
+ +```python +from ensta import Host + +host = Host(username, password) +posts = host.posts("leomessi", 100) # Want full list? Set count to '0' + +for post in posts: + print(post.caption_text) + print(post.like_count) +``` + +
+ +
+ +Add Comment on Posts
+ +```python +from ensta import Host + +host = Host(username, password) + +post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") + +host.comment("Looks great!", post_id) +``` + +
+ +
+ +Like/Unlike Posts
+ +```python +from ensta import Host + +host = Host(username, password) + +post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") + +host.like(post_id) +host.unlike(post_id) +``` + +
+ +
+ +Fetch Post's Likers
+ +```python +from ensta import Host + +host = Host(username, password) + +post_id = host.get_post_id("https://www.instagram.com/p/Czr2yLmroCQ/") +likers = host.likers(post_id) + +for user in likers.users: + print(user.username) + print(user.profile_picture_url) +``` + +
+ +
+ +Change Profile Picture
+ +```python +from ensta import Mobile + +mobile = Mobile(username, password) + +mobile.change_profile_picture("image.jpg") +``` + +
+ +
+ +Edit Biography, Display Name
+ +```python +from ensta import Host + +host = Host(username, password) + +host.change_display_name("Lionel Messi") +host.change_bio("Athlete") +``` + +
+ +
+ +Fetch Your Email, Gender, Birthday, etc.
+ +```python +from ensta import Host + +host = Host(username, password) +me = host.private_info() + +print(me.email) +print(me.gender) +print(me.birthday) +``` + +
+ +
+ +Block/Unblock User
+ +```python +from ensta import Mobile + +mobile = Mobile(username, password) + +mobile.block(123456789) # Use UserID +mobile.unblock(123456789) # Use UserID +``` + +
+ +
+ +Upload Story (Photo) + +```python +from ensta import Mobile + +mobile = Mobile(username, password) + +upload_id = mobile.get_upload_id("image.jpg") + +mobile.upload_story(upload_id) +``` + +
+ +
+ +Upload Story (Photo) + Link Sticker + +```python +from ensta import Mobile +from ensta.structures import StoryLink + +mobile = Mobile(username, password) + +upload_id = mobile.get_upload_id("image.jpg") + +mobile.upload_story(upload_id, entities=[ + StoryLink(title="Google", url="https://google.com") +]) +``` + +
+ +
+ +Send Message (Text) + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email +direct = mobile.direct() + +direct.send_text("Hello", thread_id) +``` + +
+ +
+ +Send Message (Picture) + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email +direct = mobile.direct() + +media_id = direct.fb_upload_image("image.jpg") + +direct.send_photo(media_id, thread_id) +``` + +
+ +
+ +Add Biography Link + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email + +link_id = mobile.add_bio_link( + url="https://github.com/diezo", + title="Diezo's GitHub" +) +``` + +
+ +
+ +Add Multiple Biography Links + +```python +from ensta import Mobile +from ensta.structures import BioLink + +mobile = Mobile(username, password) # Or use email + +link_ids = mobile.add_bio_links([ + BioLink(url="https://example.com", title="Link 1"), + BioLink(url="https://example.com", title="Link 2"), + BioLink(url="https://example.com", title="Link 3") +]) +``` + +
+ +
+ +Remove Biography Link + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email + +mobile.remove_bio_link(link_id) +``` + +
+ +
+ +Remove Multiple Biography Links + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email + +mobile.remove_bio_links([ + link_id_1, + link_id_2, + link_id_3 +]) +``` + +
+ +
+ +Clear All Biography Links + +```python +from ensta import Mobile + +mobile = Mobile(username, password) # Or use email + +mobile.clear_bio_links() +``` + +
+ +## Supported Classes + +
+ +
+ +Host Class (Authenticated) + +Requires login, and has many features. + +```python +from ensta import Host + +host = Host(username, password) +profile = host.profile("leomessi") + +print(profile.biography) +``` + +
+ +
+ +
+ +Guest Class (Non-Authenticated) + +Doesn't require login, but has limited features. + +```python +from ensta import Guest + +guest = Guest() +profile = guest.profile("leomessi") + +print(profile.biography) +``` + +
+ +## Discord Community +Ask questions, discuss upcoming features and meet other developers. + +[](https://discord.com/invite/pU4knSwmQe) + +## Support Me +Wish to support this project? Please consider buying me a coffee here: + +[](https://buymeacoffee.com/sonii) + +## Contributors +[![Contributors](https://contrib.rocks/image?anon=1&repo=diezo/ensta&)](https://github.com/diezo/ensta/graphs/contributors) + +## Disclaimer +This is a third party library and not associated with Instagram. We're strictly against spam. You are liable for all the actions you take. diff --git a/ensta/Mobile.py b/ensta/Mobile.py index a21f456..9da6efd 100644 --- a/ensta/Mobile.py +++ b/ensta/Mobile.py @@ -529,7 +529,7 @@ def upload_story( "Maybe you're being rate limited, try using a different account." ) - def set_biography(self, text: str) -> bool: + def change_biography(self, text: str) -> bool: """ Sets a new biography to your account :param text: New biography diff --git a/setup.py b/setup.py index 1d96447..c2e94a7 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,8 @@ from distutils.core import setup from pathlib import Path -version = "5.2.5" -long_description = (Path(__file__).parent / "README.md").read_text(encoding="utf-8") +version = "5.2.6" +long_description = (Path(__file__).parent / "README_OLD.md").read_text(encoding="utf-8") setup( name="ensta",