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