以下が一元化したクラスです。
定数は自身の認証情報を入力してください。
Twitterはアクセストークンの発行に手続きが必要です。
MisskeyとMastodonはWeb上のユーザ設定等から発行できます。
Blueskyは普通にログインIDとパスワードで入れます。
# パッケージの読み込み
import tweepy
from misskey import Misskey
from mastodon import Mastodon
from atproto import Client as Bluesky, client_utils as BlueskyUtils
from tkinter import messagebox
import re
class TweetManagement:
#-----定数--------------------------------------------------------------
TWITTER_API_KEY = "{自分の認証情報を入れる}"
TWITTER_API_SECRET = "{自分の認証情報を入れる}"
TWITTER_BEARER_TOKEN = "{自分の認証情報を入れる}"
TWITTER_ACCESS_TOKEN = "{自分の認証情報を入れる}"
TWITTER_ACCESS_TOKEN_SECRET = "{自分の認証情報を入れる}"
MISSKEY_SERVER_NAME = "{インスタンス名 例:misskey.io}"
MISSKEY_ACCESS_TOKEN = "{自分の認証情報を入れる}"
MASTODON_SERVER_URL = "インスタンス名 例:https://mastodon.social"
MASTODON_CLIENT_ID = "{自分の認証情報を入れる}"
MASTODON_CLIENT_SECRET = "{自分の認証情報を入れる}"
MASTODON_ACCESS_TOKEN = "{自分の認証情報を入れる}"
BLUESKY_LOGIN_ID = "{自分の認証情報を入れる}"
BLUESKY_LOGIN_PW = "{自分の認証情報を入れる}"
#-----コンストラクタ--------------------------------------------------------------
def __init__(self):
self.twitterClient = None
self.misskeyClient = None
self.mastodonClient = None
self.blueskyClient = None
self.twitterParentTweetId = ''
self.misskeyParentTweetId = ''
self.mastodonParentTweetId = ''
self.blueskyRootTweet = None
self.blueskyParentTweet = None
self.CreateTwitterInstance()
self.CreateMisskeyInstance()
self.CreateMastodonInstance()
self.CreateBlueskyInstance()
#-----ツイート関連のメソッド--------------------------------------------------------------
# Twitter 接続インスタンスを作成
def CreateTwitterInstance(self):
self.twitterClient = tweepy.Client(
bearer_token = TweetManagement.TWITTER_BEARER_TOKEN,
consumer_key = TweetManagement.TWITTER_API_KEY,
consumer_secret = TweetManagement.TWITTER_API_SECRET,
access_token = TweetManagement.TWITTER_ACCESS_TOKEN,
access_token_secret = TweetManagement.TWITTER_ACCESS_TOKEN_SECRET
)
# Misskey 接続インスタンスを作成
def CreateMisskeyInstance(self):
self.misskeyClient = Misskey(TweetManagement.MISSKEY_SERVER_NAME, i=TweetManagement.MISSKEY_ACCESS_TOKEN)
# Mastodon 接続インスタンスを作成
def CreateMastodonInstance(self):
self.mastodonClient = Mastodon(
api_base_url = TweetManagement.MASTODON_SERVER_URL,
client_id = TweetManagement.MASTODON_CLIENT_ID,
client_secret = TweetManagement.MASTODON_CLIENT_SECRET,
access_token = TweetManagement.MASTODON_ACCESS_TOKEN
)
# Bluesky 接続インスタンスを作成
def CreateBlueskyInstance(self):
self.blueskyClient = Bluesky()
self.blueskyClient.login(TweetManagement.BLUESKY_LOGIN_ID, TweetManagement.BLUESKY_LOGIN_PW)
# Twitter ツイート実行
def CreateTwitterTweet(self, message):
if self.twitterParentTweetId != '':
tweet = self.twitterClient.create_tweet(text=message, in_reply_to_tweet_id=self.twitterParentTweetId)
else:
tweet = self.twitterClient.create_tweet(text=message)
self.twitterParentTweetId = tweet.data['id']
# Misskey ツイート実行
def CreateMisskeyTweet(self, message):
if self.misskeyParentTweetId != '':
misskeyRet = self.misskeyClient.notes_create(text=message, reply_id=self.misskeyParentTweetId)
else:
misskeyRet = self.misskeyClient.notes_create(text=message)
self.misskeyParentTweetId = misskeyRet['createdNote']['id']
# Mastodon ツイート実行
def CreateMastodonTweet(self, message):
if self.mastodonParentTweetId != '':
mastodonRet = self.mastodonClient.status_post(message, in_reply_to_id=self.mastodonParentTweetId)
else:
mastodonRet = self.mastodonClient.status_post(message)
self.mastodonParentTweetId = mastodonRet['id']
# Bluesky ツイート実行
def CreateBlueskyTweet(self, message):
# 送信用のメッセージ作成
text_builder = BlueskyUtils.TextBuilder()
messageArray = re.split(r'(https?://[^\s]+|#[^\s]+)', message) # 正規表現を使って「#」と「https://」で文字列を区切る
for msg in messageArray:
if msg.startswith("#"):
text_builder.tag(msg, msg.lstrip("#"))
elif msg.startswith("https://") or msg.startswith("http://"):
text_builder.link(msg, msg)
else:
text_builder.text(msg)
# ツイート実行
blueskyRet = None
if self.blueskyParentTweet != None:
blueskyRet = self.blueskyClient.send_post(
text=text_builder,
reply_to={
"parent": {
"uri": self.blueskyParentTweet["uri"],
"cid": self.blueskyParentTweet["cid"]
},
"root": {
"uri": self.blueskyRootTweet["uri"],
"cid": self.blueskyRootTweet["cid"]
}
}
)
else:
blueskyRet = self.blueskyClient.send_post(text=text_builder)
self.blueskyRootTweet = blueskyRet
self.blueskyParentTweet = blueskyRet
#-----ツイート関連のメソッド--------------------------------------------------------------
def execTweet(self, message):
if len(message) <= 220:
self.CreateTwitterTweet(message)
self.CreateMisskeyTweet(message)
self.CreateMastodonTweet(message)
self.CreateBlueskyTweet(message)
else:
messagebox.showinfo("エラー", "文字数が多すぎます") # 取得した内容を表示するためのダイアログ
使い方は
tweetMgmt = TweetManagement()
tweetMgmt.execTweet('ツイートしたい内容')
です。
URLやハッシュタグも含めて220文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。