広告枠
本記事のトピック
- 概要
- Pythonのバージョンと必要なモジュール
- Twitter(X)のコード
- Misskeyのコード
- Mastodonのコード
- Blueskyのコード
- Blueskyのコードの解説
- ツイート一元化コード
管理人作品宣伝
嘘解説動画
動画 / 最終更新:2025-01-08ウソだらけの解説動画です。「確かにそうだけど、そうはならんやろ」と思いながら見てくださ…
YouTubeで閲覧するニコニコ動画で閲覧する
利用素材等の詳細情報
ChatGPT-アイコンと名前変更
Chrome 拡張機能 / 最終更新:2023-12-14ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気…
ChromeWebストアで閲覧する
利用素材等の詳細情報
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要
概要
SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。それぞれのSNSについて、認証とツイートのコードは分けています。
コードの個別の解説はしないですが、大体以下の流れです。
①認証を行う
②ツイートを行う(連続してツイートすると前のツイートにリプライする形でツイートする)
一元化したPythonコードは一番最後に記載しています。
命名規則は気にしないでください
Pythonのバージョンと必要なモジュール
Pythonのバージョンは「3.11.0」です。
使っているもずーるは以下です(コロンより後はボクが使っているバージョンです)。
・tweepy(Twitter用):4.12.0
・misskey(Misskey用):4.1.0
・mastodon(Mastodon用):1.8.1
・atproto(Bluesky用):0.0.54
各リンクからそのモジュールのリファレンスが見られるはずです
使っているもずーるは以下です(コロンより後はボクが使っているバージョンです)。
・tweepy(Twitter用):4.12.0
・misskey(Misskey用):4.1.0
・mastodon(Mastodon用):1.8.1
・atproto(Bluesky用):0.0.54
各リンクからそのモジュールのリファレンスが見られるはずです
Twitter(X)のコード
認証用コード
def CreateTwitterInstance():
twitterClient = tweepy.Client(
bearer_token = TWITTER_BEARER_TOKEN,
consumer_key = TWITTER_API_KEY,
consumer_secret = TWITTER_API_SECRET,
access_token = TWITTER_ACCESS_TOKEN,
access_token_secret = TWITTER_ACCESS_TOKEN_SECRET
)
ツイート用コード
def CreateTwitterTweet(message):
if twitterParentTweetId != '':
tweet = twitterClient.create_tweet(text=message, in_reply_to_tweet_id=twitterParentTweetId)
else:
tweet = twitterClient.create_tweet(text=message)
twitterParentTweetId = tweet.data['id']
Misskeyのコード
認証用コード
def CreateMisskeyInstance():
misskeyClient = Misskey(MISSKEY_SERVER_NAME, i=MISSKEY_ACCESS_TOKEN)
ツイート用コード
def CreateMisskeyTweet(message):
if misskeyParentTweetId != '':
misskeyRet = misskeyClient.notes_create(text=message, reply_id=misskeyParentTweetId)
else:
misskeyRet = misskeyClient.notes_create(text=message)
misskeyParentTweetId = misskeyRet['createdNote']['id']
Mastodonのコード
認証用コード
def CreateMastodonInstance():
mastodonClient = Mastodon(
api_base_url = MASTODON_SERVER_URL,
client_id = MASTODON_CLIENT_ID,
client_secret = MASTODON_CLIENT_SECRET,
access_token = MASTODON_ACCESS_TOKEN
)
ツイート用コード
def CreateMastodonTweet(message):
if mastodonParentTweetId != '':
mastodonRet = mastodonClient.status_post(message, in_reply_to_id=mastodonParentTweetId)
else:
mastodonRet = mastodonClient.status_post(message)
mastodonParentTweetId = mastodonRet['id']
Blueskyのコード
認証用コード
def CreateBlueskyInstance():
blueskyClient = Bluesky()
blueskyClient.login(BLUESKY_LOGIN_ID, BLUESKY_LOGIN_PW)
ツイート用コード
def CreateBlueskyTweet(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 blueskyParentTweet != None:
blueskyRet = blueskyClient.send_post(
text=text_builder,
reply_to={
"parent": {
"uri": blueskyParentTweet["uri"],
"cid": blueskyParentTweet["cid"]
},
"root": {
"uri": blueskyRootTweet["uri"],
"cid": blueskyRootTweet["cid"]
}
}
)
else:
blueskyRet = blueskyClient.send_post(text=text_builder)
blueskyRootTweet = blueskyRet
blueskyParentTweet = blueskyRet
Blueskyのコードの解説
TextBuilderについて
Blueskyは送ったテキスト内のURLやタグが自動でリンク化されません。そのため、TextBuilderというものを使ってURLやタグを明示的に指定する必要があります。
本コード内では、通常のテキスト・URL・タグをsplitしてそこからTextBuilderを作っています。
reply-toについて
Blueskyのコードも、他のSNSと同じで前のツイートからリプライするような実装になっているのですが、「reply_to」の値がちょっと複雑です。なぜかは知りませんが、Blueskyのツイートはリプライのツイートだけでなく、そのツリーの一番上のツイートまで指定しないといけないらしくこのような作りになっています。
(parent→リプライ元のツイート / root→そのツリーの一番上のツイート)
ツイート一元化コード
以下が一元化したクラスです。
定数は自身の認証情報を入力してください。
Twitterはアクセストークンの発行に手続きが必要です。
MisskeyとMastodonはWeb上のユーザ設定等から発行できます。
Blueskyは普通にログインIDとパスワードで入れます。
URLやハッシュタグも含めて220文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
定数は自身の認証情報を入力してください。
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文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
コメントログ
コメント投稿
広告枠