PythonでTwitterのAPIを叩いた時の話(Tweepy)
すごい久しぶりの更新ですね。みなさんこんにちはまりもです。定期試験終了芸からの華麗なるブログ更新といきたいと思います。
今回はpythonを用いてTwitterのAPIを叩いて自動でツイートをふぁぼる所まで行きますよ。
Twitter Developersに登録
こいつに登録して
の4つをゲットして行きます。
Twitter Application ManagementにアクセスしてCreate New Appをクリック、必要な情報をぱらぱら入力していきます。なお、このときアカウントに電話番号が紐付けされてないといけないので注意して下さい。
それが終わるとCONSUMER_KEYとCONSUMER_SECRETの2つが確認出来ると思います。Access Tokenについてはこの時点ではまだ発行されていないのでCreate my access tokenをクリックしてゲットします。これで4つの情報がゲット出来たので以下のようなコードを書いてみましょう。ファイル名はtauth.pyとして下さい。
#coding:UTF-8 import tweepy CONSUMER_KEY = "XXXXXXXXXXXXXXXXXXXX" CONSUMER_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) ACCESS_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" print("auth") auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) print("Done!")
XXXXXXXには自分の情報を入力します。これでTwitterの認証が出来ます。
ちょっと待って!tweepyが入ってないやん!
という方はターミナルに
$ pip install tweepy
と入力して下さい。これで入ります。
tweepyでツイートしてみる
さっきのプログラムでDone!が表示されたら認証完了です。それでは実際にツイートしてみましょう。以下コードです(このときtauth.pyは同じディレクトリ内に入れといて下さい)。
#coding:UTF-8 import tweepy import tauth api = tauth.api #apiインスタンスを作成 print("tweet") api.update_status("やったぜ。") #ツイート print("Done!")
さっき作ったtauth君のimportを行い認証し、api.update_status("ツイート内容")でツイートしてます。これでtweepyでツイート出来ました。やったぜ。(ちなみに、これ連続して実行するとエラー返します。重複してるツイートと判断されている?)
キーワードを含むツイートの表示といいね
今度はあるキーワードを含むツイートを検索して何件か表示させ、それにふぁぼをつけていきます。コードは以下のようになります。
#coding:UTF-8 import tweepy import tauth import sys api = tauth.api q = "絶起" #検索するキーワード count = 3 #表示させるツイート数 search_res = api.search(q = q,count = count) for res in search_res: user_id = res.id print(user_id) #ツイートIDの表示 username = res.user.name print(username) #アカウント名の表示 tweet = res.text print(tweet) #ツイートの表示 try: api.create_favorite(user_id) #ふぁぼる sys.stdout.write(username) print("をふぁぼりました") except: #既にふぁぼってる時に実行 pass print("------------------") #区分け線 print("Done!")
ここでは、"絶起"が含まれる3件の最新ツイートの表示&ふぁぼを行ってます。ふぁぼはapi.create_favorite(ツイートID)でやります。このようにふぁぼったりRTしたりする関数が色々あるので興味のある方は一度調べてみてはどうでしょうか。
qとcountの値を変えればもちろん結果もそのように変わります。
実行結果はこのようになりました。
auth Done! 1017696702675935232 ぽよ RT @********(IDは伏せました): 飯田「絶望してないから絶起ではない」 ぽよをふぁぼりました ------------------ (途中省略) ------------------ Done!
悲しいツイートがいっぱい出てくる出てくる。自動ふぁぼ生成機が出来たところでここらへんにしようと思います。
最後に
tweepyにいろんな機能が備わってることを知りました。色々改良していけばCUI版Twitterも出来るのではないでしょうか。あと、今回これの試走のためにメッチャいろんな人をふぁぼりました。急に知らない人からふぁぼられた人、ごめんなさい。
全体的に日本語が終わってますが以上です。お疲れ様でした。
==========
追記(2018-07-18[1])
「色々改良していけばCUI版Twitterも出来るのではないでしょうか」←これをざっと作ったのでコードの解説は特にせずに置くだけおいておきます。たぶん動く。
まずこれをpycolor.pyとして保存して下さい。(コンソールに色付きの出力をする方法のコードをそのまま引っ張ってきました。ありがとうございます。)
class pycolor: BLACK = '\033[30m' RED = '\033[31m' GREEN = '\033[32m' YELLOW = '\033[33m' BLUE = '\033[34m' PURPLE = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' END = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' INVISIBLE = '\033[08m' REVERCE = '\033[07m'
これがメインのコードです。
#coding:UTF-8 import tweepy import tauth import sys import datetime from pycolor import pycolor #pycolor.pyをこれと同ディレクトリに配置しておいて下さい api = tauth.api print(pycolor.YELLOW) print("############################") print("# #") print("# Welcome to Cuitter #") print("# #") print("############################") print(pycolor.END) print("コマンドを入力して下さい。終了したい時はqかexitと入力して下さい。\nhelpでhelpページを表示します。") try: while True: command = raw_input(">>> ") if command == "tl": for timeline in api.home_timeline(count = 10): username = timeline.user.name userid = timeline.user.screen_name tweetid = timeline.id d = timeline.created_at tweettime = d + datetime.timedelta(hours = 9) tweet = timeline.text if timeline.user.protected: lock = "(locked account)" else: lock = "" print(pycolor.BOLD + username + pycolor.END + " @" + str(userid) + " " + str(lock)) print("tweetID:" + str(tweetid)) print(tweettime) print("\n" + tweet) print("------------------") print("Done!") elif command in {"q","exit"}: print("Good Bye!") break elif command == "tweet": print("ツイート内容を入力して下さい。やめたい時はqtと入力して下さい。") comtweet = raw_input(pycolor.BLUE + "tweet>>> " + pycolor.END) if comtweet == "qt": print("中止しました。") continue elif len(comtweet) > 140: print("文字数が140文字より多いです({}文字)。中止します。".format(len(comtweet))) continue else: api.update_status(str(comtweet)) print("Done!") elif command in {"fav","like"}: try: print("tweetIDを入力して下さい。") favtweet = raw_input(pycolor.GREEN + "tweetID>>> " + pycolor.END) api.create_favorite(favtweet) print("いいねしました。") except: print("Error!") elif command == "rt": try: print("tweetIDを入力して下さい。") retweet = raw_input(pycolor.GREEN + "tweetID>>> " + pycolor.END) api.retweet(retweet) print("RTしました。") except: print("Error!") elif command == "about": try: print("IDを入力して下さい。") aboutid = raw_input(pycolor.RED + "ID>>> " + pycolor.END) aboutuser = api.get_user(aboutid) print(pycolor.BOLD + aboutuser.name + pycolor.END + " @" + aboutuser.screen_name) if aboutuser.protected: print(pycolor.PURPLE + "Locked Account" + pycolor.END) print(aboutuser.description) print("ツイート:" + str(aboutuser.statuses_count)) print("フォロー:" + str(aboutuser.friends_count) + " フォロワー:" + str(aboutuser.followers_count)) #print(aboutuser) except: print("Error!") elif command == "follow": try: print("IDを入力して下さい。") followid = raw_input(pycolor.RED + "ID>>> " + pycolor.END) api.create_friendship(followid) print("フォローしました。") except: print("Error!") elif command == "remove": try: print("IDを入力して下さい。") removeid = raw_input(pycolor.RED + "ID>>> " + pycolor.END) api.destroy_friendship(removeid) print("リムーブしました。") except: print("Error!") elif command == "help": print("tl -> TLを表示します。") print("tweet -> ツイートします。") print("q,exit -> 終了します。") print("help -> helpページを表示します。") print("fav,like -> 指定されたtweetIDをふぁぼします。") print("rt -> 指定されたtweetIDをRTします。") print("about -> 指定されたuserIDについての情報を表示します。") print("follow -> 指定されたuserIDをフォローします。") print("remove -> 指定されたuserIDをリムーブします。") else: print("コマンドが見つかりません。再度試して下さい。") except KeyboardInterrupt: print("\nGood Bye!")
elifの嵐でいかにもクソコードって感じですが、僕の力量ではこれぐらいしか出来ませんでした。python君switch-case無いので。
機能
・TLを表示
・ツイートする
・ふぁぼ、RTする
・プロフィールの表示を行う
・フォロー、リムーブを行う(今気付いたけどブロック・ミュート入れ忘れた…)
いつかはこのコードの説明とかして行きたいと思います。
==========
追追記(2018-07-18[2])
今日Windowsを使っている友達にやってもらったのですが、raw_inputではundefinedとエラーが出るみたいです。raw_inputの所をinputにすれば直りました。これは、Windowsどうのこうの話ではなくpython3ではraw_input関数が無く代わりにinput関数が使われるためみたいです(本記事はPython 2.7.15rc1を使用しています。ちゃんと明記しておくべきだった…)。(追記2018-07-28)
あと、コマンドプロンプトではエスケープシーケンスが使えないとのこと…うーむ。
ググってたらansiconというツールが鍵みたいです。一応サイトをここに貼っておきます。
Windows でも ANSI エスケープしたい | ごみばこいん Blog