前提
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
としてみたが同様のレスポンスだった。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/25 06:18