def unfollow(api: Client) -> None:
    """
    Users who are followed by the current user are obtained
    and one of them chosen by the current user is unfollowed
    
    Arguments:
        api (Client) : Object instagram Client

    """
    results = get_follows(api)
    username = input_user_chat(f"Who do you want to unfollow? ")
    for user in results['users']:
        try:
            if user['username'] == username and api.friendships_destroy(
                    user['pk']):
                text = f"{username} has been successfully unfollowed!"
                print_write_chatbot(message=text,
                                    color='green',
                                    attrs_color=['bold'])
        except Exception as error:
            write_log(STATUS_FILE, str(error), 'Exception')
            print_write_chatbot(f"Error to unfollow: {error}",
                                color="red",
                                attrs_color=['bold'])
예제 #2
0
파일: followers.py 프로젝트: wasmm/grammer
    s_podpiska = 1  #счетчик подписок
    s_otpiska = 1  #счетчик отписок

    for following in follovers_followings:
        pk = following['pk']
        data_follow = api.friendships_show(pk)

        #Я подписан, а на меня не подписаны
        if data_follow['following'] == True and data_follow[
                'followed_by'] == False:
            print('Пользователь: ' + following['username'])
            print(
                'Подписка невзаимная с его строны - отписка от пользователя(' +
                str(s_otpiska) + ')')
            try:
                api.friendships_destroy(pk)
                s_otpiska += 1
                t = randint(config.START_SLEEP_TIME_TO_UNFOLLOW,
                            config.FINISH_SLEEP_TIME_TO_UNFOLLOW)
                print('Жди ' + str(t) + ' сек')
                print()
                time.sleep(t)
            except ClientError as e:
                print('Лимит подписок исчерпан')

        #Я не подписан, а на меня подписаны
        elif data_follow['following'] == False and data_follow[
                'followed_by'] == True:
            print('Пользователь: ' + following['username'])
            print(
                'Подписка невзаимная с моей строны - подписка на пользователя('
예제 #3
0
class InstagramManager(object):
    def __init__(self):
        self.username = config_reader.ConfigHelper.read_config(
            'account', 'username')
        self.password = config_reader.ConfigHelper.read_config(
            'account', 'password')
        self.api = Client(self.username, self.password)
        self.follower_list = []
        self.story_user_list = []
        self.daily_follow_num = int(
            config_reader.ConfigHelper.read_config('setting',
                                                   'daily_follow_num'))
        self.comment_list = config_reader.ConfigHelper.get_comments()
        self.tag_feeds = []
        self.tag_hot_feeds = []

    def re_login(self):
        self.api = Client(self.username, self.password)

    def start_work(self):
        self.deal_account()
        #self.api.current_user();
        #self.deal_unfollow()
        #self.deal_tag()
        #self.deal_story()
        #self.deal_comment_and_like()

    def deal_account(self):
        username = config_reader.ConfigHelper.read_config(
            'setting', 'focus_account')
        user_id = self.get_user_id(username)
        if user_id is None:
            print('no this user')
        else:
            page_num = config_reader.ConfigHelper.read_config(
                'page', 'page_num')
            self.get_follower(user_id, page_num)
        for follower in self.follower_list:
            pk = follower.get('pk')
            name = follower.get('username')
            self.api.friendships_create(pk)
            database_helper.DatabaseHelper.insert_follower(pk, name)
            config_reader.ConfigHelper.write_config('follower', str(pk), name,
                                                    'daily_result.ini')

    def deal_unfollow(self):
        followers = database_helper.DatabaseHelper.select_follower()
        for follower in followers:
            follow_timestamp = follower.timestamp
            timestamp = time.time()
            # 根据配置天数自动取关
            day = int(
                config_reader.ConfigHelper.read_config('setting',
                                                       'unfollow_days'))
            time_diff = day * 24 * 60 * 60
            if timestamp - follow_timestamp >= time_diff:
                if self.has_real_followed(follower.user_id, follower.username):
                    print('start_friendships_destroy:' + follower.username)
                    self.api.friendships_destroy(follower.user_id)
                    database_unfollower_helper.DatabaseUnFollowHelper.insert_data(
                        follower.user_id, follower.username)
                    print('friendships_destroy:' + follower.username)

    def deal_comment_and_like(self):
        for follower in self.follower_list:
            pk = follower.get('pk')
            name = follower.get('username')
            print('comment:' + name)
            is_private = follower.get('is_private')
            if not is_private:
                feeds = self.get_user_feed(pk)
                for feed in feeds:
                    media_id = feed.get('pk')
                    self.comment_feed(media_id)
                    self.like_feed(media_id)
                print(name + ' comment and like success')
            else:
                print(name + 'is a private account')

    def deal_tag(self, max_id=None):
        tag = config_reader.ConfigHelper.read_config('setting', 'focus_tag')
        if max_id is None:
            feed_tag = self.api.feed_tag(tag)
        else:
            feed_tag = self.api.feed_tag(tag, max_id=max_id)
        next_max_id = feed_tag.get('next_max_id')
        if next_max_id:
            self.deal_tag(next_max_id)
            return
        self.set_feeds(feed_tag)
        self.set_hot_feeds(feed_tag)
        for feed in self.tag_feeds:
            media_id = feed.get('pk')
            self.comment_feed(media_id)
        for hot_feed in self.tag_hot_feeds:
            media_id = hot_feed.get('pk')
            self.comment_feed(media_id)

    def get_user_id(self, username):
        results = self.api.search_users(username)
        users = []
        users.extend(results.get('users', []))
        for user in users:
            if user.get('username') == username:
                pk = user.get('pk')
                return pk
        return None

    def get_follower(self, user_id, max_id=None):
        if max_id is None:
            user_followers = self.api.user_followers(user_id)
        else:
            user_followers = self.api.user_followers(user_id, max_id=max_id)
        users = []
        users.extend(user_followers.get('users', []))
        for user in users:
            pk = user.get('pk')
            username = user.get('username')
            is_meet = (not self.has_followed(pk)
                       ) and self.is_meet_requirements(pk, username)
            if is_meet:
                self.follower_list.append(user)
                # 取到了每天需要follow数量即可停止
                if len(self.follower_list) >= self.daily_follow_num:
                    return
        next_max_id = user_followers.get('next_max_id')
        config_reader.ConfigHelper.write_config('page', 'page_num',
                                                next_max_id)
        if next_max_id:
            self.get_follower(user_id, next_max_id)

    # 是否满足我们follow的要求
    def is_meet_requirements(self, user_id, username):
        if database_meet_helper.DatabaseMeetHelper.is_un_meet(user_id):
            print('DatabaseMeetHelper un_meet')
            return False
        post_meet_num = int(
            config_reader.ConfigHelper.read_config('follower_request', 'post'))
        follower_meet_num = int(
            config_reader.ConfigHelper.read_config('follower_request',
                                                   'followers'))
        following_meet_num = int(
            config_reader.ConfigHelper.read_config('follower_request',
                                                   'following'))
        user_info = self.api.user_info(user_id).get('user')
        post_num = user_info.get('media_count')
        follower_count = user_info.get('follower_count')
        following_count = user_info.get('following_count')
        is_meet = (post_num >= post_meet_num
                   and follower_count >= follower_meet_num
                   and following_count >= following_meet_num)
        print(str(user_id) + ":" + str(is_meet))
        if not is_meet:
            database_meet_helper.DatabaseMeetHelper.insert_data(
                user_id, username)
        return is_meet

    # 判断是否关注过,包括已经关注、发送过关注请求(私人账户)、已经关注过(可能现在已经取关)
    def has_followed(self, user_id):
        friendships_show = self.api.friendships_show(user_id)
        is_following = friendships_show.get('following')
        outgoing_request = friendships_show.get('outgoing_request')
        database_is_followed = database_helper.DatabaseHelper.is_followed(
            user_id)
        return is_following or outgoing_request or database_is_followed

    # 判断是正在关注的,用于取关的时候用到,只有在ins中关注的才需要取关
    def has_real_followed(self, user_id, user_name):
        # 如果在去粉的数据库中,则说明已经被去粉,就不再去调用ins接口,否则很容易被限制
        if database_unfollower_helper.DatabaseUnFollowHelper.is_in_data(
                user_id):
            return False
        try:
            friendships_show = self.api.friendships_show(user_id)
            is_following = friendships_show.get('following')
            outgoing_request = friendships_show.get('outgoing_request')
            return is_following or outgoing_request
        except ClientError as e:
            print('has_real_followed ClientError')
            return False

    def set_feeds(self, feed_tag):
        feeds = feed_tag.get('items')
        daily_recent_posts = config_reader.ConfigHelper.read_config(
            'setting', 'daily_recent_posts')
        tag_feed_request_like = config_reader.ConfigHelper.read_config(
            'setting', 'tag_feed_request_like')
        for feed in feeds:
            media_id = feed.get('pk')
            media_info = self.api.media_info(media_id)
            item = media_info.get('items')[0]
            like_count = item.get('like_count')
            if like_count > int(tag_feed_request_like):
                self.tag_feeds.append(feed)
            if len(self.tag_feeds) >= int(daily_recent_posts):
                break

    def set_hot_feeds(self, feed_tag):
        hot_feeds = feed_tag.get('ranked_items')
        daily_top_posts = config_reader.ConfigHelper.read_config(
            'setting', 'daily_top_posts')
        for hot_feed in hot_feeds:
            self.tag_hot_feeds.append(hot_feed)
            if len(self.tag_hot_feeds) >= int(daily_top_posts):
                break

    # 获取某个用户的post(数量根据配置)
    def get_user_feed(self, user_id):
        user_feed = self.api.user_feed(user_id)
        feeds = user_feed.get('items')
        num = int(
            config_reader.ConfigHelper.read_config('follower_request',
                                                   'post_num_for_comment'))
        return feeds[:int(num)]

    # 对post进行评论
    def comment_feed(self, media_id):
        length = len(self.comment_list)
        x = random.randint(0, length - 1)
        comment = self.comment_list[x]
        print('start comment,media_id:' + str(media_id) + "——" + comment)
        try:
            self.api.post_comment(media_id, str(comment))
            print('comment:' + comment + ' success')
        except Exception as e:
            print('comment:' + comment + ' error:' + str(e))

    # 对post进行like
    def like_feed(self, media_id):
        self.api.post_like(media_id)

    def deal_story(self):
        self.get_user_story()

    def get_user_story(self):
        reels_tray = self.api.reels_tray()
        broadcasts = reels_tray.get('broadcasts')
        tray = reels_tray.get('tray')
        for item in tray:
            user = item.get('user')
            name = user.get('username')
            user_detail_info = self.api.user_detail_info(
                user.get('pk')).get('user_detail').get('user')
            post_num = user_detail_info.get('media_count')
            follower_count = user_detail_info.get('follower_count')
            following_count = user_detail_info.get('following_count')
            post_meet_num = int(
                config_reader.ConfigHelper.read_config('story_request',
                                                       'post'))
            follower_meet_num = int(
                config_reader.ConfigHelper.read_config('story_request',
                                                       'followers'))
            following_meet_num = int(
                config_reader.ConfigHelper.read_config('story_request',
                                                       'following'))
            daily_story_comment_num = int(
                config_reader.ConfigHelper.read_config('setting',
                                                       'daily_story_comment'))
            is_meet = (post_num >= post_meet_num
                       and follower_count >= follower_meet_num
                       and following_count <= following_meet_num)
            if is_meet:
                stories = item.get('items')
                if stories is None:
                    continue
                for story in stories:
                    length = len(self.comment_list)
                    x = random.randint(0, length)
                    comment = self.comment_list[x]
                    self.api.broadcast_comment(story.get('pk'), comment)
                    print(name + 'story comment:' + comment + "success")
                self.story_user_list.append(item)
            if len(self.story_user_list) >= daily_story_comment_num:
                break
예제 #4
0
cfreq_source = browser.find_elements_by_xpath("//div[@class='-utLf']")  

for x in cfreq_source: 
	out_var += x.text + '\n'

browser.quit() 

api = Client(uname, pwd) 
np = out_var.split('\n')
i = 0
for x in np:
	if(i % entries_ == 0 and i != 0):
		print('[i] Waiting ' + str(SECURE_DELAY) + ' seconds before continuing for security reasons...')
		time.sleep(SECURE_DELAY)
	if(x in exclusions_x):
		print('[i] User ' + x + ' is present in exclusion list. skipping...')
		continue
	try:
		if bool(x): 
			user_info = api.username_info(x) 
			uid = user_info['user']['pk'] 
			api.friendships_destroy(uid) 
			print('[+] Cancelled follow: ' + x)
	except:
		print('[-] Something went wrong with: ' + x)
		continue
	i += 1

print('[+] Cancelled ' + str(i) + ' follow requests!')

예제 #5
0
for i in range(1000):

    for key, value in celebrities.items():
        while is_connected() == False:
            print("no internet connecton ")
            print("rechecking ...")
            sleep(1)

        api.friendships_create(value)
        print("{0} : Followed successfully".format(key))
        sleep(5)

    print('')
    print('relaxing ..')
    print('')

    for key, value in celebrities.items():
        while is_connected() == False:
            print("no internet connecton ")
            print("rechecking ...")
            sleep(1)

        api.friendships_destroy(value)
        print("{0} : Unfollowed successfully".format(key))
        sleep(5)

    print('')
    print("######################################")
    print('')
예제 #6
0
class InstaUnfollow:
    def __init__(self,
                 username,
                 password,
                 API=None,
                 action_interval=8.0,
                 rate=120,
                 interval=5400,
                 unfollow_all=True):
        self.username = username
        self.password = password
        self.action_interval = action_interval
        self.rate = rate
        self.interval = interval
        self.unfollow_all = unfollow_all
        try:
            from app import logger
            logger = get_logger()
        except ImportError:
            pass
        self.logger = logging.LoggerAdapter(logger, {
            'user': self.username,
            'bot': 'instaunfollow'
        })
        self.API = Client(self.username, self.password) if API is None else API
        self.webAPI = WebClient()

    def _get_user_ids(self):
        self.logger.info('Collecting users to unfollow...')

        # Get people followings
        rank_token = self.API.generate_uuid()

        following = self.API.user_following(self.id, rank_token=rank_token)

        following_users = following.get("users")

        _ids = [user.get("pk", 0) for user in following_users]

        return _ids

    def _login(self):
        attempts = 0
        while attempts <= 10:
            try:
                if self.API.login():
                    return True
            except Exception as e:
                self.logger.error("Failed to login", e)
            sleep(6)
            attempts += 1

        return False

    def start(self):

        # if not self.API.is_logged_in:
        #     if not self._login():
        #         return False

        self.logger.info("Unfollow bot started for user {}...".format(
            self.API.username))
        self.id = self.webAPI.user_info2(self.username).get("id")
        users = self._get_user_ids()

        progress = 0
        too_many_request_errors = 0
        while users:
            progress += 1
            # if not self.API.is_logged_in:
            #     self.API.login()

            id = users.pop(0)

            res = self.API.friendships_destroy(id)

            if res.get("status", False) != "ok":
                users.append(id)
                too_many_request_errors += 1

            if too_many_request_errors == 10:
                sleep(randint(60, 100))
                too_many_request_errors = 0

            if not (progress % self.rate):
                sleep(uniform(self.interval * 0.9, self.interval * 1.1))

            # Sleep n seconds +/ 10% to induce randomness between each action
            sleep(
                uniform(self.action_interval * 0.9,
                        self.action_interval * 1.1))
예제 #7
0
class UnfollowBot:
    def __init__(self,
                 username,
                 password,
                 unfollow_per_day=199,
                 stop_on_failures=10):
        self._username = username
        self._password = password
        self._login()
        self.persistence = Persistence(username)
        self.sleep_time = DAY_MILLIS / unfollow_per_day
        self.failures = 0
        self.stop_on_failures = stop_on_failures

    def _login(self):
        logger.info('authenticating {}... it may take a while'.format(
            self._username))

        self.api = MobileClient(auto_patch=True,
                                authenticate=True,
                                username=self._username,
                                password=self._password)

        logger.info('successfully authenticated {}'.format(self._username))

    def _download_all_followers(self):
        if self.persistence.get_all_followers_downloaded():
            logger.info(
                'all followers have been downloaded... Skipping followers download'
            )
            return

        logger.info('downloading followers')

        count = 0
        rank_token = self.api.generate_uuid()
        followers = pagination.page(self.api.user_followers,
                                    args={
                                        'user_id':
                                        self.api.authenticated_user_id,
                                        'rank_token': rank_token
                                    },
                                    wait=10)
        it = iter(followers)

        while True:
            if self.failures > self.stop_on_failures:
                return
            try:
                results = next(it, None)
                if results is None:
                    break
            except:
                self.failures += 1
                logger.error('error getting followeres from instagram')
                continue

            count += len(results['users'])
            for follower in results['users']:
                entity = Follower(id=follower['id'],
                                  username=follower['username'])
                self.persistence.save_follower(entity)

        logger.info(
            'all followers have been downloaded. downloaded {} profiles'.
            format(count))
        self.persistence.all_followeres_downloaded()

    def _download_all_following(self):
        if self.persistence.get_all_following_downloaded():
            logger.info(
                'all following have been downloaded... Skipping following download'
            )
            return

        logger.info('downloading users I am following')

        rank_token = self.api.generate_uuid()
        following = pagination.page(self.api.user_following,
                                    args={
                                        'user_id':
                                        self.api.authenticated_user_id,
                                        'rank_token': rank_token
                                    },
                                    wait=10)

        count = 0
        it = iter(following)
        while True:
            if self.failures > self.stop_on_failures:
                return
            try:
                results = next(it, None)

                if results is None:
                    break
            except Exception as e:
                self.failures += 1
                logger.error('error getting people I follow from instagram', e)
                continue

            count += len(results['users'])
            for user in results['users']:
                entity = Following(id=user['id'], username=user['username'])
                self.persistence.save_follower(entity)

        logger.info(
            'all following have been downloaded. downloaded {} profiles'.
            format(count))
        self.persistence.all_following_downloaded()

    def _unfollow_batch(self, profiles_not_follow_back):
        for user in profiles_not_follow_back:
            logger.info('trying to un follow user {}'.format(user.username))
            try:
                self.api.friendships_destroy(user.id)

                user.unfollowed = True
                self.persistence.save_following(user)

                logger.info('successfuly un followed user {}'.format(
                    user.username))

            except ClientBadRequestError as e:
                logger.info(
                    "user {} does not exist anymore".format(user.username), e)
                user.unfollowed = True
                self.persistence.save_following(user)

            except ClientThrottledError:
                self.failures += 1
                logger.error(
                    'throttle error trying to un follow user {}'.format(
                        user.id))
                if self.failures > self.stop_on_failures:
                    return

            except ClientForbiddenError:
                logger.error(
                    "session has expired... We need to authenticate again")
                self._login()

            except Exception as e:
                logger.error(
                    "error happened while trying to unfollow user {}".format(
                        user.username), e)

            logger.info('sleeping for {}s'.format(self.sleep_time))
            time.sleep(self.sleep_time)

    def start(self):

        self._download_all_following()
        self._download_all_followers()

        while True:

            if self.failures > self.stop_on_failures:
                logger.info(
                    'stopping as we reached the max amount of failures...')
                break

            profiles_not_follow_back = self.persistence.get_not_following(100)
            if profiles_not_follow_back is None or len(
                    profiles_not_follow_back) == 0:
                logger.info('all profiles have been unfollowed!')
                break

            self._unfollow_batch(profiles_not_follow_back)

        logger.info('Bye!')