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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Twitter

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

Python

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

API

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

Q&A

解決済

1回答

1061閲覧

python  twitter特定ツイートのリツイート者をアカウントで取得したい

12356

総合スコア6

Twitter

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

Python

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

API

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

0グッド

0クリップ

投稿2021/07/14 03:21

編集2021/07/14 06:55

修正後のソースコード

user_info = ["user.screen_name", "user.name",] request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_info=user_info) if request_result.status_code == 200: tweetinfo = json.loads(request_result.text) for j in range(0,len(tweetinfo)): print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + str(twitter_info[j]["screen_name"])) user = api.get_user(j) followerdata = {'retweet_id':tweetinfo[j]['id'], 'user_id':tweetinfo[j]['user']['id'], "screen_name":tweetinfo[j]["screen_name"]} with open(output_csv_file_name, 'a') as f: writer = csv.writer(f, lineterminator='\n') writer.writerow(followerdata.values()) ```### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 pythonでtwiiterの特定ツイートのリツイートアカウントを取得したいです。 ### 発生している問題・エラーメッセージ

エラーメッセージ
line 63, in <module>
print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + str(tweetinfo[j]["screen_name"]))
KeyError: 'screen_name'

### 全体のソースコード Python ソースコード ```from requests_oauthlib import OAuth1Session import json import csv import tweepy import configparser def request_authorization (**url_and_params): twitter = OAuth1Session(url_and_params['ck'], url_and_params['cs'], url_and_params['at'], url_and_params['ats']) if('params' in url_and_params): request_result = twitter.get(url_and_params['request_url'],params=url_and_params['params']) else: request_result = twitter.get(url_and_params['request_url']) return request_result config_ini = configparser.ConfigParser() config_ini.read('config.ini', encoding='utf-8') CK = config_ini["key"]["consumer_key"] CS = config_ini["key"]["consumer_secret"] AT = config_ini["key"]["access_token"] AS = config_ini["key"]["access_secret"] global twitter twitter = OAuth1Session(CK, CS, AT, AS) request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json" tweet_id = ["1414972474261786636"] #リツイート情報を取得したい TweetID total_requests_number = len(tweet_id) print("--------"+"送信するリクエスト数合計:" + str(total_requests_number)+"-------------") sched_requests_number = 0 should_get_requests_limit = True i_plus = 1 requests_count = 0 error_count = 0 output_csv_file_name = 'retweet_info.csv' with open(output_csv_file_name,'a') as f: writer = csv.writer(f, lineterminator='\n') header = ['retweet_id', 'user_id'] writer.writerow(header) for i in range(0,total_requests_number,i_plus): if(should_get_requests_limit == True): api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS) requests_limit = api_response.headers['x-rate-limit-remaining'] requests_limit = int(requests_limit) requests_count += 1 print("--------"+str(requests_count)+"回目。今回送信するリクエスト数:" + str(requests_limit)+"--------------------") sched_requests_number += requests_limit should_get_requests_limit = False if(requests_limit != 0): i_plus = 1 print(str(i) + ":リクエストしたtweetID:" + str(tweet_id[i])+"---------") request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id[i])+".json?count=100&trim_user=false" params = {'tweet_id':tweet_id[i]} user_info = ["user.screen_name", "user.name",] request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_info=user_info) if request_result.status_code == 200: tweetinfo = json.loads(request_result.text) for j in range(0,len(tweetinfo)): print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + user_info[j]["screen_name"]) followerdata = {'retweet_id':tweetinfo[j]['id'], 'user_id':tweetinfo[j]['user']['id'], "user_name":user_info["screen_name"]} with open(output_csv_file_name, 'a') as f: writer = csv.writer(f, lineterminator='\n') writer.writerow(followerdata.values()) else: print ("Error: %d" % request_result.status_code) error_count += 1 print("Error数:"+str(error_count)) else: i_plus = 0 if(i == sched_requests_number): print("--------"+"残りリクエスト数" + str(total_requests_number-requests_limit) + "-------------") sleep_until_api_limit(api_response) should_get_requests_limit = True コード

試したこと

コードが読みにくくて申し訳ございません。
webで掲載されていたコード使用しました。
取得情報を「ID」ではなく「screen_name」に変えて情報を取得したかったのですがエラーが出てしまいます。
アカウントやユーザー等の名前が分かるものに変えたいのですが、やり方が分かりません。

補足情報(FW/ツールのバージョンなど)

python 3.9.4

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

多分、この箇所ですね。user_info[j]["screen_name"]
user_info = ["user.screen_name", "user.name",]より、user_info[j]はただの文字列であることがわかります。ただの文字列に対して["screen_name"]という文字列のインデックスを指定しているのでエラーが出ているんじゃないでしょうか。
もしかして、tweetinfo[j]["screen_name"]の間違いでしょうか(といっても、tweetinfoの中身を知らないので憶測ですが)

投稿2021/07/14 06:23

編集2021/07/14 06:26
jeanbiego

総合スコア3966

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

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

12356

2021/07/14 06:57

お忙しい中ご回答ありがとうございます。 上記修正しましたが、"screen_name"に関してKeyエラーが出てしまいます。 tweetinfoの中身ですが、 request_resultをjsonでloadしている形です。 また、お手すきの時にご教授いただければ幸いです。 どうぞよろしくお願い致します。
jeanbiego

2021/07/14 07:28

私自身はtweet採取等はやったことがないので、request_resultの中身も知りません。request_resultの中身を確認して、欲しいindexを指定されてはいかがでしょうか。
12356

2021/07/14 07:37

再度のご回答ありがとうございます。 試行錯誤してみます。 また何かありましたらどうぞよろしくお願い致します。
12356

2021/07/14 23:24

上記ご回答により無事に動きました! お忙しい中、的確なご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問