It’s 2019. You’ve heard of bots. There are chat bots, email bots, web scraping bots, and, social media bots. Have you created a bot yet? It’s surprisingly easy. Probably why they’re all over the place. Embrace our bot overlords by joining their rank.
In this article, I’ll show you how you can leverage Python to interact with your Twitter, Reddit, and Instagram accounts automatically.
Working With Python
This walk-through uses Python as its language of choice. Python’s ease-of-use advantages outweigh any speed deficiencies it has compared to other languages. You can download Python for almost any OS. Use the editor of your choice.
Python distributions come associated with the utility called pip
. At the time of writing, there are over 168,000 libraries available for download using pip
. For the bots you will create today, only three are needed.
From the command line, you can install the libraries needed using these three lines.
pip install --upgrade InstagramAPI
pip install --upgrade tweepy pip install --upgrade praw
Now you’ll be able to import these libraries where needed.
Getting Application Keys and Secrets
A wise philosopher once said “Secrets, secrets are no fun. Secrets, secrets hurt someone.” Respectfully, the bots need secrets. The next step in setting up your bots is to allow them access to the API of each site. To do this, you’ll need an application key or secret.
As you collect keys, secrets, tokens, and more (sounds like a fun game!), put them all into a single file called “credentials.py.” This file would look something like this:
# keys
twitter_consumer_key = ''
twitter_consumer_secret = ''
twitter_access_token = ''
twitter_access_token_secret = ''
reddit_client_id = ''
reddit_client_secret = ''
reddit_user_agent = ''
instagram_client_id = ''
instagram_client_secret = ''
Very important privacy suggestion: do not commit this file any source control (e.g. Git). You do not want anyone else to have these keys and secrets. They are called secrets for a reason.
Setting Up Twitter Access
Check out our guide to setting up a Twitter bot with Node.js will show you how to create your Twitter app. Note that Twitter will take some time to verify your account and ensure you’re not creating a spam account.
After following those steps, copy the consumer key, consumer secret, access token, and access token secret into your credentials.py file.
Setting Up Reddit Access
Getting your Reddit client ID and secret is very similar to Twitter. You’ll need to register an app as a Reddit User Agent. After doing this, you should absolutely put “Reddit User Agent” on your resume.
Sign in to the Reddit account of your choosing. Navigate to the apps preferences page and Click create another app. Name your user agent something useful. Select script for the purpose of your app. The about URL can be left blank. Fill in any address for the redirect box.
After you Press create app, the following screen will be presented to you with a list of your apps. The digits under your application name represent the client ID and the client secret is located below that. Copy these values to your credentials.py file.
Setting Up Instagram Access
Instagram access differs from Twitter and Reddit. Instead of registering an app, you use your username and password. I suggest creating a separate public account and using those details for your bot.
Accessing Reddit With Praw
Using praw is a two-step process. First, setting up the access is a single function call to the Reddit method of praw. Then, using the initialized object, searching a subreddit is done using the new() method.
import praw
from credentials import *
my_reddit = praw.Reddit(client_id=reddit_client_id, client_secret=reddit_client_secret, user_agent=reddit_user_agent)
sub_name = 'technology'
max_posts = 10
for submission in my_reddit.subreddit(sub_name).new(limit=max_posts):
print(submission.title)
Change the sub_name
variable to get posts from different subreddits. Instead of new()
, other methods such as hot()
are available to get posts.
Searching Instagram Hashtags Via InstagramAPI
The first step in using the Instagram API is setting up an object with the client ID and secret. Directly after that, call the login() method to complete set up.
from InstagramAPI import InstagramAPI
from credentials import instagram_client_id, instagram_client_secret
my_insta_api = InstagramAPI(instagram_client_id,instagram_client_secret)
my_insta_api.login()
Using the API is a little more complicated than its Reddit counterpart. In this example, the script uses getHashtagFeed to get a very large JSON response object from Instagram.
Searching through the response, the script looks for caption text and then prints out to the screen to view it.
get_hashtag = my_insta_api.getHashtagFeed(hashtag)
if get_hashtag != False:
for item in my_insta_api.LastJson['items']:
if 'caption' in item.keys() and 'text' in item['caption'].keys():
caption = item['caption']['text']
print(caption)
Add Images To Social Media
Moving forward, you may want your script to get the images in this hashtag feed. To do this, loop through the JSON response and find the media associated with each post. Here’s an implementation for extracting the information from the JSON response:
def get_images_from_hashtag(hashtag, num_images):
images = []
get_hashtag = my_insta_api.getHashtagFeed(hashtag)
if get_hashtag == False:
return images
for item in my_insta_api.LastJson['items']:
if item['media_type'] == 1 and 'image_versions2' in item.keys():
candidate = get_largest_image(item['image_versions2']['candidates'])
# get image
filename = self.save_image_from_candidate(candidate['url'])
if filename != '':
# get status, save as tuple
caption = get_caption(item)
images.append((filename, caption))
if len(images) >= num_images:
break
return images
There are two helper functions used in this function. Instagram sends a list of image “candidates” in the JSON response. Choose the largest of these images so that the media is displayed in its highest resolution.
def get_largest_image(candidates):
candidate = {}
pixels = 0
for cand in candidates:
# pick the highest resolution one
res = cand['height']*cand['width']
if res > pixels:
pixels = res
candidate = cand
return candidate
Secondly, once the link to image is found, you can save the image locally by writing the content to a file. Using the requests
library makes this straightforward.
def save_image_from_candidate(url):
filename = ''
response = requests.get(url)
# check the response status code, 200 means good
if response.status_code == 200:
filename = url.split("/")[-1].split('?')[0]
with open(filename, 'wb') as f:
f.write(response.content)
return filename
Tweeting Out Media With Tweepy
First, you’ll need to set up Twitter access using your secrets and keys.
import tweepy
from credentials import *
tw_auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret)
tw_auth.set_access_token(twitter_access_token, twitter_access_token_secret)
tw_api = tweepy.API(tw_auth)
Creating a generic retweet bot is done in just a few lines.
for tweet in tweepy.Cursor(tw_api.search,q='MakeUseOf').items(10):
try:
tweet.favorite()
tweet.retweet()
time.sleep(2)
except tweepy.TweepError as e:
print(e.reason)
except StopIteration:
break
Many other things can be done with this library. To conclude this walk-through, you can use the get_images_from_hashtag
function from the Instagram bot made earlier to tweet out images and captions.
Additionally, your Twitter bot can search Reddit for new posts and tweet those out as well. To put both of these functionalities together looks like this:
# use r/<hashtag> for reddit search
# and #<hashtag> for instagram search
hashtag = 'technology'
num_posts = 5
# tweet reddit info
reddit_posts = my_reddit.subreddit(hashtag).new(limit=num_posts)
for submission in reddit_posts:
title = submission.title
url = 'www.reddit.com{}'.format(submission.permalink)
tweet_str = f'Reddit r/{sub} update:\n\n{title} #{sub} {url}'
tweet_str = trim_to_280(tweet_str)
tw_api.update(tweet_str)
# tweet instagram media
media_info = get_images_from_hashtag(hashtag, num_posts)
for (filename, message) in media_info:
try:
tweet_str = trim_to_280(message)
tw_api.update_with_media(filename, status=tweet_str)
except tweepy.TweepError as e:
print(e.reason)
except StopIteration:
break
Your Python-Powered Social Media Bot Is Ready!
So, now you’ve got a bunch of code that pulls media from one site and posts to another. You can mix and match, too. Pull tweets and post to Reddit. Collect Instagram images for posting to subreddits. Make a bot and be a part of the real internet.
Lastly, to fully automate this process, you will want your bots to run in a loop on a server. This could be on your own computer with a time scheduler. Or, dust off that old Raspberry Pi that has been in your closet, and check out these sweet Twitter bot projects for the Pi.
Read the full article: How to Build Twitter, Instagram, and Reddit Bots Using Python
Read Full Article
No comments:
Post a Comment