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

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

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

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

Q&A

解決済

1回答

1281閲覧

twitterAPIを用いてalt付きの画像を投稿したいが、エンドポイントに{'message': 'Could not authenticate you', 'code': 32}と返される。

Koi_Fox

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/12/25 03:33

前提

Twitterで画像を投稿するbotを作っています。
投稿する画像にaltを付けたいので、公式ドキュメントを参考にして、requests_oauthlibのOAuth1Sessionで認証情報を作成しPOSTしたのですが、
{'errors': [{'message': 'Could not authenticate you', 'code': 32}]}
と返ってきてしまい正常に更新できません。
試しに、同様の方法で単純にtweetするエンドポイント1.1/statuses/update.jsonにPOSTしたところこちらは上手く行きました。よってキーやトークンの問題では無いようです。
何時間かネットを漁ってみましたが解決できません。
よろしくお願いいたします。

実現したいこと

  • alt付き画像をtweetする。

発生している問題・エラーメッセージ

{ 'errors': [ { 'message': 'Could not authenticate you', 'code': 32 } ] }

該当のソースコード

Python

1import json 2import tweepy 3import requests 4from io import BytesIO 5 6def download(image_url): 7 image = requests.get(image_url).content 8 return image 9 10def tweet(title, id, thumbnail_url='None'): 11 print('tweetする。') 12 with open('twitterAPIs.json', 'r') as f: 13 keys = json.load(f) 14 15 CONSUMER_KEY = keys['API Key'] 16 CONSUMER_KEY_SECRET = keys['API Key Secret'] 17 ACCESS_TOKEN = keys['Access Token'] 18 ACCESS_TOKEN_SECRET = keys['Access Token Secret'] 19 20 if thumbnail_url == 'None': 21 api = tweepy.Client( 22 consumer_key=CONSUMER_KEY, 23 consumer_secret=CONSUMER_KEY_SECRET, 24 access_token=ACCESS_TOKEN, 25 access_token_secret=ACCESS_TOKEN_SECRET 26 ) 27 28 link = 'https://youtu.be/' + id 29 text = '【新着動画】\n' + title + '\n' + link + '\n' 30 api.create_tweet(text=text) 31 else: 32 auth = tweepy.OAuthHandler( 33 CONSUMER_KEY, 34 CONSUMER_KEY_SECRET 35 ) 36 auth.set_access_token( 37 ACCESS_TOKEN, 38 ACCESS_TOKEN_SECRET 39 ) 40 api = tweepy.API(auth) 41 42 req_api = OAuth1Session( 43 CONSUMER_KEY, 44 CONSUMER_KEY_SECRET, 45 ACCESS_TOKEN, 46 ACCESS_TOKEN_SECRET 47 ) 48 49 thumbnail = download(thumbnail_url) 50 response = api.media_upload(filename='thumbnail.png', file=BytesIO(thumbnail)) 51 thumbnail_id = response.media_id 52 53 params = { 54 "media_id" : thumbnail_id, 55 "alt_text" : { 56 "text" : "altテスト!" 57 } 58 } 59 60 params_json = json.dumps(params) 61 62 res = req_api.post('https://upload.twitter.com/1.1/media/metadata/create.json', params=params_json) # {'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]} 63 64 if not res.status_code == 200 : 65 print('だめだったぽい : {}'.format(res.json())) 66 return 67 68 link = 'https://youtu.be/' + id 69 text = '【新着動画】\n' + title + '\n' + link + '\n' 70 api.update_status(status=text, media_ids=[thumbnail_id]) 71

試したこと

同様のOAuth1Sessionで1.1/statuses/update.jsonにPOST → 成功

OAuth1Sessionではなく、OAuth1モジュールを用いて、

Python

1 oauth = OAuth1( 2 CONSUMER_KEY, 3 CONSUMER_KEY_SECRET, 4 ACCESS_TOKEN, 5 ACCESS_TOKEN_SECRET 6 ) 7 8 params = { 9 "media_id" : thumbnail_id, 10 "alt_text" : { 11 "text" : "altテスト!" 12 } 13 } 14 15 res = requests.post('https://upload.twitter.com/1.1/media/metadata/create.json', params=params_json, auth=oauth) 16

としてみたが同様のレスポンスだった。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実現したいこと
alt付き画像をtweetする。

tweepy の API を使用すれば可能です。

[環境]
Python 3.11.1
tweepy version 4.12.1
※ tweepy は バージョン4以降仕様が大幅に変わりました。他にもアップデ―トで仕様が細かく変わることがあります。上記以外のバージョンの場合、下記コードでは正常に動かないかもしれません。

py

1import json 2import tweepy 3import requests 4from io import BytesIO 5 6def download(image_url): 7...... 8 9def tweet(title, id, thumbnail_url='None'): 10 print('tweetする。') 11...... 12 if thumbnail_url == 'None': 13...... 14 api.create_tweet(text=text) 15 else: 16 auth = tweepy.OAuthHandler( 17 CONSUMER_KEY, 18 CONSUMER_KEY_SECRET, 19 ) 20 auth.set_access_token( 21 ACCESS_TOKEN, 22 ACCESS_TOKEN_SECRET 23 ) 24 api = tweepy.API(auth) 25 26 # 以降を書き換え 27 thumbnail = download(thumbnail_url) 28 response = api.media_upload(filename='thumbnail.png', file=BytesIO(thumbnail)) 29 thumbnail_id = response.media_id 30 31 api.create_media_metadata(media_id=thumbnail_id, alt_text="altテスト!") 32 # 書き換えここまで 33 34 link = 'https://youtu.be/' + id 35 text = '【新着動画】\n' + title + '\n' + link + '\n' 36 api.update_status(status=text, media_ids=[thumbnail_id])

投稿2022/12/25 05:17

編集2022/12/25 05:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Koi_Fox

2022/12/25 06:18

その方法で解決しました! Tweepyにそんなモジュールがあったとは… 本当に助かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問