IFTTTでDiscordに内容が見えるようX/Twitterをポスト転送する

この記事は約7分で読めます。

前提としてIFTTTの有料版が必要。
X/TwitterのAPIが有料化した影響で、IFTTTのX関係機能が有料アカウント限定になった。月約700円(5ドル)のPro+プランで無制限に登録できる。350円(2.5ドル)のProプランでも転送はできるが、フィルタコード機能が使えないため単独では内容を表示できない。

各種UIの説明は2023/12/16時点のもの。アプデにより多少位置が変わったりする可能性がある。

Discordのウェブフックを取得する

“ウェブフックの管理”権限を持つチャンネルの設定画面を開き、”連携サービス”から”ウェブフック”へ進み、”新しいウェブフック”で作成する。

ウェブフックの詳細を開いて”ウェブフックURLをコピー”を選択するとクリップボードにURLが入る。これは後で使うのでメモしておくか、必要になったときに再度この画面を開いて取得する。
このURLはそのチャンネルへの発言管理者権限も同義なので、外部に流出しないよう厳密に管理すること。URLを使用すると、任意のアカウントやアイコンで無制限に投稿でき、犯人を見つける方法はない。名誉毀損などの違法行為があった場合、Discordに開示請求すれば不可能ではないが。

作成済みのウェブフックがある場合、それを転用しても良い。ただしBotが作成したウェブフックはそのBotしかURLを取得できない制限がある(2022年頃から不可能になった)。

一つのチャンネルに対して8つまでしかウェブフックを作成できない。上限に達している場合は転用したり不要なものを消す必要があるが、Botが作成したものを消せば当然そのBotの動作に差し障る可能性が高い。

IFTTTのアカウントを作る

IFTTTのサイトを開き、右上の”Get started”を選択。指示に従ってアカウントを作る。
この先も含め、英語が苦手なら適時グーグル翻訳などを使って読む。IFTTTは日本語に非対応。

アプレット作成

画面上部の”Create”ボタンから新規アプレットを作る。
アプレットは”小さなアプリ”のような意味。機能の塊。


If Thisを選び、

検索欄に”Tw”と入れるなりしてTwitterを選ぶ。現時点では”X”と入れても出てこない。

次の画面は自分の目的に応じたものを選ぶ。
一番多いと思われる「特定のアカウントの新規ポストを転送したい」なら”New tweet by a specific user”を選ぶ。「検索に引っかかったポスト(特定のハッシュタグなど)を転送したい」なら”New tweet from search”。

以下はspecific userの場合で書くが、他を選んでも基本は変わらない。

“Twitter account”には、右下の小さいボタンから自分のアカウントを登録する必要がある。そのアカウントから見た状態が反映されるはずなので、ブロックされているアカウントを対象に登録しても転送できないし、フォローしていない鍵垢も無理。

“Username to watch”は監視対象とするアカウント名。@abcの部分を書く。@はあってもなくても良い

次に”Then That”を選択。

最初と同様に検索して”Webhooks”を選択する。”Discord”の選択肢もあるが、ウェブフックのほうが自由度が高いためここでは紹介しない。

“Make a web request”を選択。

“URL”には最初に取得したウェブフックURLを入れる。
“Method”は”POST”。
“Content Type”は”application/json”。
“Additional Headers”及び”Body”は空欄のまま。

“Creat action”で確定させる。

再びこの画面に戻り、

今度はIfとThenの間の+を選択し、”Filter code”を選ぶ。

ここでブラウザを縦長にしていると「Please widen your browser window or download the IFTTT app to use the complete filter code experience.」と出て進めなくなるので、一時的に全画面にしておく。


右側は触らなくて良い。左側の内容をすべて消し、下記内容をコピペして、右上の”Add filter”で確定させる。

const url = Twitter.newTweetByUser.LinkToTweet.replace("twitter.com", "vxtwitter.com").replace("x.com", "vxtwitter.com")
const body = `{"content":"${url}"}`
MakerWebhooks.makeWebRequest.setBody(body)

最後に

最下部の”Continue”を選択したら設定完了。支払いが終わっていない場合はここでカード登録を促される。

カスタマイズなど

ここからは任意。

Proプランしかないとき

Pro+に加入していない場合、フィルタコードが使えない。
Bodyに{"content":"{{LinkToTweet}}"}と入れれば、URLをDiscordに投稿することはできる。

ただし最近XがEmbed情報を返してくれなくなったので、単にリンクを張ってもURLが出るのみで、ポスト内容などは表示してくれない。Discordに投稿した後に、別のBotなりを使用してEmbedを出さないと不便。そのようなBotがあるかどうかは調べてない。

1つのURLで複数の名前を使い分けたい

フィルタ2行目のconst body = `{"content":"${url}"}`を編集すれば可能。
ただ、こちらの設定はDiscord側のウェブフック設定アイコン/名前を上書きしてしまい、編集が面倒になるので、ウェブフック登録数が上限間近なわけでなければ推奨しない。

const body = `{"username":"名前","avatar_url":"https://hoge.com/pic.png","content":"${url}"}`

“username”の後に表示名、”avatar_url”の後にアイコン画像のURLを””で囲って入れるだけ。
これにより1つのURLを複数のアプレット等で共用できるようになる。
半角の"`は使用禁止。

fxtwitterに変えたい

X/TwitterのEmbedを出してくれる主なサービスとして、vxtwitterとfxtwitterがある。
上記サンプルではvxを使用したが、別のサービスに差し替えることもできる。

fxはvxより僅かに対応範囲が広いが、正直ほとんどの場合はUIの好みの問題となるだろう。fxtwitter.comの代わりにfixupx.comかtwittpr.xomと入力しても同じ結果を得られる。

フィルタ1行目の
const url = Twitter.newTweetByUser.LinkToTweet.replace("twitter.com", "vxtwitter.com").replace("x.com", "vxtwitter.com")
で2回vxtwitter.comが出てくる部分を他のドメインに書き換えれば良い。

ちなみに、ここでやっているのは、元々のポストURLの中に”twitter.com”があればvxに変換し、次に”x.com”があればそれもvxに変換するという処理。現状のIFTTTはtwitter.comを送ってくるので後半は不要だが、将来的に仕様が変わった場合に備えて両方入れてある。

投稿内容を編集したい

フィルタ2行目のconst body = `{"content":"${url}"}`を編集すれば可能。
"${url}"がDiscordへの発言本文なので、ここに任意の内容を書けばそのまま投稿される。

${url}を書いた部分がURLに後から置換される。
改行したい場合は\nと書く。\は環境次第でバックスラッシュ(/の逆)あるいはドルマークのように表示される。キーボードだとバックスペースの左。
Unicode絵文字も使えるし、メンションなどの各種特殊表記にも対応している。
半角の"`は使用禁止。

余談

当初うまく動作せず、IFTTTのエラーログではDiscordから400が返されたことしか分からず困ってしまった。

Node.jsでPOSTを受信してconsole.logするだけのハリボテサバを書いてVSCode上で実行し、ngrokを使用して全体公開することでPOSTの内容を読めるようにした。ngrok初めて使ったけどとても便利で良い。初見から10分で鯖建てが完了した。

結局内容に問題は見つからず、再度Discord宛に変えたところ動作したので、おそらくどこかで転記ミスがあったのだと思われる。私自身が課金したわけではなく、管理サバの利用者が課金してくれてそこに指示した形だった。

コメント

タイトルとURLをコピーしました