見出し画像

Pythonライブラリ:Tweepy

概要

TweepyはTwitter操作をAPIで実施でき下記のような操作が可能です。APIを使いすぎると一時的にロックがかかるTweepError: Twitter error response: status code = 429ためご留意ください。

●Bot作成:自動で所定のツイートを投稿してくれる
●いいねの自動化:友達のツイートに"いいね"を自動で押す私には不要ですが・・
●フォロワー情報の抽出:特定の人のフォロワー名やIDを抽出
●★ツイート解析:最新ツイートを利用してマーケティングに活用

1.環境構築

TweepyはTwitter APIを使用するため「Twitter Developersページ」からAPI登録をして”Consumer API Keysconsumer_key, consumer_secret”と”アクセストークン情報access_token, access_token_secret”の発行が必要です。
API登録は「twitter api 登録」などで事前に調べてから実施してください自力でやると最悪登録できません
最終的にconsumer_key, consumer_secret, access_token, access_token_secretの4つが取得できます。Tweepyのコード作成時にこれらを直打ちしてもよいですが、他人に見せるものではないので記事では下記で使用します。

[tokenfile.json]※Textファイルみたいな形で拡張子をjsonにしたらok
{
   "consumer_key":"xxxx",
   "consumer_secret":"yyyy",
   "access_token":"zzzz",
   "access_token_secret":"tttt"
}
[In]
import json
class Tokens():
   def __init__(self):
       filepath = 'tokenfile.json'
       with open(filepath, 'r') as f:
           tokens = json.load(f)
       for key, value in tokens.items():
           setattr(self, key, value)

tokens = Tokens()
print(tokens.consumer_key, tokens.consumer_secret, tokens.access_token, tokens.access_token_secret)

[Out]
xxxx, yyyy, zzzz, tttt

2.OAuth認証:OAuthHandler

作成したトークン情報をTwitter側に渡して自分のアカウントで接続します。下記のシンプルなコードだけで接続可能です。

[In]
import tweepy

auth = tweepy.OAuthHandler(tokens.consumer_key, tokens.consumer_secret)
auth.set_access_token(tokens.access_token, tokens.access_token_secret)

api = tweepy.API(auth)

おそらくOAuthで接続しており裏側の技術が複雑なため章分けしております。参考として、下記Qiita記事を載せておきます。

3.自分の情報、タイムライン取得

【自分の情報取得:api.me()】
自身のTwitterアカウント情報は下記で取得できます。

[In]
import tweepy

auth = tweepy.OAuthHandler(tokens.consumer_key, tokens.consumer_secret) 
auth.set_access_token(tokens.access_token, tokens.access_token_secret)
api = tweepy.API(auth) #Twitterオブジェクトの生成

print('ID情報:', api.me().id) #自分のIDを取得
print('名前:', api.me().name, '表示名', api.me().screen_name) #自分の名前を取得
print('場所:', api.me().location) #自分の場所を取得
print('フォロー数:',api.me().friends_count)
print('フォロワー数:', api.me().followers_count)
print('Twitter開始日:',api.me().created_at)
print(api.me().description) # プロフィールコメント表示
[Out]
ID情報: 自分ので確認してね
名前: 自分ので確認してね 表示名 自分ので確認してね
場所: 大阪市
フォロー数: 214
フォロワー数: 111
Twitter開始日: 2010-02-13 04:27:11
自分ので確認してね

【自分のタイムライン取得:api.home()_timeline()】
自身のTwitterアカウントのタイムラインは下記で取得できます。

[In]
public_tweets = api.home_timeline()
for tweet in public_tweets:
   print('*'*100)
   print(tweet.text)

[Out]   
-------------------------
投票完了😶‍🌫️😶‍🌫️😶‍🌫️
-------------------------
買い物いこ
-------------------------
1日の終わりはべラジオの噴水ショーだな! https://t.co/VYXKQUOVVE
-------------------------
きょうは衆院選の投開票日です。午後8時ちょうどに各党の議席や与野党勢力の予測を速報!出口調査と情勢取材をもとにNHKが総力をあげ分析・放送します。そして各候補の当落もいち早くお伝えします。… https://t.co/ACsqYzEOpL
-------------------------
【関西スーパー争奪戦は僅差で決着、「死闘」が遺した爪痕】
関西スーパーマーケットの臨時株主総会が1029日に開かれ、エイチ・ツー・オー リテイリング(H2O)と経営統合する議案が承認されました。承認には3分の2以上の賛同が必要で… https://t.co/QQ0Rr10wpz
-------------------------
散歩ついでに投票でも行こうかね
-------------------------
今日はやっと1回目のワクチンです
-------------------------
住友グループの結束の強さは、グループの中心に共通の精神的な支柱となる家長がいるからだといわれます。確かに、「緩やかな連携」を保つ三井グループ各社は、三井家について口にすることがほとんどありません。三井家の事業の原点である「越後屋」… https://t.co/Qd73lP8ELT
-------------------------

4.特定アカウントの情報抽出:api.get_user()

api.get_user(アカウント名)によりapi.me()と同じ形で情報抽出できます。せっかくなので関数化したパターンを記載しました(記法は下記記事参照)上記と同じく箇条書きでもOK

[In]
def get_user_info(screen_name):
   getitems=['id', 'name', 'screen_name','location', 'friends_count', 'followers_count', 'created_at', 'description']
   getitemnames=['ID情報', '表示名', 'アカウント名','場所', 'フォロー数', 'フォロワー数', '開始日', '詳細']
   for item, itemname in zip(getitems, getitemnames):
       print(itemname, api.get_user(screen_name).__getattribute__(item))

get_user_info('osakacoronaV')
[Out]
ID情報 1427949440673800195
表示名 大阪府新型コロナワクチン公式
アカウント名 osakacoronaV
場所 
フォロー数 0
フォロワー数 50635
開始日 2021-08-18 11:08:45
詳細 大阪府新型コロナワクチンの公式アカウント。ワクチン接種に関する正しい情報や国の広報などをつぶやきます。※原則、リフォローやリツイートなどは行っておりません。運用ポリシーhttps://t.co/wQ02DR4Djv

5.メッセージ投稿:api.update_status()

update_statusメソッドでTwitterに投稿が可能です。また投稿文の最初に@送りたい人のscreen_nameで返信もできます。

[In]
import datetime
today = datetime.datetime.now().strftime('%Y年%m月%d日')
api.update_status(f'Tweepyからapi.update_status()で投稿_{today}') 

[Out] Twitterの投稿を確認してね

6.ツイート取得:Cursor記法

タイムライン情報を取得するために旧表記とCursor新表記があります。詳細は「Cursor Tutorial」のとおりであり基本的にCursorを使用します。

画像1

Cursorのメリットは下記の通りです。

●旧形式よりツイート取得数が増えるはず
●記載方法がより簡易になります。

6-1.自分のツイート取得

自分のタイムライン取得方法は2通りです。
【items():ツイート数を指定】

[In]
from datetime import timedelta # 取得されるタイムゾーンが異なるため、日本時間に修正

for idx, status in enumerate(tweepy.Cursor(api.user_timeline).items(5)):
   print('='*20 + f'タイムライン番号:{idx+1}' + '='*40)
   print('ツイート時間:', status.created_at + timedelta(hours=+9))
   print('ツイートID:', status.id)
   print(status.text, '\n')

[Out]  自分が投稿した5つのツイートが確認できます。

【pages():ページ数1page20ツイートを指定】

[In]
for idx, page in enumerate(tweepy.Cursor(api.user_timeline).pages(2)): # page is a list of statuses
   idx = idx * 20
   for tweet in page:
       idx += 1
       print(f'ツイート{idx}:', tweet.text)

[Out] 自分が投稿した40個のツイートが確認できます。 

6-2.他人のツイート取得

基本的には上と同じです。情報追加してみました。
【items():ツイート数を指定】

[In]
for i, status in enumerate(tweepy.Cursor(api.user_timeline, id = 'osakacoronaV').items(50)):
   print(f'{i}番目ツイート:', status.created_at + timedelta(hours=+9) ,status.text)
   print('='*60)

[Out]   
1番目ツイート: 2021-10-31 10:00:00 【大阪府コロナワクチン接種センター 本日最終日‼️】
本日をもって府が設置するすべての会場で1回目接種が終了します💉
予約されていない方も、会場での当日受付で接種できますので、直接ご来場下さい。
(受付時間:9時~20時)
※予約… https://t.co/PS2qoaCUFW
============================================================
2番目ツイート: 2021-10-31 07:00:01 【大阪府コロナワクチン接種センター 本日最終日‼️】
本日をもって府が設置するすべての会場で1回目接種が終了します💉
予約されていない方も、会場での当日受付で接種できますので、直接ご来場下さい。
(受付時間:9時~20時)
※予約… https://t.co/YEW2dxRuKk
============================================================
3番目ツイート: 2021-10-30 08:00:01 【大阪府コロナワクチン接種センター あと2日❗️】
以下省略

【pages():ページ数1page20ツイートを指定】
関数化してみました

[In]
def get_user_timeline(screen_name, pages):
   getitems=['id', 'favorite_count', 'retweet_count']
   getitemnames=['ID情報','お気に入り数', 'リツイート数']

   for idx, page in enumerate(tweepy.Cursor(api.user_timeline, id = screen_name).pages(pages)):
       idx = idx * 20
       for tweet in page:
           idx += 1
           print(f'ツイート{idx}:', tweet.created_at + timedelta(hours=+9))
           print([(itemname, tweet.__getattribute__(item)) for item, itemname in zip(getitems, getitemnames)])
           print(tweet.text)

get_user_timeline(screen_name='osakacoronaV', pages=2)

[Out]
ツイート12021-10-31 13:00:00
[('ID情報', 1454659394931605509), ('お気に入り数', 82), ('リツイート数', 123)]
【大阪府コロナワクチン接種センター 本日最終日‼️】
本日をもって府が設置するすべての会場で1回目接種が終了します💉
予約されていない方も、会場での当日受付で接種できますので、直接ご来場下さい。
(受付時間:9時~20時)
※予約… https://t.co/8O6GADiz59 

ツイート22021-10-31 10:00:00
[('ID情報', 1454614094779199495), ('お気に入り数', 112), ('リツイート数', 191)]
【大阪府コロナワクチン接種センター 本日最終日‼️】
本日をもって府が設置するすべての会場で1回目接種が終了します💉
予約されていない方も、会場での当日受付で接種できますので、直接ご来場下さい。
(受付時間:9時~20時)
※予約… https://t.co/PS2qoaCUFW 

ツイート32021-10-31 07:00:01
[('ID情報', 1454568802583154689), ('お気に入り数', 150), ('リツイート数', 221)]

7.Keyword検索:api.search()

Twitterからkeyword検索でツイート一覧を取得できます。if文でリプ先頭が@だけでなくリツイート先頭がRTもはじけますが取得したデータからはじくため取得件数が減ります。よってfilterをかけるのが良いです。

[In]
import tweepy
import pandas as pd
from datetime import datetime, timedelta

auth = tweepy.OAuthHandler(tokens.consumer_key, tokens.consumer_secret) 
auth.set_access_token(tokens.access_token, tokens.access_token_secret)
api = tweepy.API(auth) #Twitterオブジェクトの生成

#事前処理
rtfilter = " -filter:retweets" #RTをはじく
tweet_list=[] #ツイートを格納するリスト
df = pd.DataFrame(columns = ['ツイートのID', 'ツイートした時間','ユーザ名', 'スクリーンネーム', 'ツイート本文', 'フォロー数', 'フォロワー数', '概要(自己紹介が書かれているやつ)', 'お気に入り数', 'リツイート数'])

keyword = "選挙" #検索キーワード
for idx, tweet in enumerate(tweepy.Cursor(api.search, q=keyword+rtfilter, locale="ja",tweet_mode='extended').items(200)):
   if tweet.full_text[0] != '@': #@をはじく(返信は除く)
       df.loc[idx] = [tweet.id, tweet.created_at + timedelta(hours=+9), tweet.user.name, tweet.user.screen_name, tweet.full_text , \
                 tweet.user.friends_count, tweet.user.followers_count, tweet.user.description, tweet.favorite_count, tweet.retweet_count]

display(df)
df.to_excel(f'{datetime.now().strftime("%y%m%d")}_twitter-api_{keyword}.xlsx')

[Out]

画像2

【参考】その他できること

参考としてできることを記載しておきます(参考:。APIリファレンス)。

すべてのフォロワーをフォロー:for文でfollower.follow()を実行
●Twitter Bot作成:Herokuなどのクラウドを使用したりして定期実行する。

あとがき

もう少し記載したいこともありますが、とりあえず先出します。

本当は出力を全部見せたかったけどツイートが酷い半分下ネタので全部見せれなかったのは残念・・・・


この記事が気に入ったらサポートをしてみませんか?