\r\n\r\n
2019年になりましたね。ボットという言葉を聞いたことがあると思います。チャットボット、メールボット、ウェブクローリングボット、ソーシャルメディアボットがあります。ボットはもう作りましたか?とても簡単なことです。おそらく、どこにでもあるものだからでしょう。ボットオーバロードの仲間入りをして、ボットを受け入れよう。
今回は、Pythonを使ってTwitter、Reddit、Instagramのアカウントと自動的に対話する方法を紹介します。
このチュートリアルでは、Pythonを優先言語として使用しています。Pythonは他の言語に比べて使いやすいという利点があり、速度の欠点を補って余りあるものです。Pythonはほとんどのオペレーティングシステムでダウンロードできます。
Pythonのディストリビューションは、以下のようなディストリビューションと関連付けられています。
pipこの記事を書いている時点で、168,000以上のライブラリーが利用可能です。
pip今日作るロボットのプログラムでは、3つだけ必要です。
コマンドラインから、この3行で必要なライブラリをインストールすることができます。
pip install --upgrade InstagramAPIpip install --upgrade tweepy pip install --upgrade prawこれで、必要な場所にこれらのライブラリをインポートすることができます。
ある哲学者は「秘密、秘密は楽しくない」と言いました。秘密は、秘密は、人を傷つける。"ロボットには秘密が必要だ "と。ボットの設定の次のステップは、各サイトのAPIへのアクセスを許可することです。このために、アプリケーションキーまたはパスワードが必要です。
鍵や秘密、トークンなどを集めると(楽しそうなゲームだなあ)) を、vouchers.py というファイルにまとめてください」 このファイルは、次のようなものです。
# keystwitter_c***umer_key = ''twitter_c***umer_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アプリケーションの作成方法については、Twitterボットnode.jsのセットアップガイドをご覧ください。Twitterがお客様のアカウントを確認し、お客様がスパムアカウントを作成していないことを確認するのに時間がかかることをご了承ください。
これらの手順が完了したら、ユーザーキー、ユーザーシークレット、アクセストークン、アクセストークンシークレットを credentials.py ファイルにコピーしてください。
RedditのクライアントIDとシークレットの取得は、Twitterと非常に似ています。アプリケーションをRedditのユーザーエージェントとして登録する必要があります。これができたら、ぜひ履歴書に「Reddit User Agent」と書いておきましょう。
お好きなRedditアカウントにログインしてください。アプリケーションの環境設定」ページに移動し、「別のアプリケーションを作成する」をクリックします。ユーザーエージェントに便利な名前を付けましょう。アプリケーションのスクリプトを選択します。About URLは空欄でもかまいません。リダイレクトボックスに任意のアドレスを記入する。
アプリケーションの作成」を押すと、次のような画面が表示され、アプリケーションの一覧が表示されます。アプリケーション名の下にある数字はクライアントIDを表し、このIDの下にクライアントシークレットが配置されています。これらの値を credentials.py ファイルにコピーします。
Instagramへのアクセスは、TwitterやRedditとは異なります。アプリに登録する必要はなく、ユーザー名とパスワードを使用します。別途、公開アカウントを作成し、この情報をボット用に使用することをお勧めします。
エビを使うには2つのステップが必要です。まず、prawのRedditメソッドに1つの関数呼び出しとしてアクセスするように設定します。そして、初期化されたオブジェクトを使って、new()メソッドでsubredditを検索してください。
import prawfrom 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 = 10for submission in my_reddit.subreddit(sub_name).new(limit=max_posts):print(submission.title)変更
sub_name変数が異なるサブサイトから記事を取得する代わりに
new()などの方法もあります。
hot()募集職種は以下の通りです。
Instagram APIを使用する最初のステップは、クライアントIDとパスワードを使ってオブジェクトを設定することです。その後、login()メソッドを直接呼び出すことで設定が完了します。
from InstagramAPI import InstagramAPIfrom credentials import instagram_client_id, instagram_client_secretmy_insta_api = InstagramAPI(instagram_client_id,instagram_client_secret)my_insta_api.login()APIを使うには、Redditより少し複雑です。この例では、スクリプトは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 imagesfor item in my_insta_api.LastJson['items']:if item['media_type'] == 1 and 'image_versi***2' in item.keys():candidate = get_largest_image(item['image_versi***2']['candidates'])# get image filename = self.save_image_from_candidate(candidate['url'])if filename != '':# get status, save as tuplecaption = get_caption(item)images.append((filename, caption))if len(images) >= num_images:break return imagesInstagramは、JSONレスポンスで画像の「候補」のリストを送信します。メディアを最高の解像度で表示するために、これらの画像のうち最も大きなものが選択されます。
def get_largest_image(candidates):candidate = {}pixels = 0for cand in candidates:# pick the highest resolution oneres = cand['height']*cand['width']if res > pixels:pixels = rescandidate = candreturn candidate次に、画像へのリンクが見つかったら、その内容をファイルに書き出すことで、ローカルに画像を保存することができます。
requestsこれをシンプルにわかりやすくしたのが、このライブラリです。
def save_image_from_candidate(url): filename = '' resp***e = requests.get(url) # check the resp***e status code, 200 means good if resp***e.status_code == 200: filename = url.split("/")[-1].split('?')[0] with open(filename, 'wb') as f: f.write(resp***e.content) return filenameまず、シークレットとキーを使ってTwitterのアクセス権を設定する必要があります。
import tweepyfrom credentials import *tw_auth = tweepy.OAuthHandler(twitter_c***umer_key, twitter_c***umer_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_hashtagInstagramのボットの初期の機能は、Twitterに写真とキャプションを投稿することでした。
また、TwitterボットはRedditの新しい投稿を検索し、それらの投稿をツイートすることもできます。この2つの機能を合わせると、次のようになります。
# use r/<hashtag> for reddit search# and #<hashtag> for instagram searchhashtag = 'technology'num_posts = 5# tweet reddit inforeddit_posts = my_reddit.subreddit(hashtag).new(limit=num_posts)for submission in reddit_posts:title = submission.titleurl = 'www.reddit.com{}'.format(submission.permalink)tweet_str = f'Reddit r/{sub} update:{title} #{sub} {url}'tweet_str = trim_to_280(tweet_str)tw_api.update(tweet_str)# tweet instagram mediamedia_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これで、あるサイトから別のサイトへメディアを引き込むためのコードの束ができたわけです。また、ミックスして使用することも可能です。ツイートを引っ張ってきてRedditに投稿したり、Instagramの画像を集めてサブRedditに投稿したり、ボットを作って本物のインターネットの一部になる。
最後に、完全に自動化するためには、サーバー上でボットをループで動作させる必要があります。これは、自分のパソコンでタイムスケジュールを決めて行うこともできます。また、押入れに眠っているRaspberry Piを使って、かわいいTwitterボットプロジェクトをチェックすることもできます。