Pythonを使ってTwitter、Instagram、Redditのボットを作る方法

2019年です。ボットについて聞いたことがあるでしょう。チャットボット、メールボット、ウェブスクレイピングボット、ソーシャルメディアボットなどがあります。まだボットを作ったことがないですか?驚くほど簡単です。おそらく、そのためいたるところにあるのでしょう。ボットの支配者たちに仲間入りして、彼らの仲間になりましょう。

この記事では、Pythonを活用してTwitter、Reddit、Instagramのアカウントと自動的にやり取りする方法を紹介します。

Pythonで操作する

このチュートリアルでは、Pythonを第一言語として使用します。Pythonの使いやすさの利点は、他の言語と比較して速度が遅いという欠点を上回ります。ほとんどのOSでPythonをダウンロードできます。お好みのエディタを使用してください。

Pythonディストリビューションには、

pip

というユーティリティが付属しています。この記事を書いている時点では、

pip

を使ってダウンロードできるライブラリは168,000以上あります。今日作成するボットには、そのうち3つだけが必要です。

コマンドラインから、次の3行を使って必要なライブラリをインストールできます。

pip install --upgrade InstagramAPI
pip install --upgrade tweepy pip install --upgrade praw

これで、必要な場所にこれらのライブラリをインポートできるようになります。

アプリケーションキーとシークレットを取得する

賢い哲学者があるとき、「秘密は楽しくない。秘密は誰かを傷つける。」と言いました。敬意を払って、ボットには秘密が必要です。ボットをセットアップする次のステップは、各サイトのAPIへのアクセスを許可することです。これを行うには、アプリケーションキーまたはシークレットが必要です。

キー、シークレット、トークンなどを収集するにつれて(楽しいゲームのようです!)、それらをすべて「credentials.py」という1つのファイルに入れます。このファイルは次のような見た目になります。

# 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 = ''

非常に重要なプライバシー上の提案: このファイルをソースコントロール(例: Git)にコミットしないでください。他の誰にもこれらのキーとシークレットを知られたくありません。それらは理由があってシークレットと呼ばれています。

Twitterのアクセスを設定する

Node.jsでTwitterボットを設定するガイドを参照すると、Twitterアプリを作成する方法がわかります。Twitterは、アカウントを確認し、スパムアカウントを作成していないことを確認するのに時間がかかります。

これらの手順に従ったら、コンシューマーキー、コンシューマーシークレット、アクセストークン、アクセストークンシークレットをcredentials.pyファイルにコピーします。

Redditのアクセスを設定する

RedditのクライアントIDとシークレットを取得する方法は、Twitterと非常によく似ています。Reddit User Agentとしてアプリを登録する必要があります。これを行った後、履歴書に「Reddit User Agent」と記載するべきです。

選択したRedditアカウントにサインインします。アプリの環境設定ページに移動し、別のアプリを作成するをクリックします。ユーザーエージェントに役立つ名前を付けます。アプリの目的としてスクリプトを選択します。about URLは空白のままにすることができます。リダイレクトボックスに任意のアドレスを入力します。

アプリの作成を押すと、アプリのリストが表示された次の画面が表示されます。アプリケーション名の下の数字はクライアントIDを表し、クライアントシークレットはその下にあります。これらの値をcredentials.pyファイルにコピーします。

Instagramのアクセスを設定する

Instagramのアクセスは、TwitterやRedditとは異なります。アプリを登録する代わりに、ユーザー名とパスワードを使用します。別の公開アカウントを作成し、その詳細をボットに使用することをお勧めします。

PrawでRedditにアクセスする

prawを使用するのは、2段階のプロセスです。まず、アクセスを設定するのはprawのRedditメソッドへの単一の関数呼び出しです。次に、初期化されたオブジェクトを使用して、new()メソッドを使用してサブredditを検索します。

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)
sub_name

変数を変更して、異なるサブredditから投稿を取得します。代わりに

new()

hot()

などの他のメソッドを使用して投稿を取得できます。

InstagramAPI経由でInstagramのハッシュタグを検索する

Instagram APIを使用する最初のステップは、クライアントIDとシークレットでオブジェクトを設定することです。その直後に、login()メソッドを呼び出してセットアップを完了します。

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()

APIの使用は、RedditのAPIよりも少し複雑です。この例では、スクリプトはgetHashtagFeedを使用して、Instagramから非常に大きなJSON応答オブジェクトを取得します。

レスポンスを検索して、スクリプトはキャプションテキストを探して、表示するために画面に印刷します。

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)

ソーシャルメディアに画像を追加する

さらに進んで、このハッシュタグフィードの画像を取得するためにスクリプトを使用したいと思うかもしれません。これを行うには、JSONレスポンスをループして、各投稿に関連付けられているメディアを見つけます。JSONレスポンスから情報を抽出するための実装を次に示します。

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'])
# 画像を取得
filename = self.save_image_from_candidate(candidate['url'])
if filename != '':
# タプルとしてステータスを取得して保存
caption = get_caption(item)
images.append((filename, caption))
if len(images) >= num_images:
break
return images

この関数では、2つのヘルパー関数を使用しています。Instagramは、JSONレスポンスで一連の画像「候補」を送信します。メディアが最高解像度で表示されるように、これらの画像の中で最大の画像を選択します。

def get_largest_image(candidates):
candidate = {}
pixels = 0
for cand in candidates:
# 最高解像度のものを選ぶ
res = cand['height']*cand['width']
if res > pixels:
pixels = res
candidate = cand
return candidate

次に、画像へのリンクが見つかったら、コンテンツをファイルに書き込んで、画像をローカルに保存できます。

requests

ライブラリを使用すると、これは簡単になります。

def save_image_from_candidate(url):
filename = ''
response = requests.get(url)
# レスポンスステータスコードをチェックする、200は正常
if response.status_code == 200:
filename = url.split("/")[-1].split('?')[0]
with open(filename, 'wb') as f:
f.write(response.content)
return filename

Tweepyを使用してメディアをツイートする

まず、シークレットとキーを使用してTwitterへのアクセスを設定する必要があります。

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)

一般的なリツイートボットを作成するのは、数行で完了します。

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

このライブラリでは、他にも多くのことが可能です。このチュートリアルを締めくくるために、

get_images_from_hashtag

以前作成したInstagramボットの関数を使い、画像とキャプションをツイートすることができます。

さらに、あなたのTwitterボットはRedditで新しい投稿を検索し、それらをツイートすることもできます。これら2つの機能を組み合わせると、次のようになります。

# サブレディット検索にはr/<hashtag>を使用
# Instagramの検索には#<hashtag>を使用
hashtag = 'technology'
num_posts = 5
# Reddit情報をツイート
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{title} #{sub} {url}'
tweet_str = trim_to_280(tweet_str)
tw_api.update(tweet_str)
# Instagramメディアをツイート
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

Pythonで動かすソーシャルメディアボットが完成!

さて、これで、あるサイトからメディアを取得して別のサイトに投稿するコードが揃いました。ミックスアンドマッチもできます。ツイートを取得してRedditに投稿します。Instagramの画像を収集して、サブredditに投稿します。ボットを作って、本当のインターネットに参加しましょう。

最後に、このプロセスを完全に自動化するには、ボットをサーバー上でループで実行する必要があります。これは、タイムスケジューラを搭載したあなた自身のパソコンで行うことができます。あるいは、クローゼットにしまっていた古いRaspberry Piのほこりを払い、Pi向けのこれらの素晴らしいTwitterボットプロジェクトをチェックしてください。