【Python,tweepy】Pythonでコンソールからツイートするスクリプト

Python

今回の内容

tweepyを使ってコンソールからツイートするスクリプトを作りましたので、その備忘録です。

ソースコード

import tweepy as tp
import sys


def main():
    error_arg()
    api = tp_set(*key_set())
    tweet = tweet_text()
    tweet_exe(api,tweet)


#引数の処理
def error_arg():
    if len(sys.argv) < 2:
        print("エラー : 文字列を半角スペースで区切って指定してください。")
        sys.exit()


# KEYの指定
def key_set():
    CONSUMER_KEY = "自分のCONSUMER_KEY"
    CONSUMER_SECRET = "自分のCONSUMER_SECRET"
    ACCESS_TOKEN = "自分のACCESS_TOKEN"
    ACCESS_TOKEN_SECRET = "自分のACCESS_TOKEN_SECRET"
    return (CONSUMER_KEY,
            CONSUMER_SECRET,
            ACCESS_TOKEN,
            ACCESS_TOKEN_SECRET)


# tweepyの設定
def tp_set (CONSUMER_KEY,
            CONSUMER_SECRET,
            ACCESS_TOKEN,
            ACCESS_TOKEN_SECRET):
    auth = tp.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tp.API(auth)
    return api


#引数を空行で挟んでツイート内容にする
def tweet_text():
    text_all = [sys.argv[i] for i in range(1,len(sys.argv))] #文字列の指定
    tweet :str = ""    #空の文字列を作成し変数宣言
    for text in text_all:
        tweet = tweet + text + "\n\n"
    tweet = tweet.strip()    #最後の空行を消す
    return tweet


#なんちゃって文字カウント
def cnt_chara(tweet):
    cnt = len(tweet.encode('utf-8'))
    if cnt > 280:
        print("バイト数 : "+str(cnt)+"/280 , バイト数をオーバーしています")
        sys.exit()
    print("(バイト数 : "+str(cnt)+"/280)")


def tweet_exe(api,tweet):
    print("\n[ツイート内容]"+"\n--- --- ---\n"+tweet+"\n--- --- ---")
    cnt_chara(tweet)
    while True:
        choice = input("\n以上の内容でツイートしてよろしいでしょうか? [y/N]: ").lower()
        if choice in ['y', 'ye', 'yes']:
            api.update_status(tweet)
            print("\nYes : ツイートが完了しました。")
            sys.exit()
        else:
            print("\nNo : ツイートしませんでした。")
            sys.exit()


if __name__ == '__main__':
    main()

使い方

`$ python スクリプト ツイート内容`で、スクリプトにツイート内容を引数として渡します。

半角スペースで区切ることで、空行を挿入することができます。

簡単な解説

簡単な解説と、参考にさせていただいたものの紹介です。

APIの取得について

TwitterのAPIを取得して、key_setに設定しておきます。

APIの取得については以下を参考にさせていただきました。
『Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 | Qiita』
『2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説 | ITTI STAFF BLOG』

tweepyの設定、ツイートの実行については以下を参考にさせていただきました。
『Pythonで『tweepy』を使いこなす方法【テキスト・改行・複数画像添付】 | なろう分析記録

ツイート内容に空行を挿入

def tweet_text():
    text_all = [sys.argv[i] for i in range(1,len(sys.argv))] #文字列の指定
    tweet :str = ""    #空の文字列を作成し変数宣言
    for text in text_all:
        tweet = tweet + text + "\n\n"
    tweet = tweet.strip()    #最後の空行を消す
    return tweet

半角スペースで区切った引数を取得し、それぞれに空行を追加しています。
また、最後の空行を消す方法については以下を参考にさせていただきました。
『【Python】 特定の文字列や空白文字を削除する (strip, rstrip, lstrip、replace) | Hbk project』

yes/noでツイート実行するか決定する

while True:
        choice = input("\n以上の内容でツイートしてよろしいでしょうか? [y/N]: ").lower()
        if choice in ['y', 'ye', 'yes']:
            api.update_status(tweet)
            print("\nYes : ツイートが完了しました。")
            sys.exit()
        else:
            print("\nNo : ツイートしませんでした。")
            sys.exit()

ツイート内容を確認した後に、yes/noでツイートを実行するかどうか決定します。具体的には大文字小文字を問わずy,ye,yesのいずれかが入力されたときだけツイートを実行し、それ以外は実行しません。

コードは以下を参考にさせていただきました。
『python で yes/no で実行する/しないの処理のメモ | 牌語備忘録 -pygo』

コード内容を理解するのに、以下も参考にさせていただきました。
『標準入力の受け取りtips@python | Qiita』

文字数カウントについて

def cnt_chara(tweet):
    cnt = len(tweet.encode('utf-8'))
    if cnt > 280:
        print("バイト数 : "+str(cnt)+"/280 , バイト数をオーバーしています")
        sys.exit()
    print("(バイト数 : "+str(cnt)+"/280)")

最終的にはlenでバイト数をカウントしています。ただし、Twitterの文字カウントは複雑なようなのであくまでも目安としてのカウントになります。

ツイッターの文字カウント方法についての詳細について参考にさせていただきました。
『【Twitter】文字数の制限とカウント方法(2020年) | アプリの鎖』

今回は断念しましたが、、ツイッターに適した文字カウントを実装する方法については以下を参考にさせていただきました。
『Python3でのバイト数カウント(変数内文字) | teratail』
『ツイートの文字数を **厳密に** 数える方法 | Qiita』

バイト数のカウントについては、以下を参考にさせていただきました。
『Python 3 での文字列とバイト列の相互変換と16進数表示 | Qiita』

その他、スクリプトの書き方について

丸括弧で一行のコードを複数行に書く方法について参考にさせていただきました。
『【Python】複数行にコードを書く方法 | Udemyfun』

main関数の書き方などについて参考にさせていただきました。
『Pythonスクリプトの書き方(4パターン) | GAMMASOFT』

追記(2020-06-11)

新しく、API情報を設定ファイルに記述して読み込む機能を実装しました。これにより、複数アカウントでの実装が簡単になりました。

ソースコード(追加分のみ)

# My_tweet_script.py

#設定ファイルからAPI情報の取得
def settings_api(section):
    import configparser
    current_dir = pathlib.Path(__file__).resolve().parent
    config = configparser.ConfigParser()
    config.read(current_dir/'tweet_settings.cfg')
    api_key = config.get(section,'api_key')
    api_secret_key = config.get(section,'api_secret_key')
    access_token = config.get(section,'access_token')
    access_token_secret = config.get(section,'access_token_secret')
    return (api_key,api_secret_key,access_token,access_token_secret)
# tweet_settings.cfg

[user]
api_key = 
api_secret_key =
access_token = 
access_token_secret = 
configparserモジュールによる設定ファイルの読み込み

セクション名を[ユーザ名]としてAPI情報を設定ファイルに記述しておくことで、複数アカウントでの切り替えが簡単になります。

get()メソッドを使ってそれぞれのパラメータを取得して変数に入れています。

参考ページは『【Python】スクリプトの設定ファイルを作る方法について』に記載したものと同じです。

ソースコード(変更点)

main(section):
def main(section):
    error_arg()
    api = tp_set(*settings_api(section))
    tweet = tweet_text()
    tweet_check(api,tweet,section)

main()にsectionという引数を設定して、`api = tp_set(*settings_api(section))`を追記しています。

sectionは設定ファイルに記載したユーザ名を指定するための変数です。

settings_api()にユーザ名を渡すことによって設定ファイルからそのセクションのデータを読み込みます。それをリストとして、*で展開してtp_set()に渡します。

tweet_check(api,tweet,section)
def tweet_check(api,tweet,section):
    print("")
    print("[ツイート内容]"+"\n--- --- ---\n"+tweet+"\n--- --- ---")
    print("ユーザー : "+section)
    cnt_chara(tweet)
    while True:
〜〜〜 〜〜〜 〜〜〜

ユーザを切り替えやすくしたため、どのユーザでツイートしようとしているかを表示する機能もついでにつけました。

tweet_checkにsectionを追加で渡し、print(“ユーザー : “+section)でツイート前の確認でユーザ名を表示します。

画像を投稿する(追記 2020-06-21)

api.update_with_media(filename='./sample.png',status=message)

【参考】
『Tweepy で Twitter に画像付きのツイートをする』(Qiita:@ekzemplaro)

コメント

タイトルとURLをコピーしました