まりものメモ帳

なぐり書き

PythonでTwitterのAPIを叩いた時の話(Tweepy)

すごい久しぶりの更新ですね。みなさんこんにちはまりもです。定期試験終了芸からの華麗なるブログ更新といきたいと思います。
今回はpythonを用いてTwitterAPIを叩いて自動でツイートをふぁぼる所まで行きますよ。

Twitter Developersに登録

こいつに登録して

  • CONSUMER_KEY
  • CONSUMER_SECRET
  • ACCESS_TOKEN
  • ACCESS_TOKEN_SECRET

の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にいろんな機能が備わってることを知りました。色々改良していけばCUITwitterも出来るのではないでしょうか。あと、今回これの試走のためにメッチャいろんな人をふぁぼりました。急に知らない人からふぁぼられた人、ごめんなさい。
全体的に日本語が終わってますが以上です。お疲れ様でした。
==========

追記(2018-07-18[1])

「色々改良していけばCUITwitterも出来るのではないでしょうか」←これをざっと作ったのでコードの解説は特にせずに置くだけおいておきます。たぶん動く。
まずこれを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