diff --git a/manuscript/CHANGELOG.md b/manuscript/CHANGELOG.md index cb013d1..7aa3711 100644 --- a/manuscript/CHANGELOG.md +++ b/manuscript/CHANGELOG.md @@ -6,8 +6,9 @@ Sign up [here](http://eepurl.com/dfx95n) (double-opt-in) to receive email update ## Recently added recipes +* [InstaPy](/recipies/instapy/) - Automate your Instagrammage (_17 Apr 2018_) * [CryptoMiner](/recipies/cryto-miner/start/) - Become a cryptocurrency miner, put your GPU to work! -* [Calibre-Web](/recipies/calibre-web/) - Plex for EBooks (_8 Jan 2017_) +* [Calibre-Web](/recipies/calibre-web/) - Plex for EBooks (_8 Jan 2018_) * [Emby](/recipies/emby/) - Geekier alternative to Plex, with improved parental controls (_28 Dec 2017_) * [Home Assistant](/recipies/homeassistant/) - Home automation platform with support for a [bazillion](https://home-assistant.io/components/) components (_24 Dec 2017_) diff --git a/manuscript/images/instapy.png b/manuscript/images/instapy.png new file mode 100644 index 0000000..73fa130 Binary files /dev/null and b/manuscript/images/instapy.png differ diff --git a/manuscript/recipies/instapy.md b/manuscript/recipies/instapy.md new file mode 100644 index 0000000..5253fad --- /dev/null +++ b/manuscript/recipies/instapy.md @@ -0,0 +1,136 @@ +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? 💬 diff --git a/mkdocs.yml b/mkdocs.yml index b343580..347da1f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -79,6 +79,7 @@ pages: - Wekan: recipies/wekan.md - Tiny Tiny RSS: recipies/tiny-tiny-rss.md - Portainer: recipies/portainer.md + - InstaPy: recipies/instapy.md - Reference: - OAuth Proxy: reference/oauth_proxy.md - Data Layout: reference/data_layout.md