TwitterAPIでTwitterいいね数30以上をGoogleスプレッドシートに追加
こんにちは。
本日はTwitterAPIを使って特定アカウントのいいね数が30以上ならば、そのツイートをGoogleスプレッドシートに追加するプログラムをPythonで書いていこうと思います。
以前に、TwitterAPIを使ってGoogleスプレッドシートに記載した内容を1日2回ランダムにツイートしていくという記事を書きました。ほとんどが無料ですので興味ある方はお読みください。
※本記事はTwitterAPIの取得済み、かつGoogleスプレッドシートが操作できる状態であることが大前提です。
最後に全体のコードを載せているので手っ取り早く使いたい方は最後まで飛んでください(^^)/
特定のアカウントのツイートを拾う
今回はこちらの3名の方のツイートを拾うプログランムを作ります。
@ally_of_earth
@mimikousi
@t_kun_kamakiri
こちらの方のツイートを拾うため辞書型で用意しておきます。
user_list = {
'eco':'ally_of_earth',
'kamakiri':'t_kun_kamakiri',
'kousi':'mimikousi'
}
必要なライブラリをインポート
import tweepy
# グーグルスプレッドシートを操作する為にimport
import time
import os
from dotenv import find_dotenv, load_dotenv
import json
アクセスキーなど個人情報に関わるものは.envファイルに書いて同じフォルダ内に置いておきます。
#エンドポイント(TwitterAPI)
env_file = find_dotenv()
load_dotenv(env_file) # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
フォルダ内は今こんな感じ。
以下でツイート200件を取得できます。
api = tweepy.API(auth)
tweets = api.user_timeline(
id=user_list['kamakiri'],
count=200,
include_rts =False,
exclude_replies=True,
) # defaultで20個取得
tweepyのドキュメントを見て好みに応じてオプションをつけてください。
ツイートが取得できているか確認してみます。
for i, tweet in enumerate(tweets):
print(i,'='*100)
print(tweet.text)
print(f'fav:{tweet.favorite_count}')
print(f'retweeted:{tweet.retweeted}')
print(f'id:{tweet.id}')
ここまでをまとめると・・・
import tweepy
# グーグルスプレッドシートを操作する為にimport
import time
import os
from dotenv import find_dotenv, load_dotenv
import json
env_file = find_dotenv()
load_dotenv(env_file) # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)
api = tweepy.API(auth)
user_list = {
'eco':'ally_of_earth',
'kamakiri':'t_kun_kamakiri',
'kousi':'mimikousi'
}
tweets = api.user_timeline(
id=user_list['kamakiri'],
count=200,
include_rts =False,
exclude_replies=True,
) # defaultで20個取得
この書き方だと上限200件までしか取得できないので、もっと取得したい場合は以下の書き方をします。
ツイート2000件取得
ここからはツイート頻度も高く、いいね数も多いエコおじいさんのツイートを取り扱っていこうと思います。
ツイート2000件取得します。
# 必要なモジュールのimport
import datetime
import pandas as pd
import tweepy
env_file = find_dotenv()
load_dotenv(env_file) # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
# 認証のためのAPIキーをセット
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)
api = tweepy.API(auth)
user_list = {
'eco':'ally_of_earth',
'kamakiri':'t_kun_kamakiri',
'kousi':'mimikousi'
}
user_name = user_list['eco']
# 取得ツイートの数
num = 2000
rlcount = 1
tweet_data = []
# tweepy.CursorのAPIのキーワードサーチを使用(api.search)
tweets = tweepy.Cursor(api.user_timeline,
id=user_name,
exclude_replies = True,
include_rts =False,
tweet_mode='extended').items(num)
for tweet in tweets:
# いいねとリツイートの合計がrlcuont以上の条件
if tweet.favorite_count + tweet.retweet_count >= rlcount:
tweet_data.append([
tweet.user.name,
tweet.user.screen_name,
tweet.retweet_count,
tweet.favorite_count,
tweet.created_at.strftime('%Y-%m-%d'),
tweet.full_text.replace('\n', '')
])
今、tweet_dataはリストでこのようになっています。
pandasデータフレームにする
さきほど取得したツイートのリスト型をpandasデータフレームに置き換えます。Pandasにした方がデータの取り扱いのためのメソッドが多いためです。
import pandas as pd
df = pd.DataFrame(tweet_data,
columns=['user_name', 'user_screen_name', 'rt', 'fav', 'date', 'text'])
df
1日何ツイートしているかを確認
df.groupby('date').count()
1日平均ツイート数を調べます。
df.groupby('date').count()['user_name'].mean()
df.groupby('date').count()['user_name'].max()
1日平均約4ツイート、最大で13ツイートしているときがありますね。
平均いいね数を調査
いいね数が100以上はなかなか起こらず、統計データを狂わしている可能性があるので100以上は除外することにします。
df[df['fav']<=100].describe()
1ツイートは平均して約13いいね。標準偏差は約13。
なのでいいね数が正規分布に従うとして3σの13+3*13=39いいね数以上を@ally_of_earthさんにとってウケの良いツイートということにします。
しかし、いいね数が正規分布になっているという保証はどこにもありません。確認すると確かに正規分布とは言い難いです💦
いいね数のヒストグラムが正規分とするのは無理がありますが、ひとまず雑に正規分としてざっくり考えます。
いいね数39だとちょっと確率的に送りにくいのでざっくり、いいね数30以上のツイートだけを拾って、それをGoogleスプレッドシートに追加していくようにします。
5日前のいいね数30以上のツイートのみを取得
今の日付から5日前の日付までのツイートのみ取得してツイートを絞り込みます。
まず5日前までの全てのツイートを取得します。
そのために確実にツイートで拾える数numを指定します。
1日最大で13ツイートだったので、13*5日 なので、ざっくりnum = 15*5となるように書きます。
rlcount = 1
user = 'eco'
favcount = 30
delta_t = 3
num = 15 * delta_t
そして日付を指定する記述を書いておきます。
nowadays = datetime.now()
yesterday = (nowadays - timedelta(5)).strftime('%Y-%m-%d')
まとめるとこちらです。
# 必要なモジュールのimport
from datetime import datetime, timedelta
import pandas as pd
import tweepy
import pandas as pd
env_file = find_dotenv()
load_dotenv(env_file) # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
# 認証のためのAPIキーをセット
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)
api = tweepy.API(auth)
user_list = {
'eco':'ally_of_earth',
'kamakiri':'t_kun_kamakiri',
'kousi':'mimikousi'
}
user_name = user_list['eco']
# 取得ツイートの数
rlcount = 1
user = 'eco'
favcount = 30
delta_t = 3
num = 15 * delta_t
tweet_data = []
# tweepy.CursorのAPIのキーワードサーチを使用(api.search)
tweets = tweepy.Cursor(api.user_timeline,
id=user_list[user],
exclude_replies = True,
include_rts =False,
tweet_mode='extended').items(num)
for tweet in tweets:
# いいねとリツイートの合計がrlcuont以上の条件
if tweet.favorite_count + tweet.retweet_count >= rlcount:
tweet_data.append([
tweet.user.name,
tweet.user.screen_name,
tweet.retweet_count,
tweet.favorite_count,
tweet.created_at.strftime('%Y-%m-%d'),
tweet.full_text.replace('\n', '')
])
df = pd.DataFrame(tweet_data,
columns=['user_name', 'user_screen_name', 'rt', 'fav', 'date', 'text'])
nowadays = datetime.now()
yesterday = (nowadays - timedelta(5)).strftime('%Y-%m-%d')
df[(df['date']==yesterday) & (df['fav']>=favcount)]
5日前で30いいねとなっているツイートのみを取得できました。
1件だけ見つかりましたね。
スプレッドシートに追加
スプレッドシートへの追加の記述はこちらです。
import gspread
#ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from google.oauth2.service_account import Credentials
#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
#認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く
# 認証情報設定
credentials = ServiceAccountCredentials.from_json_keyfile_name("organic-duality-295411-65ee7e371b14.json")
# 共有設定したスプレッドシートのシート1を開く
SPREADSHEET_KEY = os.environ.get('SPREADSHEET_KEY')
#OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
#共有設定したスプレッドシートのワークブックを開く
# スプレッドシートを開く
workbook = gc.open_by_key(SPREADSHEET_KEY)
worksheet_tweet = workbook.worksheet('ツイート用')
# for text in
cell_value = worksheet_tweet.col_values(5)[4:]
# ツイートの追加
for i, tweet_text in enumerate(df[(df['date']==yesterday) & (df['fav']>=favcount)]['text']):
worksheet_tweet.update_cell(len(cell_value)+5+i, 5, tweet_text)
うまくツイートが追加されているかGoogleスプレッドシートを開いて確認してみてください。
上手く動作しているようです。
リツイートする
Googleスプレッドシートに転記するツイートを、ついでにリツイートするようにしましょう。
# リツイートする
if tweet.favorite_count >= favcount and tweet.created_at.strftime('%Y-%m-%d')==since:
api.retweet(tweet.id)
関数にまとめる
今ままでのコードをまとめます。
関数にするためには機能ごとに分解した方が良さそうですね。
メインの関数
ツイートの取得
pandasで日付からツイート選別
スプレッドシートに転記
# 必要なモジュールのimport
from datetime import datetime, timedelta
import pandas as pd
import tweepy
import pandas as pd
import gspread
from dotenv import find_dotenv, load_dotenv
import os
from oauth2client.service_account import ServiceAccountCredentials
#ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from google.oauth2.service_account import Credentials
#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
def main():
env_file = find_dotenv()
load_dotenv(env_file) # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
# 認証のためのAPIキーをセット
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)
api = tweepy.API(auth)
# 共有設定したスプレッドシートのシート1を開く
SPREADSHEET_KEY = os.environ.get('SPREADSHEET_KEY')
user = 'kousi'
favcount = 30
delta_t = 3
num = 15 * delta_t
user_ini = {
'eco':'y',
'kamakiri':'k',
'kousi':'i'
}
#1日のツイートの取得(いいね数の選別)
nowadays = datetime.now()
since = (nowadays - timedelta(delta_t)).strftime('%Y-%m-%d')
# ツイートの取得
tweet_data = tweet_get(api, user, num, since, favcount)
df = df_tweet_today(tweet_data, since, favcount)
print(since, df)
# スプレッドシートへの転記
spredsheet_update(SPREADSHEET_KEY, df, since, favcount, user, user_ini)
def tweet_get(api, user, num, since, favcount):
user_list = {
'eco':'ally_of_earth',
'kamakiri':'t_kun_kamakiri',
'kousi':'mimikousi'
}
if user not in user_list:
print('変数userをeco,kamakiri,kousiにしてください。')
user_name = user_list[user]
# 取得ツイートの数
rlcount = 1
tweet_data = []
# tweepy.CursorのAPIのキーワードサーチを使用(api.search)
tweets = tweepy.Cursor(api.user_timeline,
id=user_name,
exclude_replies = True,
include_rts =False,
tweet_mode='extended').items(num)
for tweet in tweets:
# いいねとリツイートの合計がrlcuont以上の条件
if tweet.favorite_count + tweet.retweet_count >= rlcount:
tweet_data.append([
tweet.user.name,
tweet.user.screen_name,
tweet.retweet_count,
tweet.favorite_count,
tweet.created_at.strftime('%Y-%m-%d'),
tweet.full_text.replace('\n', '')
])
# リツイートする
if tweet.favorite_count >= favcount and tweet.created_at.strftime('%Y-%m-%d')==since:
api.retweet(tweet.id)
return tweet_data
def df_tweet_today(tweet_data, since, favcount):
df = pd.DataFrame(tweet_data,
columns=['user_name', 'user_screen_name', 'rt', 'fav', 'date', 'text'])
print(df[(df['date']==since) & (df['fav']>=favcount)])
return df[(df['date']==since) & (df['fav']>=favcount)]
def spredsheet_update(SPREADSHEET_KEY, df, since, favcount, user, user_ini):
# スプレッドシート
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
#認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く
credentials = ServiceAccountCredentials.from_json_keyfile_name(
"organic-duality-295411-65ee7e371b14.json"
)
#OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
#共有設定したスプレッドシートのワークブックを開く
# スプレッドシートを開く
workbook = gc.open_by_key(SPREADSHEET_KEY)
worksheet_tweet = workbook.worksheet('ツイート用')
# for text in
cell_value = worksheet_tweet.col_values(5)[4:]
print(len(cell_value))
# ツイートの追加
for i, tweet_text in enumerate(df[(df['date']==since) & (df['fav']>=favcount)]['text']):
worksheet_tweet.update_cell(len(cell_value)+5+i, 2, user_ini[user])
worksheet_tweet.update_cell(len(cell_value)+5+i, 5, tweet_text)
if __name__ == "__main__":
main()
これで思った通りの動作ができていればOKです。
Herokuで定期実行
できたプログラムを定期実行させたい場合はherokuを使うのが簡単ですね。
以下の記事を見ながら無料ですぐに利用できます。
定期実行の頻度は1日1回にしているので、次の日に正常に動作しているかを確認することになります。
※正常に動作していました。
では、本日は以上です(^^♪
Twitter➡@t_kun_kamakiri
Instagram➡kamakiri1225
youtube➡https://www.youtube.com/channel/UCbG6_Q9ZRqqVT6YZOpcjDlQ
ブログ➡宇宙に入ったカマキリ(物理ブログ)
ココナラ➡物理の質問サポートサービス
コミュニティ➡製造業ブロガー