2008/03/17


id:TAKESAKOさんのブックマークから
APIチュートリアル - Lingr Group on Hatena
API Tutorial in Lingr Developer Wiki
を見つけた。さっそくpythonでモジュール作った。(既にありそう...)
セッションの作成、入室、発言、退室をメソッドとして公開しています。
セッションの破棄はデストラクタでやってます。使い方は、__main__を参照。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Lingr API Module
"""
import httplib
import urllib
from xml.dom import minidom

__author__ = 'mattn <mattn.jp@gmail.com>'
__url__ = 'http://mattn.kaoriya.net/'
__version__ = "0.01"

"""
Lingr API Class
"""
class LingrAPI:
  """
  initialize class variables and create session.
  """
  def __init__(self, api_key, nickname):
    self.api_key = api_key
    self.nickname = nickname
    self.session = None
    self.conn = httplib.HTTPConnection("www.lingr.com")
    self.conn.request('POST', '/api/session/create/',
        body = "api_key=%s" % urllib.quote(api_key))
    response = self.conn.getresponse()
    data = response.read()
    doc = minidom.parseString(data)
    if doc.getElementsByTagName('status')[0].childNodes[0].data != 'ok':
      raise Exception({
          'code' : doc.getElementsByTagName('code')[0].childNodes[0].data,
          'message' : doc.getElementsByTagName('message')[0].childNodes[0].data})
    self.session = doc.getElementsByTagName('session')[0].childNodes[0].data

  """
  destroy session.
  """
  def __del__(self):
    if self.session:
      import urllib
      from xml.dom import minidom
      self.conn.request('POST', '/api/session/destroy',
          body = "session=%s" % urllib.quote(self.session))
      response = self.conn.getresponse()
      data = response.read()
      doc = minidom.parseString(data)
      if doc.getElementsByTagName('status')[0].childNodes[0].data != 'ok':
        raise Exception({
            'code' : doc.getElementsByTagName('code')[0].childNodes[0].data,
            'message' : doc.getElementsByTagName('message')[0].childNodes[0].data})

  """
  enter room and return room_id
  """
  def enter_room(self, room_id):
    self.conn.request('POST', '/api/room/enter',
        body = "session=%s&id=%s&nickname=%s"
            % (urllib.quote(self.session), urllib.quote(room_id), urllib.quote(self.nickname)))
    response = self.conn.getresponse()
    data = response.read()
    doc = minidom.parseString(data)
    if doc.getElementsByTagName('status')[0].childNodes[0].data != 'ok':
      raise Exception({
          'code' : doc.getElementsByTagName('code')[0].childNodes[0].data,
          'message' : doc.getElementsByTagName('message')[0].childNodes[0].data})
    return doc.getElementsByTagName('ticket')[0].childNodes[0].data

  """
  say message using ticket.
  """
  def say(self, ticket, message):
    self.conn.request('POST', '/api/room/say',
        body = "session=%s&ticket=%s&message=%s"
            % (urllib.quote(self.session), urllib.quote(ticket), urllib.quote(message)))
    response = self.conn.getresponse()
    data = response.read()
    doc = minidom.parseString(data)
    if doc.getElementsByTagName('status')[0].childNodes[0].data != 'ok':
      raise Exception({
          'code' : doc.getElementsByTagName('code')[0].childNodes[0].data,
          'message' : doc.getElementsByTagName('message')[0].childNodes[0].data})
    return doc.getElementsByTagName('occupant_id')[0].childNodes[0].data

  """
  exit room
  """
  def exit_room(self, ticket):
    self.conn.request('POST', '/api/room/exit',
        body = "session=%s&ticket=%s"
            % (urllib.quote(self.session), urllib.quote(ticket)))
    response = self.conn.getresponse()
    data = response.read()
    doc = minidom.parseString(data)
    if doc.getElementsByTagName('status')[0].childNodes[0].data != 'ok':
      raise Exception({
          'code' : doc.getElementsByTagName('code')[0].childNodes[0].data,
          'message' : doc.getElementsByTagName('message')[0].childNodes[0].data})
    return doc.getElementsByTagName('status')[0].childNodes[0].data

#  def find_room(title):
#    self.conn.request('GET', '/search/rooms',
#        body = "query=%s" % urllib.quote(title))
#    response = self.conn.getresponse()
#    data = response.read()

if __name__ == '__main__':
    import sys
    if len(sys.argv) < 2: sys.exit()
    api_key = sys.argv[1]
    nickname = sys.argv[2]
    room_id = sys.argv[3]
    message = sys.argv[4]

    api = LingrAPI(api_key, nickname)
    ticket = api.enter_room(room_id)
    api.say(ticket, message)
    api.exit_room(ticket)
room_idは部屋の検索から検索して、その部屋のURLの最後の部分がIDになります。
今のところbot的な用途でしか使えない程のメソッドしか出してませんが、暇があればメソッドを追加していくかも。

あと、codereposに置いておくので良かったら弄って下さい。
Posted at by



2008/03/14


capture.flickr.js FirefoxでキャプチャしてFlickrにアップロードするJSActionsスクリプト #2008.03.13 « ZeroMemory

といってもCSSだけ...
--- capture.flickr.js.orig  Thu Mar 13 21:55:18 2008
+++ capture.flickr.js   Fri Mar 14 12:37:01 2008
@@ -7616,7 +7616,7 @@
        document.addEventListener( 'mousedown', this.onmousedown, true );
 
        var s = document.createElement('style');
-       s.innerHTML = '* {cursor: crosshair !important;}';
+       s.innerHTML = '* {cursor: crosshair !important; -moz-user-select: none;}';
        document.body.appendChild(s);
        this.style = s;
    },
ふむ。便利だ。
capture.flickr.js FirefoxでキャプチャしてFlickrにアップロードするJSActionsスクリプト #2008.03.13 « ZeroMemory
Posted at by



2008/03/12


結構見逃してる物多いなぁ。
jQuery: jqAlbumParser Plugin, parses out Flickr, Picasa clientside | The Book and the Cover
カッコイイ。
実装するのもそれ程難しくないしサイトの端っこにでも貼り付けても面白いかもしれない。
動作としては、jqAlbumParserがFlickrのFeedをパースする物で、それを表示する為のプラグインがjqGalViewIIとの事。
よってコードは <style media="all">
@import url("/path/to/css/jqGalViewII.css");
</style>
<script type="text/javascript" src="/path/to/javascript/jquery-latest.js"></script>
<script type="text/javascript" src="/path/to/javascript/jqAlbumParser.js"></script>
<script type="text/javascript" src="/path/to/javascript/jqGalViewII.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $(".jqAlbumParser").jqAlbumParser({
        pluginExec : function(){$(this).jqGalViewII();}
    }).click();
});
</script>
<a href="http://api.flickr.com/services/feeds/photos_public.gne?ids=YOUR_FLICKR_ID"
    class="jqAlbumParser wa:flickr">my flickr feed</a>
こんな感じ。「$(document).ready」を使わず実行したいならば「.click()」の所を「.trigger('load')」にすれば自動で表示される。
アンカーのクリックアクションで動作させたいならば、何も指定しないか「.trigger('click')」で行けます。
またfeedのURLの最後に「&tags=XXXX」とすれば、そのタグで絞り込める。簡単なソースで結構リッチなアルバムビューワが出来るって凄いなぁ。

以下、私のflickrで実行した例

続きを読む...

Posted at by