初投稿です
初投稿です。緊張しながら書いてます。
ドキドキです。ドキドqiitaです。
はじめに
結論から言うと、出来としては微妙です。
技術力的に足りない部分や
Twitter Apiのアカウントの制限もあります。
それとアドバイスなどありましたらコメントください。
目的
社内で行っているTwitterボーナスの集計を
Twitter APIを使って効率よく集計することが目的です。
ツイート数を集計する上で以下の条件があります
- コメントがないリツイートは含まない
- 他人へのツイートへのリプライは含まない
- ただし自分へのツイートにぶら下げたリプライは含める
環境
Python 3.9.7
それとTwitter APIの開発者アカウントを申請済みであることが前提条件です。
申請する方法に関しては他の方がまとめているので参考にしてください。
https://qiita.com/taishi0202/items/092c267c0c6dc68347c5
tweepyのインストール
先にTwitter APIを利用するためにtweepyというライブラリをインストールしておきます。
なくても可能らしいですが、あったほうがいいと思います。
pip install tweepy
Tweetの集計
import tweepy
#用意しておいたAPIトークン
API_Key = "******************"
API_Sec = "******************"
Token = "******************"
Token_Sec = "******************"
BEARER = "******************"
#API認証
client = tweepy.Client(bearer_token=BEARER, consumer_key=API_Key, consumer_secret=API_Sec, access_token=Token, access_token_secret=Token_Sec)
auth = tweepy.OAuthHandler(API_Key, API_Sec)
auth.set_access_token(Token, Token_Sec)
api = tweepy.API(auth)
count=10 # 取得数(上限は200)
screen_name="cydas_ouchi" # ユーザ名(@以降)
since = "2022/04/01" # この日付から
until = "2022/05/01" # この日付まで
#ツイートの取得
tweets_data = api.user_timeline(screen_name=screen_name, count=count)
if tweets_data != None:
tweetCount = 0
for tweet in tweets_data:
#日付をYYYY/MM/DDに変換
tweetDate = tweet.created_at.strftime('%Y/%m/%d')
#指定した日付を超えたら終了
if since > tweetDate: break
#指定した日付までスキップ
if until < tweetDate: continue
#リプライ先の名前を取得
reply_to_screen_name = tweet.in_reply_to_screen_name
#リツイートの場合はカウントしない
if 'RT @' in tweet.text[:4]: continue
#リプライ先が自分のツイート以外ならカウントしない
if reply_to_screen_name != None:
if reply_to_screen_name != screen_name:
continue
#ツイート数をカウント
tweetCount+=1
#最後に取得した日付を比較
if tweetDate > since:
print('取得数が足りません')
else:
print(tweetCount)
取得に成功するとターミナルに
3
とツイート数が表示されます。
取得数が足りず指定した日付より前で処理が終了した場合は
取得数が足りません
と表示されます。
開発者アカウントの権限がElevated(申請すれば無料のやつ)なので
普通の検索で使えるsinceやuntilが使えないです。
なので無理やりそれっぽく実装しています。
if since > tweetDate: break
if until < tweetDate: continue
リツイートには取得テキストデータの最初にRT @
が付きますが
コメント付きのリツイートは、取得データの最初にRT @
がつかないので
先頭の4文字にRT @がついているかどうかで判定しています。
if 'RT @' in tweet.text[:4]: continue
tweet.in_reply_to_screen_name
でリプライ先を取得して
screen_name
の名前と一致するかどうかで
自分へのリプライかどうかを判定しています。
if reply_to_screen_name != None:
if reply_to_screen_name != screen_name:
continue
改善点
- そもそも最大取得数が200件のため、ツイート数が多い人は正確に集計できない。
- 最新のものから遡っていくため直近1ヶ月〜2ヶ月ぐらいしか遡れない。
start_id
などの引数をうまく使えば昔のツイートも遡れる?
もっといい方法知っている方いたら教えてください。
まとめ
改善点も多いですが、形には出来て良かったです。
またTwitter APIやPythonなど普段の業務では使わない技術に
触れることができたのは新鮮で楽しかったです。
あとずっと書こうと思っていたQiitaデビューできて嬉しいです。
なんならQiita書くことが目的になっていたような気もします。