質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

Twitter API, Python を用い、特定ユーザーのツイッタータイムラインを時期を絞って取得する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 354

Yoocie

score 1

前提・実現したいこと

初めて質問させて頂きます。

Jupyter-notebook(Python3)、Twitter APIを使って、特定のツイッターアカウントのタイムラインを、時期を絞って取得することがゴールです。
そのために、下記のコードをjupyter-notebookで実行すると、対象アカウントの最新20ツイートを取得することができました。
ところが、時期を絞って(例:2019-08-13から2019-08-20まで)タイムラインを取得することができていません。
ゴールを達成するためには、どのようにパラメータを設定したら良いのでしょうか?
お教えいただければ幸いです。

#質問コードに誤りがあったため、修正したコードをページの一番下「質問コードの修正」にコピーしました。\
ご参照ください。

試したこと

ツイッターのアプリによる検索機能では、

since:2018-09-23 #取得期間の開始日
until:2018-09-30 #取得期間の終了日


というように検索ボックスに入力することで、特定の期間内のツイートを取得できるそうです。
ところが、こうした時期の指定を、上記のコード内でどのように行えるのか、調べてもわかりませんでした。

環境

macOS Mojave
Python 3.7.3

質問コードの修正

quiqui さんにご指摘いただいた上で、質問コードを下記のように修正させていただきました。
下記のコードをjupyter-notebookで実行すると、対象アカウントの最新20ツイートを取得することができました。
取得すべきツイート期間を指定したいものの、調べても、望むようなパラメータがわからなかったため、

params ={'since':2018-12-10,'until':2018-12-17,'screen_name':'***'}

という風にしてみましたが、
'since':2018-12-10,'until':2018-12-17
の部分は無視された状態での出力になっています。

#一人のツイートを時期を限定して取得(1週間)
import json
import sys
import datetime
from datetime import timedelta # 日本時間に直すために使う
import tweepy


#python で Twitter APIを使用するためのConsumerキー、アクセストークン設定
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

#認証
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

twitter = auth.oauth

#----------------------
#上記が各種設定、下がタイムライン取得操作

# Twitter Endpoint(ユーザータイムラインを取得する)
url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

# Enedpointへ渡すパラメーター
params ={'since':2018-12-10,'until':2018-12-17,'screen_name':'*******'}

req = twitter.get(url, params = params)

if req.status_code == 200:
    res = json.loads(req.text)
    for line in res:
        print(line['created_at'])
        print(line['text'])
        print()
else:
    print("Failed: %d" % req.status_code)

 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quiqui

    2019/09/05 10:29 編集

    req = twitter.get(url, params = params)
    の部分に間違ったコードが混じっている様に見えます。

    追記: "tweepyをインポートしておいて使ってない"という可能性に気づきました。"tweepy回りで余計なコードが残っていて、書かれていなければならないコードが無い"ということかもしれません。

    キャンセル

  • Yoocie

    2019/09/05 11:35

    早速ありがとうございます。
    上記のコードでも、直近20ツイートはすでに出力することができています。
    時期の指定まではできておらず、どうすれば良いかわからない状態です。
    試しに
    params ={'since':2018-12-10,'until':2018-12-17,'screen_name':'*****'}
    と変更しました。エラーは出なかったものの、時期の指定は反映されず、直近20ツイートが出力されました。
    import tweepy を削除し、再度実行しました。結果は変わらず、最新の20ツイートが出力されています。

    キャンセル

  • quiqui

    2019/09/05 12:06 編集

    twitter という名前が宣言なしに使われていますから**このコードだけでは**動くはずはないです。(tweepy.API にgetメソッドがないのは確認しているので)

    ちょっとtweepyのソースをさらってみての推測ですが
    twitter = auth.oauth
    とか実行して(からそれを消していたりして)いませんか?

    キャンセル

  • Yoocie

    2019/09/05 13:23

    おっしゃる通りでした。
    jupyter-notebookの上の方の入力に、
    import json
    twitter = auth.oauth
    を含んでいました。
    質問コードを修正させていただきました。
    ご指摘ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

+1

このソースだとtweepyの機能を全然使わず、requests-oauthlibで認証したセッションを使って、直にTwitter APIにアクセスしています。

https://github.com/tweepy/tweepy/blob/v3.8.0/tweepy/auth.py#L53
https://github.com/tweepy/tweepy/blob/v3.8.0/tweepy/auth.py#L10

したがって参照するのはTwitter APIのリファレンスです。

https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline

user_timeline APIにsinceやuntulパラメータはありませんので指定しても効果がありません。

パラメータのmax_idを指定するとそのidより小さい=古いツイートを取得できます。
件数はcountパラメータです。


Twitterのid(status_id)は上位ビットに日時が入っているので、 →参考
日時からだいたいのstatus_idを作れます。

from datetime import datetime, timedelta, timezone

UTC = timezone.utc
JST = timezone(timedelta(hours=+9), 'JST')

# 日本時間2018年12月21日 00:00:00
until_date_time = datetime(2018, 12, 21, tzinfo=JST)

# UNIX時間(ミリ秒)
timestamp = int((until_date_time.astimezone(UTC) - datetime(1970, 1, 1, tzinfo=UTC)).total_seconds()) * 1000 - 1288834974657

# 22ビットシフト
max_id = timestamp << 22

url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

# max_idとcountの指定
params ={'max_id': max_id, 'count': 200, 'screen_name':'*******'}

req = twitter.get(url, params=params)


とすると2018年12月21日 00:00:00より前のツイート最大200件が取得できます。
(ただし、もしアクセス可能なら、です。過去3,200件を超えてタイムラインAPIでは取得できません)

あとは"取得できたツイートの一番古いツイートのid"をmax_idに指定して繰り返します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/06 14:39

    quiqui さん
    ご返信遅くなりました。
    教えていただいたコードを実行したところ、タイムラインを取得することができました。この方法だと、取得タイムラインの開始時刻も指定でき、目的の解析を進めることができます。嬉しいです。
    自力では絶対にわからなかった方法です。教えていただいて、本当にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる