ウラガミ・ライフ

空欄に書く気持ち良さとか。

botからTwitterの動画投稿するのに、どハマり解決編!!

uragami.hatenablog.jp


こちらの記事の続きになります。

本日一応Botを稼働させました!Botで30秒以上の動画を投稿するってこと自体がそんなにやることではないのかもですが、共有できそうな部分残していこうと思います。


30秒以上の動画投稿には"media_category"の指定が必要

こちら、特に4枚以下の静止画、および30秒以下の動画にはこちらのプロパティの指定が必要ありませんでした。しかし、30秒以上の動画投稿にはこの指定が必須のようです。おそらくチャンク分割の際に必須になるんでしょうかー。

python_twitter」のapi.PostUpdateには、このmedia_categoryもプロパティとして指定可能でしたので、以下のようにコードを直しました。


こちらが変更前。

api.PostUpdates(status=text, media=media_list)

変更後は…

api.PostUpdates(status=text, media=media_list, media_category=category])

まぁ、抜き出してしまうと「そらそうよ」って感じになってますが……

今回のbotの場合は、ランダムにツイートするのが画像の場合もあれば、動画の場合もあるということなので、そのツイート内容を書いたJSONファイルにカテゴリーの文字列も一緒に記載した形にしました。



でもこの指定をするようになってから……

twitter.error.TwitterError: [{'message': 'Not valid video', 'code': 324}]

なんてエラーログが出てくるようになりました……'Not valid video'訳すると「有効な動画ではありません」……

ってええええええ!!!!

どうもwaitが必要っぽい???

正直何が良くないのかがわからず、一つ一つ処理を追いながら、ライブラリの中も含めてデバック実行をしていくと……


あれ?投稿できた!っていう自体に!!


ってことは……よくあるやつです。このままの処理スピードだと処理が追いつかなくてエラーになるってやつ。
じゃ、どこで止めればいいか……を探っていくと、「python_twitter」のapi._RequestUrlの実施直前ではないかという疑いが出てきました。
どうもここにブレイクポイントを置くと動画が投稿できる……のはわかったのですが、いかんせん修正ポイントはAPIの中です。
python_twitter」にIssue書くなり、プルリク投げるなり……とも思いましたが、相手は外人……私のつたない英語でなんとかなるわけがなく……

とあっけにとられていたところを助けてくれたのが、ちぃといつさんでした。ひゅー!!頼りになりますぅー!!
そこまでわかっているのであれば、スリープ処理を入れてから関数を実行するようラップしてしまえばいいということで……

変更前のこちらのコードを

def execute_tweet_introduction(api, intro):
    # 一部略
    api.PostUpdate(status=intro['text'], media=media_list, media_category=intro['category'])


変更後こちらのようにー

def execute_tweet_introduction(api, intro):
    # 一部略
    org = api._RequestUrl
    api._RequestUrl = waiting(org)
    api.PostUpdate(status=intro['text'], media=media_list, media_category=intro['category'])
    api._RequestUrl = org

def waiting(func):
    def wrapper(obj, *args, **kwargs):
        time.sleep(5)
        return func(obj, *args, **kwargs)
    return wrapper

……でもやっぱり二人でこう言ってました「やっぱこれ…バグだよね」とw
なおsleepの秒数は5秒にしていますが、こちらで実施した際に1秒だと前述のエラーコードが出てしまったため、5秒にしています。
より適切なsleep時間はあるかもしれません。

そんな諸々の試練を経て……

一応なんとかまとまりました。
githubにも今回のソースはアップしてます。
お恥ずかしながら、一応さらしておきます。何か気がついたところがあれば、ご指摘いただけると嬉しいですー。
github.com


herokuで今回は動作させていますが、すでに投稿されている記事を参考にしながら、こちらはスムーズに実施することができました!先達の皆様のお知恵尊い!!

なかなか30秒以上の動画投稿っていうのも無い場面なのかもですが(だからこそ「python_twitter」にもsleep処理が無くそのままになっているのかもですが…w)なかなか勉強になる経験だったなと思います。
次はherokuへのアップ環境だったり、AWSなどの別PaaS使うなど、今後の勉強のネタにもなってくれたのかなーと感じてます。
やっぱり手を動かすの、大事ですね!