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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

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

Python

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

Q&A

解決済

1回答

3847閲覧

twitter apiで動画投稿時 'code': 32, 'message': 'Could not authenticate you.' エラー

pen_ari

総合スコア50

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

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

Python

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

0グッド

0クリップ

投稿2020/01/22 22:35

前提・実現したいこと

twitterで動画を自動投稿するbotを作成しており、
https://syncer.jp/Web/API/Twitter/Snippet/2/
を参考にpythonでコーディングしています。
https://upload.twitter.com/1.1/media/upload.json
へcommnad:"APPEND"でpostすると認証エラーのレスポンスが返ってきます

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

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

該当のソースコード

python

1consumer_key="consumer_key" 2consumer_secret="consumer_secret" 3access_token_key="access_token_key" 4access_token_secret="access_token_secret" 5tw = OAuth1Session(consumer_key,consumer_secret,access_token_key,access_token_secret) 6size = os.path.getsize("./test1.mp4") 7url = "https://upload.twitter.com/1.1/media/upload.json" 8data = { 9 "command":"INIT", 10 "media_type":"video/mp4", 11 "total_bytes":size 12 } 13res = tw.post(url,data)#ここは上手くいく 14values = json.loads(res.text) 15media_id_string = values["media_id_string"] 16media_id = values["media_id"] 17file = open("./test1.mp4","rb") 18 19data = { 20 'command':'APPEND', 21 'media' : file, 22 'media_id' : media_id_string, 23 'segment_index':0 24 } 25res = tw.post(url,data) 26values = json.loads(res.text) 27print(values)#{'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}

試したこと

import twitter#してライブラリ経由で動画投稿⇒何故か無音動画がアップロードされる

タイムライン表示、テキストツイートはできたので認証キーが間違っているわけでは無さそうです。

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

windows10,python3.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

{'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}
この原因はわかりませんが、気になった点を回答します。

気になった点

配列からの値の取り出し

media_id_string = values["media_id_string"] media_id = values["media_id"]

この箇所は、以下が正しいと思います。

media_id = values["media_id_string"]

APPEND 時のレスポンスの表示

data = { 'command':'APPEND', 'media' : file, 'media_id' : media_id_string, 'segment_index':0 } res = tw.post(url,data) values = json.loads(res.text) print(values)#{'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}

こちらのページを見ると、APPEND 時のレスポンスは空だそうです。
空のレスポンスを json.loads() で読み込むとエラーとなります。

コードを書いてみた

ご提示のコードを参考に、プログラムを書いてみました。
(ツイートの段階でエラーになります。こちらのサイトと同様のエラーが出るので、待機時間が必要であると思います。)

Python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import os 5import sys 6import json 7import base64 8from requests_oauthlib import OAuth1Session 9 10consumer_key='consumer_key' 11consumer_secret='consumer_secret' 12access_token_key='access_token_key' 13access_token_secret='access_token_secret' 14 15media_file = './test1.mp4' 16media_mimetype = 'video/mp4' 17chunked_size = 4*1024*1024 18status = u'これはテスト用動画です' 19 20mediaURL = 'https://upload.twitter.com/1.1/media/upload.json' 21statusURL = 'https://api.twitter.com/1.1/statuses/update.json' 22 23tw = OAuth1Session(consumer_key, consumer_secret, access_token_key, access_token_secret) 24 25# INIT 26media_filesize = os.path.getsize(media_file) 27data = { 28 'command':'INIT', 29 'media_type':media_mimetype, 30 'media_category':"tweet_video", #30秒超え対策 31 'total_bytes':media_filesize 32 } 33res = tw.post(mediaURL, data) 34values = json.loads(res.text) 35print(values) 36try: 37 values['media_id_string'] 38except KeyError: 39 print(u'INITに失敗しました') 40 sys.exit(1) 41 42# APPEND 43 44# 一括でやる場合 45# {u'request': u'/1.1/media/upload.json', u'error': u'segment size must be <= 5242880.'} 46# これが発生する恐れ 47# 48# media_id = values['media_id_string'] 49# file = open(media_file, 'rb').read() 50# fileStr = base64.b64encode( file ) 51# data = { 52# 'command':'APPEND', 53# 'media' : fileStr, 54# 'media_id' : media_id, 55# 'segment_index':0 56# } 57# res = tw.post(mediaURL, data) 58# values = json.loads(res.text) 59# print(values) 60 61# chunked_size バイトごとにファイルを読み出して送信 62media_id = values['media_id_string'] 63segment_index = 0 64bytes_sent = 0 65with open(media_file, 'rb') as f: 66 while bytes_sent < media_filesize: 67 chunk = f.read(chunked_size) 68 chunkStr = base64.b64encode( chunk ) 69 data = { 70 'command':'APPEND', 71 'media':chunkStr, 72 'media_id':media_id, 73 'segment_index':segment_index 74 } 75 tw.post(mediaURL, data) 76 77 print(segment_index) 78 segment_index+=1 79 bytes_sent = f.tell() # ファイル内の現在の位置 80 81# FINALIZE 82data = { 83 'command':'FINALIZE', 84 'media_id' : media_id 85 } 86res = tw.post(mediaURL, data) 87values = json.loads(res.text) 88print(values) 89try: 90 values['media_id_string'] 91except KeyError: 92 print(u'FINALIZEに失敗しました') 93 sys.exit(1) 94 95# TWEET 96data = { 97 'status':status, 98 'media_ids' : media_id, 99 } 100res = tw.post(statusURL, data) 101values = json.loads(res.text) 102print(values) 103

実行結果

> python upload_media.py {u'media_key': u'7_1220149864559869952', u'media_id_string': u'1220149864559869952', u'media_id': 1220149864559869952L, u'expires_after_secs': 86400} 0 1 {u'media_id': 1220149864559869952L, u'processing_info': {u'check_after_secs': 1, u'state': u'pending'}, u'media_id_string': u'1220149864559869952', u'expires_after_secs': 86400, u'media_key': u'7_1220149864559869952', u'size': 6340163} {u'errors': [{u'message': u'Not valid video', u'code': 324}]}

サンプルコード

Twitter Developers のサンプルコード はPythonで書かれていて、今回の要件を満たすと思います。
ぜひご確認ください。

参考サイト

動画送信について

動画の分割送信について

30秒超え対策(メディアカテゴリ)と動画の仕様について

APIの仕様に関連するエラーの参考になりました

投稿2020/01/23 01:34

programming

総合スコア476

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

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

pen_ari

2020/01/31 02:09

chunk分割のところまで記載していただきありがとうございます 無事tweetすることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問