PythonでSpotifyなうぷれ自動ツイート


前置き

いままでiftttで「Spotifyのお気に入りに入れた曲を自動でツイートする」ということをやっていたが、例の社長さんがAPIを有料にしてくれたおかげで使えなくなってしまった。仕方がないので重い腰をあげて自分で実装することにしたときの備忘録。

実行環境
WindowsServer2022Datacenter 21H2
Python 3.11.4
spotipy 2.23.0
tweepy 4.14.0

サンプルコード

import spotipy
import tweepy
import requests
import json
import schedule
from time import sleep

# Spotify APIの認証
username = 'xxxxx'
client_id = 'xxxxx'
client_secret = 'xxxxx'
redirect_uri = 'https://example.com/callback/'
scope = 'user-read-currently-playing, user-library-read'

# Twitterの認証
consumer_key = 'xxxxx'
consumer_secret = 'xxxxx'
access_token = 'xxxxx'
access_token_secret = 'xxxxx'

print('ready')


def nowplay():
    token = spotipy.util.prompt_for_user_token(username, scope, client_id, client_secret, redirect_uri)
    sp = spotipy.Spotify(auth = token, language='ja')

    new_track = sp.current_user_saved_tracks(limit=20)['items']

    with open('trackid.json') as f:
        old_track = json.load(f)
    
    with open('trackid.json', 'w') as f:
        json.dump(new_track, f, indent=4)

    tweet_num = 0
    
    for num in range(20):
        if new_track[num]['track']['id'] == old_track[0]['track']['id']:
            tweet_num = num
    
    if tweet_num > 0:
        # APIv1 auth
        auth = tweepy.OAuth1UserHandler(
            consumer_key, consumer_secret,
            access_token, access_token_secret
        )
        api = tweepy.API(auth)

        # APIv2 auth
        client = tweepy.Client(
        consumer_key = consumer_key,
        consumer_secret = consumer_secret,
        access_token = access_token,
        access_token_secret = access_token_secret)
        
        # 追加分のツイート実行
        for num2 in range(tweet_num):
            # 追加された楽曲情報の取得
            current_track = sp.track(new_track[num2]['track']['id'])
            artist_name = current_track['artists'][0]['name']
            album_name = current_track['album']['name']
            track_name = current_track['name']

            # ジャケット画像取得
            url = current_track['album']['images'][0]['url']
            file_name = 'picture.jpg'
            response = requests.get(url)
            img = response.content
            with open(file_name, 'wb') as art:
                art.write(img)

            # 画像付きNowPlayingツイート
            tweet = '#NowPlaying ' + track_name + ' by ' + artist_name + ' (' + album_name + ')'
            media = api.media_upload(filename='./picture.jpg') #APIv1で画像を送信
            client.create_tweet(text=tweet, media_ids=[media.media_id]) #APIv2でツイートを送信
            print('「' + tweet + '」' + 'をツイートしました。')



# 定期実行
schedule.every().hour.at(':00').do(nowplay)
schedule.every().hour.at(':20').do(nowplay)
schedule.every().hour.at(':40').do(nowplay)

while True:
    schedule.run_pending()
    sleep(60)

SpotifyAPIとかTwitterAPIの使い方はめちゃ分かりやすい記事があるのでそちらを参考にしてください

実行結果

tweet変数のとこをいろいろごちゃごちゃすれば順番とか変えられると思う。

詰まったとこ

TwitterAPIくんのゴ◯仕様のおかげで、「APIv1.1で画像をアップロードしてから、v2でツイート文とmediaidを送信する」とかいう意味のわからないことをしなければいけない。これで1時間頭悩ませた。こちらもめっちゃ分かりやすい記事があるので載せていただきます。

まとめ

4、5年ぶりにコードを書いたので何もかも忘れてた。意外とほぼ素人でも書けるのがPythonの強みなのかもしれない。20件以上の取得に対応してないけどそんな一気に追加するやつおらんやろ!!ってことで、20件以上やりたい場合は各自調整してください。あと一回目の実行はエラーでるかも。
そういやXだったしPOSTだったな…しーらねw


この記事が気に入ったらサポートをしてみませんか?