前段
IFTTTで、Twitterの「New tweet by a specific user」をトリガーに、任意のWebhookにデータを回す場合、元のツイートに改行を含むと、うまくデータが回ってくれなくて困ったので、その回避方法のメモ。
他にもありそうだがとりあえず自分の対応を載せます。
対応
IFTTTのThen側、つまりWebhookへの連携の設定で、Content-Typeをapplication/x-www-form-urlencoded
にする。
そのうえで、Bodyの部分にText={{Text}}&...
などでパラメータを繋げばよい。
こんな感じ↓
失敗の記録
最初はContent-Typeがapplication/json
でなんとかやりくりできないかと思ったが、駄目だった。
参考までに過去の実施記録。
ちなみにtext/plainは試してません。
- 改行含むテキストがくると、マジにその部分で改行されたJSONデータをそのまんまWebhookに回そうとする。これはJSONの仕様に違反しているので、Webhook側のJSONパースが失敗する。以下のようなデータのイメージ。
{
"Text":"あいうえお
かきくけこ"
}
- だったら
TweetEmbedCode
を使ってWebhook側でHTMLパースしてやるかと思ったが、TweetEmbedCodeにはHTMLコード内にダブルクォーテーションを含み、IFTTTはこれもやっぱりマジにそのまんまエスケープせずに渡すので、やはりJSON仕様に違反しており、Webhook側でJSONパースに失敗する。以下のようなデータのイメージ。
{
"Text":"<blockquote class="twitter-tweet">..."
}
- Content-Typeが
application/json
の場合でも、改行含まないテキストのケースや、そもそもテキストを連携しないケースなら、何も問題なくWebhookにデータが回っていく。
補足
IFTTTのツイートトリガーの連携は、項目があまり充実していない。
例えばツイートの投稿日時を指すCreatedAt
はApril 08, 2021 at 10:40AM
という内容値になっており、Twitter APIなら取れるはずの「秒」の値が乗ってこない。
このため、IFTTT連携は、Text
回すより、IDとか最小限の値だけにして、あとはWebhook側でTwitter API叩いて取ってくる、とかしたほうがいいかもしれない、と思った。
少なくともこんな面倒くさいことしてまでわざわざTextの値をIFTTT経由で渡すことはなかったなと、今にして振り返っております。
なお、ツイートのStatus IDはLinkeToTweet
という項目に入ってるので、そこから取り出してTwitter APIに投げる形になる。(※LinkeToTweet
はhttp://twitter.com/rm_blank_slash/status/1379207288490102787
という形式なので、取り出す場合はWebhook側でsplit等が必要)