Waveロボット内でガジェットをURLパターンから取得する
Waveロボットの中でガジェットを取得するには普通は次のようにするわけですが
def OnBlipSubmitted(props, context): blip = context.GetBlipById(props['blipId']) gadget = blip.GetGadgetByUrl('http://example.com/your_gadget.xml')
残念なことに Blip#GetGadgetByUrl
にはガジェット貼付け時に使ったURLそのまま渡してやる必要があります。つまりガジェットを動的に生成していてURLがhttp://example.com/dynamic_gadget.xml?key1=val1&key2=val2
だったりすると、そのガジェットを取り出すにはガジェットのパラメータ key1=val1&key2=val2
を先に知ってないといけないという、ニワトリとタマゴ状態になるわけです。
さすがに不便だったので適当な関数作りました。
def GetGadgetByBaseUrl(blip, url): for el in blip.elements.values(): if (el.type == ELEMENT_TYPE.GADGET and getattr(el, 'url', None).startswith(url)): return el return None
これをロボットのソースファイルの最初に貼りつけておけば、GetGadgetByBaseUrl
にURLの一部分を渡してやるだけでガジェットを取ってこれます。先の例で言えば GetGadgetByBaseUlr(blip, 'http://example.com/dynamic_gadget.xml')
で http://example.com/dynamic_gadget.xml?key1=val1&key2=val2
が取得可能です。
WaveのロボットAPIは9月からほとんど変わっていないんですが、そろそろバージョンアップしないんですかね。