Mastodonのatomから投稿画像を取得する方法。
もくじ
投稿画像もTwitterに連携する編
RSSからIFTTTを使ってTwitterに送信するときに EntryImageUrl
という項目を使うと画像も連携できるようになる。
ところが、これがどうやって取られているかというと「本文内に最初に出てきたimgタグ」を見ているっぽい。
Mastodonのユーザ用のAtomでは、画像は <link rel="enclosure" href="..." />
という別のタグに格納されてしまい、本文(content)内には出力されない。
1 2 3 4 5 6 7 |
<entry> … <content type="html" xml:lang="ja">本文</content> <link rel="enclosure" type="image/png" length="369" href="画像1"/> <link rel="enclosure" type="image/png" length="383" href="画像2"/> … </entry> |
つまりIFTTTのRSS Feedで取得できる EntryTitle
EntryUrl
EntryAuthor
EntryContent
EntryImageUrl
EntryPublished
FeedTitle
FeedUrl
のどれを使用しても投稿画像のファイル名を取得することができない!
これを解消するには「content内に画像URLを含める」ようにフィードを修正するしかないんだけどぼくは管理者じゃないので直せませんね。
というわけで「GASを使ってXMLを整形し、IFTTTのRSSの読み先をMastodonからGASの出力結果に変える」ような修正を行う。
(修正前) Mastodonのatom → IFTTT → Twitter等
(修正後) Mastodonのatom → GAS → IFTTT → Twitter等
GASでWebサービスを作成
例えばこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
function doGet() { var url = "自分のフィードのURL"; var xml = UrlFetchApp.fetch(url); var document = XmlService.parse(xml.getContentText()); var root = document.getRootElement(); var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var entries = document.getRootElement().getChildren('entry', atom); for (var i = 0; i < entries.length; i++) { var entryItem = entries[i]; var contentItem = entryItem.getChild('content', atom); var links = entryItem.getChildren('link', atom); for (var j = 0; j < links.length; j++) { var linkItem = links[j]; var relAttr = linkItem.getAttribute('rel').getValue(); if (relAttr != 'enclosure') { continue; } var hrefAttr = linkItem.getAttribute('href').getValue(); var imgTagText = '<img src="' + hrefAttr + '" />'; contentItem.setText(contentItem.getText() + imgTagText); } } var responseXml = XmlService.getPrettyFormat().format(document); var out = ContentService.createTextOutput(); out.setMimeType(ContentService.MimeType.RSS); out.setContent(responseXml); return out; } |
<entry>
内の <link>
のうち rel="enclosure"
のものだけをimgタグに変換した上で <content>
の末尾に追加する。
するとこんな感じで出力されるようになる。
1 2 3 4 5 6 7 |
<entry> … <content type="html" xml:lang="ja">本文<img src="画像1"/><img src="画像2"/></content> <link rel="enclosure" type="image/png" length="369" href="画像1"/> <link rel="enclosure" type="image/png" length="383" href="画像2"/> … </entry> |
IFTTTの修正
IFTTTのRSSの取得先を、従来の https://poofion.com/@nigauri.atom
に変更する。 みたいなやつからGASのURL
https://script.google.com/macros/s/***/exec
これでもし画像が添付されていれば EntryImageUrl
で「1つめの添付画像に限り」取得できる(2つ目以降はどのみちムリ)。ただし画像を添付していない場合は IFTTTのおせっかい機能により http://ifttt.com/images/no_image_card.png
が入っているので注意。
このあたりもGASでif文切って処理を切り分ければなんとかなろう。
便利ツール
Chrome拡張の「Boomerang – SOAP & REST Client」があると Webhooks や GAS のテストが簡単にできて便利。