2009年8月11日火曜日

PyXPCOMコンポーネントを作る.

現在作成中のアドオンでニコニコ動画に自動ログインする機能がほしかったのですが,Javascriptでは難しいようだったので,XPCOMコンポーネントを作る必要がでてきました.

XPCOMはJavascript, Java, C++, Pythonで作れるそうですが,そもそもJavascriptで難しいことはXPCOMのJavascriptでも難しいので,残り3つの中で一番楽そうなPythonで作ることにしました.

ただ情報が少なく,有用そうな情報はMDCの英語サイトくらいしかありませんでした...

Building PyXPCOM

Creating a Python XPCOM component

ぶっちゃけ↑のサイト見てもよく分からなかったので(笑),PythonExtというアドオンに助けてもらうことにしました.このアドオンを入れるとPyXPCOMで作ったコンポーネントをこいつが実行してくれるみたいです.

とりあえずこいつをインストールします.

PythonExt

次にXPCOM開発に必須であるGecko SDKを落としてきます.

Gecko SDK | MDN

そして以下のようなidlファイルを作成します.

#include "nsISupports.idl"
[scriptable, uuid(2b324e9d-a322-44a7-bd6e-0d8c83d94883)]
interface nsINicoUtils : nsISupports
{
string login(in string mail, in string pass);
};

以下のコマンドを実行してxptファイルを作成します.

xpidl.exe -m typelib -w -v -I C:\xulrunner-sdk\sdk\idl nsINicoUtils.idl

IオプションでGecko SDKの中のidlフォルダを環境に合わせて設定して下さい.

xptファイルができたらアドオンフォルダのcomponentsフォルダに置いて下さい.

次にnicoUtils.pyというファイル名で以下のようなコードを書きます.(このファイルもcomponentsフォルダに置いて下さい.)

from xpcom import components, verbose
import urllib2, cookielib

class NicoUtils:
    _com_interfaces_ = components.interfaces.nsINicoUtils
    _reg_clsid_ = "{c456ceb5-f142-40a8-becc-764911bc8ca5}"
    _reg_contractid_ = "@suplik.net/NicoUtils;1"

    def __init__(self):
        print "initializing"

    def __del__(self):
        if verbose:
        print "PySimple: __del__ method called - object is destructing"

    def login(self, mail, password):
        cj = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        r = opener.open("https://secure.nicovideo.jp/secure/login", "mail=%s&password=%s" % (mail, password))
        for cookie in cj:
        if cookie.name == 'user_session':
        return cookie.value

loginメソッドではニコニコ動画の認証用のクッキーを取得しています.ニコニコ動画に自動でログインすると認証用のクッキーが設定されるので,それをreturnしています.

次にこのコンポーネントをFirefoxに登録する必要があります.Firefoxのプロファイルフォルダ内のcompreg.dat, xpti.datを削除すれば,起動時に新しい情報に書き換わるようです.xptファイルを修正したら同じことを繰り返さなければいけません.

無事コンポーネントが登録されたら,アドオンの中から他のXPCOMコンポーネントと同様に呼び出せます.

var NicoUtils = new Components.Constructor("@suplik.net/NicoUtils;1", "nsINicoUtils");
var nicoUtils = new NicoUtils();
var user_sessionValue = nicoUtils.login("hoge@gmail.com", "password");
alert("user_sessionValue);

ニコニコ動画にログインするにはこの値を使ってuser_sessionという名前のクッキーを設定する必要があります.

ちなみにこの方法だとユーザは自分のアドオンだけでなくPythonExtもインストールしなくてはいけないので,かなり面倒になってしまいます...

余力があればいつかC++に書き換えてみよう.

0 件のコメント:

コメントを投稿