個人ブログのようなものです。とくにジャンルはありません。
広告枠
記事の概要
作成日:2024-10-06
最終更新日:2024-10-13
記事の文字数:7584
本記事のトピック
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
各リンクからそのモジュールのリファレンスが見られるはずです
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とパスワードで入れます。
# パッケージの読み込み 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文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
広告枠
関連ページ
(現在ページ)SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話 当然ですが本サイト…
Twitterの「興味関心」のチェックを全部まとめて外す
Twitterの「興味関心」のチェックを全部まとめて外せない Twitterに「興味関心」とやらを…
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題…
東京03のyoutubeチャンネルの概要ページの挙動がおかしい
東京03のyoutubeチャンネルの概要ページの挙動がおかしい…
Youtube Data APIでハンドルIDからユーザ情報を取得できない
Youtube Data APIでハンドルIDからユーザ情報を取得できない問題 結論から言うと現在…
ウマ娘まとめサイト(InoReader)
ウマ娘まとめサイト(InoReader)…
ウマ娘まとめサイト(Feedly)
ウマ娘まとめサイト(Feedly)…
Pythonを使ってinoreaderでサイトの更新情報を取得してみた
inoreader(イノリーダー?)が公開しているWeb APIを使用して、Pythonで自動的にサ…
関連タグ
情報技術
最新ページ
制作物一覧
ボクが作成した制作物の一覧です ボクが作成した制作物の一覧です。 更新停止しているものは積極的に更…
(現在ページ)SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
NovelAI R18イラスト集
概要 『NovelAI』で作成したR18イラストの寄せ集めです。 全81枚。 R18なので満18歳…
NovelAI イラスト集
概要 『NovelAI』で作成したイラストの寄せ集めです。 別で失敗集も上げていますが、こちらはそ…
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
統合戦略#4:探索者と銀氷の果て-ダック卿・ゴプニク・涙目の坊や出現ライン
ステージ名 ダック卿たちが 備考 絶対出ない 不確定だよ 絶対出るよ ■一層 死を待つ獣の群れ 2…
NovelAI 失敗集
概要 『NovelAI』で作成したイラストの中で失敗したものを集めました。 33枚ありますが見た目…
ウォーリーを探せ素材作成用ツール
概要 「ウォーミーを探せ」という動画を作成した時に作成したツールです。 画像を「ランダムに回転」「…
地獄先生ぬ~べ~で好きな切ないエピソード
概要 初代というべきか、週刊少年ジャンプで連載されていた地獄先生ぬ~べ~で好きな切ないエピソードを…
本サイトについて
本サイトの概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報について…
コメントログ
コメント投稿




本サイトのタグ一覧
タグを表示する NovelAIR18Webサイト作成Webツールアークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグホラーポケットタウン気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
管理人動画宣伝

 ※再生時に音が出るので注意
広告枠