🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1732閲覧

【Python】【Twitter】自身がツイートした埋め込み画像・動画URLを一括取得したい

shortbound

総合スコア1

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/03/06 11:27

Twitterで自身がツイートしたメディア(画像・動画等)を再度投稿する際に,埋め込み用URLを取得することで,テキストのみでメディアの投稿ができると思います。

※下記サイト参照↓
https://miyabix.com/archives/12052

このURLをPythonを用いてAPIで一括取得したいですが,取得オブジェクトがわかりません。
メディアのオブジェクトを指定して実行しますが,エラーが出てしまいます。

※下記サイト参照↓
https://syncer.jp/Web/API/Twitter/REST_API/Object/

次のコードを実行すると,投稿したテキスト内容やいいね,リツイートが取得できますが,これに加えて,上記の情報も取得したいです。

ご教示いただけますと幸いです。

変更を加えたいソースコード

Python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import tweepy 5import csv 6 7consumer_key = "XXXXXXXXXXXXXXXX" 8consumer_secret = "XXXXXXXXXXXXXXXX" 9access_key = "XXXXXXXXXXXXXXXX" 10access_secret = "XXXXXXXXXXXXXXXX" 11 12auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 13auth.set_access_token(access_key, access_secret) 14api = tweepy.API(auth) 15 16#ツイート取得 17tweet_data = [] 18 19for tweet in tweepy.Cursor(api.user_timeline,screen_name = XXXXXXXXXXXXXXXX",exclude_replies = True).items(): 20 tweet_data.append([tweet.id,tweet.created_at,tweet.text.replace('\n',''),tweet.favorite_count,tweet.retweet_count]) 21 22#csv出力 23with open('XXXXXXXXXXXXXXXX.csv', 'w',newline='',encoding='utf-8') as f: 24 writer = csv.writer(f, lineterminator='\n') 25 writer.writerow(["id","created_at","text","fav","RT"]) 26 writer.writerows(tweet_data) 27pass

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

get_oembed()を使います。

import tweepy import csv import re # 追加 # 下記APIキーは自分のに書き換えてください。 consumer_key = "XXXXXXXXXXXXXXXX" consumer_secret = "XXXXXXXXXXXXXXXX" access_key = "XXXXXXXXXXXXXXXX" access_secret = "XXXXXXXXXXXXXXXX" auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) # wait_on_rate_limit=Trueとした場合、レート超過したら自動的に15分止まります。 api = tweepy.API(auth, wait_on_rate_limit=True) # userは抽出したいユーザー名に変えてください。 user = "JAXA_jp" # レート超過しないように100件としていますが、増やしても構いません。 limit = 100 tweet_data = [] for tweet in tweepy.Cursor(api.user_timeline,screen_name = user ,exclude_replies = True).items(limit): print(tweet.text) oembed = api.get_oembed("https://twitter.com/"+tweet.user.screen_name+"/status/"+str(tweet.id)) html = oembed.get("html") url_re = re.search(re.compile(r'<a href=\"(https://t.co/[A-Za-z0-9]+)\">'), html) if url_re: url = url_re.group(1) else: url = '' tweet_data.append([tweet.id, tweet.created_at, tweet.text.replace('\n',''), tweet.favorite_count, tweet.retweet_count, url]) #csv出力 with open('XXXXXXXXXXXXXXXX.csv', 'w',newline='',encoding='utf-8') as f: writer = csv.writer(f, lineterminator='\n') writer.writerow(["id", "created_at", "text", "fav", "RT", "URL"]) writer.writerows(tweet_data)

投稿2021/03/06 12:13

編集2021/03/08 08:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shortbound

2021/03/06 14:24

ご連絡いただき,ありがとうございます。 当方,Python勉強中のため,稚拙な質問で大変恐縮です。 実行したところ次のエラーメッセージがでます。 「that page does not exist」 get_oembed()の用法を調べましたが,「html = oembed["html"]」の箇所に変更を加えるべきなのでしょうか。 参考にした記事↓ https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/oembed/ csvの横列に,「ID」,「日時」,「テキスト」,「いいね」,「リツイート」,「埋め込みメディアURL(←苦戦しているのはここ)」を出力したいです。 以上,よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/03/06 14:41

修正しました。最新版のtweepyだと仕様が変わっていたようです。
shortbound

2021/03/06 15:42

何度も申し訳ありません。 次のエラーがでます。 Rate limit exceeded データの大きさが問題でしょうか?
退会済みユーザー

退会済みユーザー

2021/03/06 15:58

そのエラーが出るということは、apiのレート制限にかかっています。(一定時間あたりのtwitter APIを呼び出し回数が規定を超えた場合に出ます) https://qiita.com/msi/items/d099b98542a30915d17f ツイートの投稿等にAPIを使用していなければ15分でリセットされるはずですので 何もせず15分ほど待ってみてください。
shortbound

2021/03/07 01:13

参考記事ありがとうございます。 コード「88」ですので,どうやら15分待って解決するものではなさそうです。 (一晩置きましたが実行できません。) 何度も申し分かりません。
quickquip

2021/03/08 00:01 編集

> コード「88」ですので, 「ですので」の意図が分かりません。コード88と聞いたら"レート制限に引っかかったから時間をおいて実行しろ"の意味だろうと思いますよ。 https://developer.twitter.com/en/support/twitter-api/error-troubleshooting から88で検索↓ > Corresponds with HTTP 429. The request limit for this resource has been reached for the current rate limit window.
退会済みユーザー

退会済みユーザー

2021/03/07 02:43 編集

shortbound様 お手数おかけします。 自分の環境では、わざとcode:88エラーが出るまでtweepyのツイート取得コードの実行を連続で繰り返し 、エラーが出てからば何もせず15分以上経過後に再実行したところ再取得できるようになりました。 (shortbound様の場合一晩おいても実行できなかった(=同じcode:88のエラーが出たということでしょうか?)理由は不明です) 回答コードを、自分の手元で動いているコードに書き換えました。 まず pip install --upgrade tweepy でtweepyを最新版にしてください。 次に、回答欄に書いた修正後のコードを”そのまま”コピペして(ただしAPIキーの部分はもちろん書き換える必要はありますが)実行してみてください。 実行しても何も表示されないでしょうか。 (もし実行したときにcode:88が依然として表示される場合は、お手数ですが、twitterのAPIを取得しなおしてみてください) (なお、回答欄のコードは、APIレートが一気に超過しないよう、一回の取得を10個までに制限しています)
shortbound

2021/03/07 11:21

ご丁寧に説明をありがとうございます! 無事実行できました! しかし,要素を取り出してカンマ区切りにすることに苦戦しています。 下記URLを参考にしておりますが, https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/oembed/ csvの横列に,「ID」,「日時」,「テキスト」,「いいね」,「リツイート」,「埋め込みメディアURL」を出力したいのですが,「append([~~~])」では上手くいきません。 何度も申し訳ありません。 ご教示いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2021/03/07 12:06

コードを修正しました。例によってユーザー名のところは好きなものに変えてください。
shortbound

2021/03/08 07:24

何から何までありがとうございます。 実行できました! 最後の最後にご教示いただけましたら幸いです。 取得した「"HTML"」から埋め込み画像(及び動画)のリンクのみを抜き出すことはできないのでしょうか。 例えば,次の投稿でしたら… https://twitter.com/asahiinryo_jp/status/1367369218711310342 次のURLを1列で抜き出したいです。 https://t.co/cdQZuW7ePZ ここまで来たらExcelの関数で抜き出すしかないのかなと考えてもおりますが。
退会済みユーザー

退会済みユーザー

2021/03/08 08:07

回答コードを修正/追加しました。
shortbound

2021/03/08 11:04

解決しました! 感動です。 色々と丁寧にありがとうございました。 もっと勉強して行こうと思います。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問