hero: Automate your social life! (what could go wrong?) # InstaPy [InstaPy](https://github.com/timgrossmann/InstaPy) is an Instagram bot, developed by [Tim Grossman](https://github.com/timgrossmann). Tim describes his motivation and experiences developing the bot [here](https://medium.freecodecamp.org/my-open-source-instagram-bot-got-me-2-500-real-followers-for-5-in-server-costs-e40491358340). What's an Instagram bot? Basically, you feed the bot your Instagram user/password, and it executes follows/unfollows/likes/comments on your behalf based on rules you set. (_I set my bot to like one photo tagged with "[#penguin](https://www.instagram.com/explore/tags/penguin/?hl=en)" per-run_) ![InstaPy Screenshot](../images/instapy.png) Great power, right? A client (_yes, you can [hire](https://www.funkypenguin.co.nz/contact/) me!_) asked me to integrate InstaPy into their swarm, and this recipe is the result. ## Ingredients 1. [Docker swarm cluster](/ha-docker-swarm/design/) with [persistent shared storage](/ha-docker-swarm/shared-storage-ceph.md) ## Preparation ### Setup data locations We need a data location to store InstaPy's config, as well as its log files. Create /var/data/instapy per below ``` mkdir -p /var/data/instapy/logs ``` ### Setup Docker Swarm Create a docker swarm config file in docker-compose syntax (v3), something like this: !!! tip I share (_with my [patreon patrons](https://www.patreon.com/funkypenguin)_) a private "_premix_" git repository, which includes necessary docker-compose and env files for all published recipes. This means that patrons can launch any recipe with just a ```git pull``` and a ```docker stack deploy``` 👍 ``` version: '3' services: web: command: ["./wait-for", "selenium:4444", "--", "python", "docker_quickstart.py"] environment: - PYTHONUNBUFFERED=0 # Modify the image to whatever Tim's image tag ends up as. I used funkypenguin/instapy for my build image: funkypenguin/instapy:latest # When using swarm, you can't use relative paths, so the following needs to be set to the full filesystem path to your logs and docker_quickstart.py # Bind-mount docker_quickstart.py, since now that we're using a public image, we can't "bake" our credentials into the image anymore volumes: - /var/data/instapy/logs:/code/logs - var/data/instapy/instapy.py:/code/docker_quickstart.py:ro # This section allows docker to restart the container when it exits (either normally or abnormally), which ensures that # InstaPy keeps re-running. Tweak the delay to avoid being banned for excessive activity deploy: restart_policy: condition: any delay: 3600s selenium: image: selenium/standalone-chrome-debug ports: - "5900:5900" ``` !!! note Setup unique static subnets for every stack you deploy. This avoids IP/gateway conflicts which can otherwise occur when you're creating/removing stacks a lot. See [my list](/reference/networks/) here. ### Command your bot Create a variation of https://github.com/timgrossmann/InstaPy/blob/master/docker_quickstart.py at /var/data/instapy/instapy.py (the file we bind-mounted in the swarm config above) Change at least the following: ```` insta_username = '' insta_password = '' ```` Here's an example of my config, set to like a single penguin-pic per run: ``` insta_username = 'funkypenguin' insta_password = 'followmemypersonalbrandisawesome' dont_like = ['food','girl','batman','gotham','dead','nsfw','porn','slut','baby','tv','athlete','nhl','hockey','estate','music','band','clothes'] friend_list = ['therock','ruinporn'] # If you want to enter your Instagram Credentials directly just enter # username= and password= into InstaPy # e.g like so InstaPy(username="instagram", password="test1234") bot = InstaPy(username='insta_username', password='insta_password', selenium_local_session=False) bot.set_selenium_remote_session(selenium_url='http://selenium:4444/wd/hub') bot.login() bot.set_upper_follower_count(limit=10000) bot.set_lower_follower_count(limit=10) bot.set_comments([u'Cool :penguin:!', u'Awesome :penguin:!!', u'Nice :penguin:!!']) bot.set_dont_include(friend_list) bot.set_dont_like(dont_like) #bot.set_ignore_if_contains(ignore_words) # OK, so go through my feed and like stuff, interacting with people I follow # bot.like_by_feed(amount=3, randomize=True, unfollow=True, interact=True) # Now find posts tagged as #penguin, and like 'em, commenting 50% of the time bot.set_do_comment(True, percentage=50) bot.set_comments([u'Cool :penguin:!', u'Awesome :penguin:!!', u'Nice :penguin:!!']) bot.like_by_tags(['#penguin'], amount=1) # goodnight, sweet bot bot.end() ``` ## Serving ### Destroy all humans Launch the bot by running ```docker stack deploy instapy -c ``` While you're waiting for Docker to pull down the images, educate yourself on the risk of a robotic uprising: After swarm deploys, you won't see much, but you can monitor what InstaPy is doing, by running ```docker service logs instapy_web```. You can **also** watch the bot at work by VNCing to your docker swarm, password "secret". You'll see Selenium browser window cycling away, interacting with all your real/fake friends on Instagram :) ## Chef's Notes 1. Amazingly, my bot has ended up tagging more _non-penguins_ than actual penguins. I don't understand how Instagrammers come up with their hashtags! ### Tip your waiter (donate) 👏 Did you receive excellent service? Want to make your waiter happy? (_..and support development of current and future recipes!_) See the [support](/support/) page for (_free or paid)_ ways to say thank you! 👏 ### Your comments? 💬