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ボットプロジェクトをチェックしてください。
コメントする