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

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

ただいまの
回答率

87.94%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,254

score 20

前提・実現したいこと

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.'}]}

該当のソースコード

consumer_key="consumer_key"
consumer_secret="consumer_secret"
access_token_key="access_token_key"
access_token_secret="access_token_secret"
tw = OAuth1Session(consumer_key,consumer_secret,access_token_key,access_token_secret)
size = os.path.getsize("./test1.mp4")
url = "https://upload.twitter.com/1.1/media/upload.json"
data = {
    "command":"INIT",
    "media_type":"video/mp4",
    "total_bytes":size
    }
res = tw.post(url,data)#ここは上手くいく
values = json.loads(res.text)
media_id_string = values["media_id_string"]
media_id = values["media_id"]
file = open("./test1.mp4","rb")

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.'}]}

試したこと

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


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

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

windows10,python3.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

{'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() で読み込むとエラーとなります。

コードを書いてみた

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import json
import base64
from requests_oauthlib import OAuth1Session

consumer_key='consumer_key'
consumer_secret='consumer_secret'
access_token_key='access_token_key'
access_token_secret='access_token_secret'

media_file = './test1.mp4'
media_mimetype = 'video/mp4'
chunked_size = 4*1024*1024
status = u'これはテスト用動画です'

mediaURL = 'https://upload.twitter.com/1.1/media/upload.json'
statusURL = 'https://api.twitter.com/1.1/statuses/update.json'

tw = OAuth1Session(consumer_key, consumer_secret, access_token_key, access_token_secret)

# INIT
media_filesize = os.path.getsize(media_file)
data = {
    'command':'INIT',
    'media_type':media_mimetype,
    'media_category':"tweet_video", #30秒超え対策
    'total_bytes':media_filesize
    }
res = tw.post(mediaURL, data)
values = json.loads(res.text)
print(values)
try:
    values['media_id_string']
except KeyError:
    print(u'INITに失敗しました')
    sys.exit(1)

# APPEND

# 一括でやる場合
# {u'request': u'/1.1/media/upload.json', u'error': u'segment size must be <= 5242880.'}
# これが発生する恐れ
#
# media_id = values['media_id_string']
# file = open(media_file, 'rb').read()
# fileStr = base64.b64encode( file )
# data = {
#     'command':'APPEND',
#     'media' : fileStr,
#     'media_id' : media_id,
#     'segment_index':0
#     }
# res = tw.post(mediaURL, data)
# values = json.loads(res.text)
# print(values)

# chunked_size バイトごとにファイルを読み出して送信
media_id = values['media_id_string']
segment_index = 0
bytes_sent = 0
with open(media_file, 'rb') as f:
    while bytes_sent < media_filesize:
        chunk = f.read(chunked_size)
        chunkStr = base64.b64encode( chunk )
        data = {
            'command':'APPEND',
            'media':chunkStr,
            'media_id':media_id,
            'segment_index':segment_index
            }
        tw.post(mediaURL, data)

        print(segment_index)
        segment_index+=1
        bytes_sent = f.tell() # ファイル内の現在の位置

# FINALIZE
data = {
    'command':'FINALIZE',
    'media_id' : media_id
    }
res = tw.post(mediaURL, data)
values = json.loads(res.text)
print(values)
try:
    values['media_id_string']
except KeyError:
    print(u'FINALIZEに失敗しました')
    sys.exit(1)

# TWEET
data = {
    'status':status,
    'media_ids' : media_id,
    }
res = tw.post(statusURL, data)
values = json.loads(res.text)
print(values)

実行結果

> 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で書かれていて、今回の要件を満たすと思います。
ぜひご確認ください。

参考サイト

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/31 11:09

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

    キャンセル

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る