Skip to content

Commit c9f40e0

Browse files
committed
Add instagrapi library
subzeroid/instagrapi#2003
1 parent 95431a9 commit c9f40e0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+15353
-0
lines changed

.python-version

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.13

instagrapi/__init__.py

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import logging
2+
from urllib.parse import urlparse
3+
4+
import urllib3
5+
from urllib3.exceptions import InsecureRequestWarning
6+
7+
from instagrapi.mixins.account import AccountMixin
8+
from instagrapi.mixins.album import DownloadAlbumMixin, UploadAlbumMixin
9+
from instagrapi.mixins.auth import LoginMixin
10+
from instagrapi.mixins.bloks import BloksMixin
11+
from instagrapi.mixins.challenge import ChallengeResolveMixin
12+
from instagrapi.mixins.clip import DownloadClipMixin, UploadClipMixin
13+
from instagrapi.mixins.collection import CollectionMixin
14+
from instagrapi.mixins.comment import CommentMixin
15+
from instagrapi.mixins.direct import DirectMixin
16+
from instagrapi.mixins.explore import ExploreMixin
17+
from instagrapi.mixins.fbsearch import FbSearchMixin
18+
from instagrapi.mixins.fundraiser import FundraiserMixin
19+
from instagrapi.mixins.hashtag import HashtagMixin
20+
from instagrapi.mixins.highlight import HighlightMixin
21+
from instagrapi.mixins.igtv import DownloadIGTVMixin, UploadIGTVMixin
22+
from instagrapi.mixins.insights import InsightsMixin
23+
from instagrapi.mixins.location import LocationMixin
24+
from instagrapi.mixins.media import MediaMixin
25+
from instagrapi.mixins.multiple_accounts import MultipleAccountsMixin
26+
from instagrapi.mixins.note import NoteMixin
27+
from instagrapi.mixins.notification import NotificationMixin
28+
from instagrapi.mixins.password import PasswordMixin
29+
from instagrapi.mixins.photo import DownloadPhotoMixin, UploadPhotoMixin
30+
from instagrapi.mixins.private import PrivateRequestMixin
31+
from instagrapi.mixins.public import (
32+
ProfilePublicMixin,
33+
PublicRequestMixin,
34+
TopSearchesPublicMixin,
35+
)
36+
from instagrapi.mixins.share import ShareMixin
37+
from instagrapi.mixins.signup import SignUpMixin
38+
from instagrapi.mixins.story import StoryMixin
39+
from instagrapi.mixins.timeline import ReelsMixin
40+
from instagrapi.mixins.totp import TOTPMixin
41+
from instagrapi.mixins.track import TrackMixin
42+
from instagrapi.mixins.user import UserMixin
43+
from instagrapi.mixins.video import DownloadVideoMixin, UploadVideoMixin
44+
45+
urllib3.disable_warnings(InsecureRequestWarning)
46+
47+
# Used as fallback logger if another is not provided.
48+
DEFAULT_LOGGER = logging.getLogger("instagrapi")
49+
50+
51+
class Client(
52+
PublicRequestMixin,
53+
ChallengeResolveMixin,
54+
PrivateRequestMixin,
55+
TopSearchesPublicMixin,
56+
ProfilePublicMixin,
57+
LoginMixin,
58+
ShareMixin,
59+
TrackMixin,
60+
FbSearchMixin,
61+
HighlightMixin,
62+
DownloadPhotoMixin,
63+
UploadPhotoMixin,
64+
DownloadVideoMixin,
65+
UploadVideoMixin,
66+
DownloadAlbumMixin,
67+
NotificationMixin,
68+
UploadAlbumMixin,
69+
DownloadIGTVMixin,
70+
UploadIGTVMixin,
71+
MediaMixin,
72+
UserMixin,
73+
InsightsMixin,
74+
CollectionMixin,
75+
AccountMixin,
76+
DirectMixin,
77+
LocationMixin,
78+
HashtagMixin,
79+
CommentMixin,
80+
StoryMixin,
81+
PasswordMixin,
82+
SignUpMixin,
83+
DownloadClipMixin,
84+
UploadClipMixin,
85+
ReelsMixin,
86+
ExploreMixin,
87+
BloksMixin,
88+
TOTPMixin,
89+
MultipleAccountsMixin,
90+
NoteMixin,
91+
FundraiserMixin,
92+
):
93+
proxy = None
94+
95+
def __init__(
96+
self,
97+
settings: dict = {},
98+
proxy: str = None,
99+
delay_range: list = None,
100+
logger=DEFAULT_LOGGER,
101+
**kwargs,
102+
):
103+
104+
super().__init__(**kwargs)
105+
106+
self.settings = settings
107+
self.logger = logger
108+
self.delay_range = delay_range
109+
110+
self.set_proxy(proxy)
111+
112+
self.init()
113+
114+
def set_proxy(self, dsn: str):
115+
if dsn:
116+
assert isinstance(
117+
dsn, str
118+
), f'Proxy must been string (URL), but now "{dsn}" ({type(dsn)})'
119+
self.proxy = dsn
120+
proxy_href = "{scheme}{href}".format(
121+
scheme="http://" if not urlparse(self.proxy).scheme else "",
122+
href=self.proxy,
123+
)
124+
self.public.proxies = self.private.proxies = {
125+
"http": proxy_href,
126+
"https": proxy_href,
127+
}
128+
return True
129+
self.public.proxies = self.private.proxies = {}
130+
return False

instagrapi/config.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
API_DOMAIN = "i.instagram.com"
2+
3+
# Instagram 134.0.0.26.121
4+
# Android (26/8.0.0;
5+
# 480dpi; 1080x1920; Xiaomi;
6+
# MI 5s; capricorn; qcom; en_US; 205280538)
7+
USER_AGENT_BASE = (
8+
"Instagram {app_version} "
9+
"Android ({android_version}/{android_release}; "
10+
"{dpi}; {resolution}; {manufacturer}; "
11+
"{model}; {device}; {cpu}; {locale}; {version_code})"
12+
)
13+
# Instagram 76.0.0.15.395 (iPhone9,2; iOS 10_0_2; en_US; en-US; scale=2.61; 1080x1920) AppleWebKit/420+
14+
# Instagram 208.0.0.32.135 (iPhone; iOS 14_7_1; en_US; en-US; scale=2.61; 1080x1920) AppleWebKit/605.1.15
15+
16+
SOFTWARE = (
17+
"{model}-user+{android_release}+OPR1.170623.032+V10.2.3.0.OAGMIXM+release-keys"
18+
)
19+
20+
# QUERY_HASH_PROFILE = 'c9100bf9110dd6361671f113dd02e7d6'
21+
# QUERY_HASH_MEDIAS = '42323d64886122307be10013ad2dcc44'
22+
# QUERY_HASH_IGTVS = 'bc78b344a68ed16dd5d7f264681c4c76'
23+
# QUERY_HASH_STORIES = '5ec1d322b38839230f8e256e1f638d5f'
24+
# QUERY_HASH_HIGHLIGHTS_FOLDERS = 'ad99dd9d3646cc3c0dda65debcd266a7'
25+
# QUERY_HASH_HIGHLIGHTS_STORIES = '5ec1d322b38839230f8e256e1f638d5f'
26+
# QUERY_HASH_FOLLOWERS = 'c76146de99bb02f6415203be841dd25a'
27+
# QUERY_HASH_FOLLOWINGS = 'd04b0a864b4b54837c0d870b0e77e076'
28+
# QUERY_HASH_HASHTAG = '174a5243287c5f3a7de741089750ab3b'
29+
# QUERY_HASH_COMMENTS = '33ba35852cb50da46f5b5e889df7d159'
30+
# QUERY_HASH_TAGGED_MEDIAS = 'be13233562af2d229b008d2976b998b5'
31+
32+
LOGIN_EXPERIMENTS = "ig_android_reg_nux_headers_cleanup_universe,ig_android_device_detection_info_upload,ig_android_nux_add_email_device,ig_android_gmail_oauth_in_reg,ig_android_device_info_foreground_reporting,ig_android_device_verification_fb_signup,ig_android_direct_main_tab_universe_v2,ig_android_passwordless_account_password_creation_universe,ig_android_direct_add_direct_to_android_native_photo_share_sheet,ig_growth_android_profile_pic_prefill_with_fb_pic_2,ig_account_identity_logged_out_signals_global_holdout_universe,ig_android_quickcapture_keep_screen_on,ig_android_device_based_country_verification,ig_android_login_identifier_fuzzy_match,ig_android_reg_modularization_universe,ig_android_security_intent_switchoff,ig_android_device_verification_separate_endpoint,ig_android_suma_landing_page,ig_android_sim_info_upload,ig_android_smartlock_hints_universe,ig_android_fb_account_linking_sampling_freq_universe,ig_android_retry_create_account_universe,ig_android_caption_typeahead_fix_on_o_universe"
33+
34+
SUPPORTED_CAPABILITIES = [
35+
{
36+
"value": "119.0,120.0,121.0,122.0,123.0,124.0,125.0,126.0,127.0,128.0,129.0,130.0,131.0,132.0,133.0,134.0,135.0,136.0,137.0,138.0,139.0,140.0,141.0,142.0",
37+
"name": "SUPPORTED_SDK_VERSIONS",
38+
},
39+
{"value": "14", "name": "FACE_TRACKER_VERSION"},
40+
{"value": "ETC2_COMPRESSION", "name": "COMPRESSION"},
41+
{"value": "gyroscope_enabled", "name": "gyroscope"},
42+
]

0 commit comments

Comments
 (0)