Automate Instagram With Python



Let's Do A Little Dance With InstaSpam

Let's import what we need for later on and log in to Instagram.

from InstagramAPI import InstagramAPI
from time import sleep
from random import randint

instauser = 'XXXX'
instapass = 'XXXX'

api = InstagramAPI(instauser, instapass)
api.login()

Upload image with caption.

api.uploadPhoto('path/to/image.jpg', caption='Something nice')

Get hashtag feed and like medias with the hashtag #lovepizza skipping those already liked.

def like_tag_feed(tag, max_likes):
    print('Liking media with hashtag {}'.format(tag))
    next_max = 1
    next_max_id = ''
    likes = 0
    for n in range(next_max):
        api.getHashtagFeed(tag, next_max_id)
        temp = api.LastJson
        for post in temp["items"]:
            if not post["has_liked"]:
                print('Liking {} '.format(post["pk"]))
                api.like(post["pk"])
                likes += 1
                if likes >= max_likes:
                    break
                sleep(randint(3, 12))
        try:
            next_max_id = temp["next_max_id"]
        except Exception:
            pass
        if likes >= max_likes:
            break

like_tag_feed('lovepizza' , 3)

Follow users that like your media.

def follow_media_likers(instauser, max_media_likers):
    print('Checking recent media likers')
    count = 0
    for media in get_recent_media(instauser):
        api.getMediaLikers(mediaId=media)
        info = api.LastJson
        for user in info['users']:
            id = user['pk']
            if friend_check(api, id):
                print('Already following {}'.format(id))
            else:
                api.follow(id)
                print('Following {}'.format(id))
            sleep(randint(3, 15))
        if count >= max_media_likers:
            break
        count += 1

follow_media_likers(instauser, 3)

Like users recent media.

def like_recent_media(target_user, max_likes):

    def get_user_profile(target_user):
        api.searchUsername(target_user)
        return api.LastJson['user']

    user_profile = get_user_profile(target_user)
    user_id = user_profile['pk']
    user_posts = api.getUserFeed(user_id)
    info = api.LastJson

    likes = 0
    for recent_post in info['items']:
        if not recent_post["has_liked"]:
            print('Liking {} '.format(recent_post["pk"]))
            api.like(recent_post['pk'])
            likes += 1
            if likes >= max_likes:
                break
            sleep(randint(3, 12))

like_recent_media('putln2', 3)

Unfollow those who don't follow back and follow those who do.

def friend_check(user):
    api.userFriendship(user)
    if api.LastJson["following"]:
        return True
    else:
        return False

def get_ids(user_id, friends):
    gotcha = []
    next_max_id = True
    while next_max_id:
        if next_max_id is True:
            next_max_id = ''
        if friends:
            api.getUserFollowings(user_id, maxid=next_max_id)
        else:
            api.getUserFollowers(user_id, maxid=next_max_id)
        gotcha.extend(api.LastJson.get('users', []))
        next_max_id = api.LastJson.get('next_max_id', '')
    return gotcha

def balancer(max_followback, max_unfollow):
    print('Balancing followers/following')
    user_id = api.username_id
    followers = get_ids(user_id, False)
    following = get_ids(user_id, True)
    followers_list = []
    following_list = []
    for follower in followers:
        followers_list.append(follower['pk'])
    for follower in following:
        following_list.append(follower['pk'])
    losers = set(following_list) - set(followers_list)

    print('Followers: {}'.format(len(followers)))
    print('Following: {}'.format(len(following)))
    print('Losers: {}'.format(len(losers)))

    count = 0
    for winner in followers_list:
        if friend_check(winner):
            print('Already following {}'.format(winner))
        else:
            api.follow(winner)
            print('Following {}'.format(winner))
        if count > max_followback:
            break
        count += 1
        sleep(randint(3, 15))

    count = 0
    for loser in losers:
        api.unfollow(loser)
        print('Unfollowed {}'.format(loser))
        if count > max_unfollow:
            break
        count += 1
    sleep(randint(3, 15))

balancer(3, 3)

How to use multiple accounts.

insta_accounts = {
    'XXXX': 'XXXX'
    'XXXX': 'XXXX',
    'XXXX': 'XXXX',
    'XXXX': 'XXXX'
}

for instauser, instapass in insta_accounts.items():
    api = InstagramAPI(instauser, instapass)
    api.login()
    print('Account: {}'.format(api.username))

Thanks for reading. x

Resources