商品サンプル画像
スッキリわかるJava入門 第3版 (スッキリわかる入門シリーズ)
商品ページ
Amazon
収益広告(手動登録)
サクラ度:○(問題なし)
商品サンプル画像
しょせん他人事ですから ~とある弁護士の本音の仕事~ 10 (黒蜜コミックス)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
商品サンプル画像
盤上のオリオン(8) (週刊少年マガジンコミックス)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
商品サンプル画像
ダンダダン 22 (ジャンプコミックスDIGITAL)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
商品サンプル画像
水属性の魔法使い@COMIC 第8巻 (コロナ・コミックス)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
記事の概要
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
作成日:2024-10-06
最終更新日:2024-10-13
記事の文字数:7584
情報技術情報技術-WebAPIプログラミング
本記事のトピック
  • 概要
  • Pythonのバージョンと必要なモジュール
  • Twitter(X)のコード
  • Misskeyのコード
  • Mastodonのコード
  • Blueskyのコード
  • Blueskyのコードの解説
  • ツイート一元化コード
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文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
コメントログ
※コメントは最新50件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
管理人ツイート
商品サンプル画像
姫様“拷問”の時間です 19 (ジャンプコミックスDIGITAL)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
商品サンプル画像
魔都精兵のスレイブ 20 (ジャンプコミックスDIGITAL)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
商品サンプル画像
D.C. Re:tune~ダ・カーポ~ リチューン 限定版<さくらEdition> -Switch 【Amazon.co.jp限定】 オリジナルPC&スマホ壁紙 配信 限定版特典・ヴァイスシュヴァルツPRカード(4種) 同梱
商品ページ
Amazon
非収益広告(手動登録)
サクラ度:○(問題なし)
商品サンプル画像
まどろみバーメイド 18巻 (芳文社コミックス)
商品ページ
Amazon
収益広告(自動登録)
サクラ度:△(要確認)
管理人作品宣伝
剣と魔法と学園モノ。3 - パーティ編成確認ツール
Webサイト / 最終更新:2025-03-10
『ととモノ。3』のパーティ編成を考える際に使えるツールです。…『ととモノ。3』のパーティ編成を考える際に使えるツールです。

HPで閲覧する利用素材等の詳細情報
ジグソーパズル風パズルゲーム
Webサイト / 最終更新:2025-01-23
ジグソーパズル風パズルゲームです。自分で画像を設定してパズルにできます。…ジグソーパズル風パズルゲームです。自分で画像を設定してパズルにできます。

HPで閲覧する利用素材等の詳細情報
作品一覧はこちら
関連ページ
JavaScriptでアナログ時計とデジタル時計を表示するコード
最終更新日:2025-05-29
概要 最近アナログ時計を使ったので、アナログ時計を表示するJavaScriptコードを載せます。 …
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-03
最終更新日:2025-04-20
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-02
最終更新日:2025-04-15
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
最終更新日:2025-04-13
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
最終更新日:2025-03-31
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
記事を閲覧する
gifler.js仕様メモ
最終更新日:2025-03-23
本ページの趣旨 「gifler.js」という、gifアニメーションをcanvasに簡単に表示できる…
記事を閲覧する
【プログラミング】実例で分かるかもしれない再帰処理
最終更新日:2024-12-15
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
最終更新日:2024-12-06
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
最終更新日:2024-10-13
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
記事を閲覧する
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
最終更新日:2024-10-08
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
記事を閲覧する
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグネットスラング系プログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
ポケットタウン_パズル一覧
最終更新日:2025-05-02
スコア:686.9423 pt
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
記事を閲覧する
ととモノ。3:各学科の強みを一覧化
最終更新日:2025-10-12
スコア:654.2888 pt
このページのポイントどの学科が良いかすぐに分かる各学科のどのような点が良いか分かる各役割で欲しいスキ…
記事を閲覧する
剣と魔法と学園モノ。3 前作からの変更点
最終更新日:2025-10-12
スコア:492.6209 pt
概要 もうそろそろ「ととモノ。3」のリマスターが出るので、自分自身のための振り返りと言う意味も込め…
記事を閲覧する
アークナイツ:生息演算「熱砂秘聞」の攻略メモ
最終更新日:2025-01-13
スコア:438.9888 pt
注意 本ページには攻略情報も一部含まれてるので、そういうのを見たくない人は見ない方が良いです。含ま…
記事を閲覧する
ヒカルの碁で、なぜ佐為は消えたのか
最終更新日:2025-04-21
スコア:408.1244 pt
概要 ヒカルの碁で佐為が消えた理由について、「ヒカルの才能を目覚めさせるという役割を終えたから」と…
記事を閲覧する
剣と魔法と学園モノ。3 - パーティ編成確認ツール
最終更新日:2025-09-23
スコア:399.3772 pt
ツール概要 ととモノ。3のパーティ編成を考える際に使うツールです。 攻略本や攻略wikiを参考にし…
記事を閲覧する
メイド・オブ・ザ・デッド-攻略お助け情報
最終更新日:2024-05-01
スコア:374.6947 pt
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
記事を閲覧する
剣と魔法と学園モノ。2G - パーティ編成確認ツール
最終更新日:2024-05-09
スコア:259.6047 pt
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
記事を閲覧する
最新記事
OpenAI API:Webサーチモードで参考にしてほしいURLを送っても無視されることがある問題について
最終更新日:2025-12-07
このページのポイントWebサーチでも、まずは「プロンプトだけ」を読んで「解釈」される「前提として見て…
記事を閲覧する
不思議の幻想郷 TODR:装備の印の組合せシミュレーションツール
最終更新日:2025-11-30
概要本ページは『不思議の幻想郷 TOD RELOADED.』の印考慮用のツールページです。基本事項固…
記事を閲覧する
逆転裁判3:あやめさんのナルホド君への呼び方にある3つの伏線
最終更新日:2025-11-26
このページのポイント呼び方ひとつに3つも伏線あるなんてスゲーネタバレ注意本ページには「逆転裁判3」の…
記事を閲覧する
VRoidナビゲーター:質問機能を強化しました
最終更新日:2025-11-25
このページのポイントVナビの質問機能がいま開いているページを参照するようになった必要な情報をネット上…
記事を閲覧する
商品サンプル画像
司法試験&予備試験 体系別 短答過去問題集 刑法 第3版 司法試験&予備試験 体系別短答過去問題集シリーズ
商品ページ
Amazon
収益広告(手動登録)
サクラ度:○(問題なし)