Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2016
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.84 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import requests
  4. import random
  5. import json
  6. import hashlib
  7. import hmac
  8. import urllib
  9. import uuid
  10. import time
  11.  
  12.  
  13. try:
  14. # python 2
  15. urllib_quote_plus = urllib.quote
  16. except:
  17. # python 3
  18. urllib_quote_plus = urllib.parse.quote_plus
  19.  
  20. from requests_toolbelt.multipart.encoder import MultipartEncoder
  21.  
  22.  
  23.  
  24.  
  25. class InstagramAPI:
  26. API_URL = 'https://i.instagram.com/api/v1/'
  27. USER_AGENT = 'Instagram 9.2.0 Android (18/4.3; 320dpi; 720x1280; Xiaomi; HM 1SW; armani; qcom; en_US)'
  28. IG_SIG_KEY = '012a54f51c49aa8c5c322416ab1410909add32c966bbaa0fe3dc58ac43fd7ede'
  29. EXPERIMENTS = 'ig_android_progressive_jpeg,ig_creation_growth_holdout,ig_android_report_and_hide,ig_android_new_browser,ig_android_enable_share_to_whatsapp,ig_android_direct_drawing_in_quick_cam_universe,ig_android_huawei_app_badging,ig_android_universe_video_production,ig_android_asus_app_badging,ig_android_direct_plus_button,ig_android_ads_heatmap_overlay_universe,ig_android_http_stack_experiment_2016,ig_android_infinite_scrolling,ig_fbns_blocked,ig_android_white_out_universe,ig_android_full_people_card_in_user_list,ig_android_post_auto_retry_v7_21,ig_fbns_push,ig_android_feed_pill,ig_android_profile_link_iab,ig_explore_v3_us_holdout,ig_android_histogram_reporter,ig_android_anrwatchdog,ig_android_search_client_matching,ig_android_high_res_upload_2,ig_android_new_browser_pre_kitkat,ig_android_2fac,ig_android_grid_video_icon,ig_android_white_camera_universe,ig_android_disable_chroma_subsampling,ig_android_share_spinner,ig_android_explore_people_feed_icon,ig_explore_v3_android_universe,ig_android_media_favorites,ig_android_nux_holdout,ig_android_search_null_state,ig_android_react_native_notification_setting,ig_android_ads_indicator_change_universe,ig_android_video_loading_behavior,ig_android_black_camera_tab,liger_instagram_android_univ,ig_explore_v3_internal,ig_android_direct_emoji_picker,ig_android_prefetch_explore_delay_time,ig_android_business_insights_qe,ig_android_direct_media_size,ig_android_enable_client_share,ig_android_promoted_posts,ig_android_app_badging_holdout,ig_android_ads_cta_universe,ig_android_mini_inbox_2,ig_android_feed_reshare_button_nux,ig_android_boomerang_feed_attribution,ig_android_fbinvite_qe,ig_fbns_shared,ig_android_direct_full_width_media,ig_android_hscroll_profile_chaining,ig_android_feed_unit_footer,ig_android_media_tighten_space,ig_android_private_follow_request,ig_android_inline_gallery_backoff_hours_universe,ig_android_direct_thread_ui_rewrite,ig_android_rendering_controls,ig_android_ads_full_width_cta_universe,ig_video_max_duration_qe_preuniverse,ig_android_prefetch_explore_expire_time,ig_timestamp_public_test,ig_android_profile,ig_android_dv2_consistent_http_realtime_response,ig_android_enable_share_to_messenger,ig_explore_v3,ig_ranking_following,ig_android_pending_request_search_bar,ig_android_feed_ufi_redesign,ig_android_video_pause_logging_fix,ig_android_default_folder_to_camera,ig_android_video_stitching_7_23,ig_android_profanity_filter,ig_android_business_profile_qe,ig_android_search,ig_android_boomerang_entry,ig_android_inline_gallery_universe,ig_android_ads_overlay_design_universe,ig_android_options_app_invite,ig_android_view_count_decouple_likes_universe,ig_android_periodic_analytics_upload_v2,ig_android_feed_unit_hscroll_auto_advance,ig_peek_profile_photo_universe,ig_android_ads_holdout_universe,ig_android_prefetch_explore,ig_android_direct_bubble_icon,ig_video_use_sve_universe,ig_android_inline_gallery_no_backoff_on_launch_universe,ig_android_image_cache_multi_queue,ig_android_camera_nux,ig_android_immersive_viewer,ig_android_dense_feed_unit_cards,ig_android_sqlite_dev,ig_android_exoplayer,ig_android_add_to_last_post,ig_android_direct_public_threads,ig_android_prefetch_venue_in_composer,ig_android_bigger_share_button,ig_android_dv2_realtime_private_share,ig_android_non_square_first,ig_android_video_interleaved_v2,ig_android_follow_search_bar,ig_android_last_edits,ig_android_video_download_logging,ig_android_ads_loop_count_universe,ig_android_swipeable_filters_blacklist,ig_android_boomerang_layout_white_out_universe,ig_android_ads_carousel_multi_row_universe,ig_android_mentions_invite_v2,ig_android_direct_mention_qe,ig_android_following_follower_social_context'
  30. SIG_KEY_VERSION = '4'
  31. def __init__(self, username, password, debug = False, IGDataPath = None):
  32. m = hashlib.md5()
  33. m.update(username.encode('utf-8') + password.encode('utf-8'))
  34. self.device_id = self.generateDeviceId(m.hexdigest())
  35. self.setUser(username, password)
  36. self.isLoggedIn = False
  37. self.LastResponse = None
  38.  
  39. def setUser(self, username, password):
  40. self.username = username
  41. self.password = password
  42. self.uuid = self.generateUUID(True)
  43.  
  44. def login(self, force = False):
  45. if (not self.isLoggedIn or force):
  46. self.s = requests.Session()
  47. headers = {
  48. 'Connection':'close',
  49. 'Accept':'*/*',
  50. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  51. 'Cookie2': '$Version=1',
  52. 'Accept-Language':'en-US',
  53. 'User-Agent':self.USER_AGENT
  54. }
  55. # self.s.headers.update ({'Content-type' : 'application/x-www-form-urlencoded; charset=UTF-8'})
  56. if (self.SendRequest('si/fetch_headers/?challenge_type=signup&guid=' + self.generateUUID(False),headers, None, True)):
  57.  
  58. data = {'phone_id' : self.generateUUID(True),
  59. '_csrftoken' : self.LastResponse.cookies['csrftoken'],
  60. 'username' : self.username,
  61. 'guid' : self.uuid,
  62. 'device_id' : self.device_id,
  63. 'password' : self.password,
  64. 'login_attempt_count' : '0'}
  65.  
  66. if (self.SendRequest('accounts/login/', headers, self.generateSignature(json.dumps(data)), True)):
  67. print self.LastResponse.text
  68. self.isLoggedIn = True
  69. self.username_id = self.LastJson["logged_in_user"]["pk"]
  70. self.rank_token = "%s_%s" % (self.username_id, self.uuid)
  71. self.token = self.LastResponse.cookies["csrftoken"]
  72. print ("Login success!\n")
  73. return True;
  74. else:
  75. print self.LastResponse.text
  76.  
  77. def upload_images(self):
  78. import base64
  79. import mimetypes
  80. filename = 'small.jpg'
  81. headers = {
  82. 'Connection':'close',
  83. 'Accept':'*/*',
  84. 'Accept-Language':'en-US',
  85. 'User-Agent':self.USER_AGENT,
  86. 'x-ig_connection-type':'WIFI',
  87. 'x-ig-capabilities':'3R4=',
  88. 'Cookie2':'$Version=1'
  89. }
  90.  
  91.  
  92. files = {
  93. '_csrftoken':self.LastResponse.cookies['csrftoken'],
  94. '__uid':self.device_id,
  95. 'photo': open('small.jpg', 'rb')}
  96. make_post_requests = self.s.post('https://i.instagram.com/api/v1/upload/photo/',data=data,files=files,headers=headers)
  97. print make_post_requests
  98.  
  99. def comment(self):
  100. headers = {
  101. 'Connection':'close',
  102. 'Accept':'*/*',
  103. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  104. 'Cookie2': '$Version=1',
  105. 'Accept-Language':'en-US',
  106. 'User-Agent':self.USER_AGENT
  107. }
  108. data = {'_csrftoken':self.LastResponse.cookies['csrftoken'],
  109. 'guid':self.uuid,
  110. 'device_id':self.device_id,
  111. 'comment_text':'test'}
  112. return self.SendRequest('media/1343078636324701362_3939745285/comment/',headers, self.generateSignature(json.dumps(data)))
  113.  
  114.  
  115. def generateSignature(self, data):
  116. return 'ig_sig_key_version=' + self.SIG_KEY_VERSION + '&signed_body=' + hmac.new(self.IG_SIG_KEY.encode('utf-8'), data.encode('utf-8'), hashlib.sha256).hexdigest() + '.' + urllib_quote_plus(data)
  117.  
  118. def generateDeviceId(self, seed):
  119. volatile_seed = "12345"
  120. m = hashlib.md5()
  121. m.update(seed.encode('utf-8') + volatile_seed.encode('utf-8'))
  122. return 'android-' + m.hexdigest()[:16]
  123.  
  124. def generateUUID(self, type):
  125. generated_uuid = str(uuid.uuid4())
  126. if (type):
  127. return generated_uuid
  128. else:
  129. return generated_uuid.replace('-', '')
  130.  
  131. def buildBody(bodies, boundary):
  132. # TODO Instagram.php 1620-1645
  133. return False
  134.  
  135. def SendRequest(self, endpoint, headers_d=None, post = None, login = False):
  136. if (not self.isLoggedIn and not login):
  137. raise Exception("Not logged in!\n")
  138. return;
  139.  
  140. # self.s.headers.update ({'Connection' : 'close',
  141. # 'Accept' : '*/*',
  142. # 'Content-type' : 'application/x-www-form-urlencoded; charset=UTF-8',
  143. # 'Cookie2' : '$Version=1',
  144. # 'Accept-Language' : 'en-US',
  145. # 'User-Agent' : self.USER_AGENT})
  146. if (post != None): # POST
  147. response = self.s.post(self.API_URL + endpoint, headers=headers_d, data=post) # , verify=False
  148. else: # GET
  149. response = self.s.get(self.API_URL + endpoint) # , verify=False
  150.  
  151. if response.status_code == 200:
  152. self.LastResponse = response
  153. self.LastJson = json.loads(response.text)
  154. return True
  155. else:
  156. print ("Request return " + str(response.status_code) + " error!")
  157. # for debugging
  158. try:
  159. self.LastResponse = response
  160. self.LastJson = json.loads(response.text)
  161. except:
  162. pass
  163. return False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement