Exemplo n.º 1
0
class InstaBotLikeFeeds:
    url = "https://www.instagram.com/"
    url_login = "******"
    url_logout = "https://www.instagram.com/accounts/logout/"
    url_media = "https://www.instagram.com/p/%s/"
    url_likes = "https://www.instagram.com/web/likes/%s/like/"
    
    def __init__(self, config=None, **kwargs):
        self.config = config
        self.user_login = self.config.get("login").lower()
        self.user_password = self.config.get("password")
        self.persistence = PersistenceManager(self.config.get("database"))
        self.session_file = self.config.get("session_file")
        
        self.s = requests.Session()
        self.c = requests.Session()
        
        self.proxies = self.config.get('proxies')
        if self.proxies:
            self.s.proxies.update(self.proxies)
            self.s.proxies.update(self.proxies)
        
#         to do: check what is user agent
        self.user_agent = random.sample(self.config.get("list_of_ua"), 1)[0]
        self.login()
    
            
    def login(self):
        successfulLogin = False
        self.s.headers.update(
            {
                "Accept": "*/*",
                "Accept-Language": self.config.get("accept_language"),
                "Accept-Encoding": "gzip, deflate, br",
                "Connection": "keep-alive",
                "Host": "www.instagram.com",
                "Origin": "https://www.instagram.com",
                "Referer": "https://www.instagram.com/",
                "User-Agent": self.user_agent,
                "X-Instagram-AJAX": "1",
                "Content-Type": "application/x-www-form-urlencoded",
                "X-Requested-With": "XMLHttpRequest",
            }
        )
        
        if self.session_file and os.path.isfile(self.session_file):
            successfulLogin = True
            with open(self.session_file, "rb") as i:
                self.s.cookies.update(pickle.load(i))
        else:
            login_post = {
                "username": self.user_login,
                "password": self.user_password
            }
            r = self.s.get(self.url)
            csrf_token = re.search('(?<="csrf_token":")\w+', r.text).group(0)
            self.s.headers.update({"X-CSRFToken": csrf_token})
            time.sleep(5 * random.random())
            
            login = self.s.post(self.url_login, data=login_post, allow_redirects=True)
            if login.status_code not in (200, 400):
                print('Exception occured while login {login}', login.json())
                return 
            
            loginResponse = login.json()

            # update csrftoken
            try:
                self.csrftoken = login.cookies["csrftoken"]
                self.s.headers.update({"X-CSRFToken": self.csrftoken})    
            except Exception as exc:
                print('Exception occured while getting csrftoken {exc}', exc)
              
            
            if loginResponse.get("errors"):
                print('Error occured while login {error}', loginResponse["errors"]["error"])
            elif loginResponse.get("message") == "checkpoint_required":
                try:
                    if "instagram.com" in loginResponse["checkpoint_url"]:
                        challenge_url = loginResponse["checkpoint_url"]
                    else:
                        challenge_url = f"https://instagram.com{loginResponse['checkpoint_url']}"
                        with self.s as clg:
                            clg.headers.update(
                                {
                                    "Accept": "*/*",
                                    "Accept-Language": self.config.get("accept_language"),
                                    "Accept-Encoding": "gzip, deflate, br",
                                    "Connection": "keep-alive",
                                    "Host": "www.instagram.com",
                                    "Origin": "https://www.instagram.com",
                                    "User-Agent": self.user_agent,
                                    "X-Instagram-AJAX": "1",
                                    "Content-Type": "application/x-www-form-urlencoded",
                                    "x-requested-with": "XMLHttpRequest",
                                }
                            )
                            # Get challenge page
                            challenge_request_explore = clg.get(challenge_url)

                            # Get CSRF Token from challenge page
                            challenge_csrf_token = re.search(
                                '(?<="csrf_token":")\w+', challenge_request_explore.text
                            ).group(0)
                            # Get Rollout Hash from challenge page
                            rollout_hash = re.search(
                                '(?<="rollout_hash":")\w+', challenge_request_explore.text
                            ).group(0)

                            # Ask for option 1 from challenge, which is usually Email or Phone
                            challenge_post = {"choice": 1}

                            # Update headers for challenge submit page
                            clg.headers.update({"X-CSRFToken": challenge_csrf_token})
                            clg.headers.update({"Referer": challenge_url})

                            # Request instagram to send a code
                            challenge_request_code = clg.post(
                                challenge_url, data=challenge_post, allow_redirects=True
                            )

                            # User should receive a code soon, ask for it
                            challenge_userinput_code = input(
                                "Challenge Required.\n\nEnter the code sent to your mail/phone: "
                            )
                            challenge_security_post = {
                                "security_code": int(challenge_userinput_code)
                            }

                            complete_challenge = clg.post(
                                challenge_url,
                                data=challenge_security_post,
                                allow_redirects=True,
                            )
                            if complete_challenge.status_code != 200:
                                print("Entered code is wrong, Try again later!")
                                return
                            self.csrftoken = complete_challenge.cookies["csrftoken"]
                            self.s.headers.update(
                                {"X-CSRFToken": self.csrftoken, "X-Instagram-AJAX": "1"}
                            )
                            successfulLogin = complete_challenge.status_code == 200
                except Exception as err:
                    print(f"Login failed, response: \n\n{login.text} {err}")
                    return False
            elif loginResponse.get("authenticated") is False:
                print("Login error! Check your login data!")
                return

            else:
                rollout_hash = re.search('(?<="rollout_hash":")\w+', r.text).group(0)
                self.s.headers.update({"X-Instagram-AJAX": rollout_hash})
                successfulLogin = True
            # ig_vw=1536; ig_pr=1.25; ig_vh=772;  ig_or=landscape-primary;
            self.s.cookies["csrftoken"] = self.csrftoken
            self.s.cookies["ig_vw"] = "1536"
            self.s.cookies["ig_pr"] = "1.25"
            self.s.cookies["ig_vh"] = "772"
            self.s.cookies["ig_or"] = "landscape-primary"
            time.sleep(5 * random.random())
            
    def logout(self):
        try:
            _ = self.s.post(self.url_logout, data={"csrfmiddlewaretoken": self.csrftoken})
        except Exception as exc:
            print('Exception occured while logout {exception}', exc)
            
            
    def get_medias_from_recent_feed(self):
        url_tag = "https://www.instagram.com/"
        try:
            r = self.s.get(url_tag)
            jsondata = re.search("additionalDataLoaded\('feed',({.*})\);", r.text).group(1)
            all_data = json.loads(jsondata.strip())
            media_on_feed = list(all_data["user"]["edge_web_feed_timeline"]["edges"])
        except Exception as exc:
            logging.exception(exc)
            media_on_feed = []
        return media_on_feed
    
    def get_media_url(self, media_id=None, shortcode=None):
        if shortcode:
            return self.url_media % shortcode
        elif media_id:
            media_id = int(media_id)
            alphabet = (
                "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
            )
            shortened_id = ""
            while media_id > 0:
                media_id, idx = divmod(media_id, 64)
                shortened_id = alphabet[idx] + shortened_id

            return self.url_media % shortened_id
    
    def like(self, media_id):
        """ Send http request to like media by ID """
        media_to_like_url = self.get_media_url(media_id)

        try:
            resp = self.s.post(self.url_likes % (media_id))
        except Exception as exc:
            logging.exception(exc)
            return False

        if resp.status_code == 200:
            self.persistence.insert_media(media_id=media_id, status="200")
            return True
        elif resp.status_code == 400:
            self.persistence.insert_media(media_id=media_id, status="400", )

        else:
            self.persistence.insert_media(
                media_id=media_id,
                status=str(resp.status_code),
            )
        return False