fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

Twitter cardとOpen graphのデータを取ってくる

Twitterカードのデータは個々のwebページのmetaタグなので、ページをフェッチしてhtmlを解析すればよい。AndroidではXmlPullParserを使えばお手軽にhtmlを解析できる。

dev.twitter.com

developer.android.com

ちなみに、上のサイトには

  • KXmlParser via XmlPullParserFactory.newPullParser().
  • ExpatPullParser, via Xml.newPullParser().

などと書いてあるが少なくともM(API Level 23)ではXml.newPullParser()でも返ってくるのはKXmlPullParserである様子。

ここでの肝はXmlPullParser#setFeature(Xml.FEATURE_RELAXED, true)をすること。これがないと閉じてないmetaタグやlinkタグのせいでheadの閉じタグを読み込むところで例外がでる。文法的にゆるふわなところをいい感じに無視してくれるフラグということだと思う。しかし、これをもってしてもhtml 4.0のドキュメントタイプ宣言部分をパースできないようなので、XmlPullParserに食わせる前に削っておくなどの配慮が必要である(追記:冷静に考えたらそんなわけないじゃんとなった。doctype宣言が適切でないのが原因のようす)。また、上のサイトではXmlPullParser#require()でpullparserの状態をチェックしているが、このメソッドは大文字小文字を厳格にチェックするようなのでオススメしない。

あとはhttpクライアントのリダイレクトを有効にしておくことぐらいだろうか。OkHttp3はデフォルトではリダイレクトが有効になっていた。

twitter cardに対応していないサイトでも、open graph protocolに従ったデータを書いているサイトもある。これも合わせて読み込むようにしておくと、カードを作れるサイトの幅が広がるので良い。instagramとか。

ogp.me

カードの準備をすることによってgoo.glとかで圧縮されたurlの展開を先んじて行えるので、モバイルでのリダイレクト遅すぎ問題を解決できる。androidならintentでアプリを直接開くこともできる。