2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】社内のTwitterボーナスの集計を楽にしたい(したかった)

Last updated at Posted at 2022-06-10

初投稿です

初投稿です。緊張しながら書いてます。
ドキドキです。ドキド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の集計

getTweet.py
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書くことが目的になっていたような気もします。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?