スクリプト

出典: dev.lunascape.tv

HOME > エクステンション(拡張機能) > スクリプト

目次

Lunascape拡張スクリプトとは?

Lunascapeでは、簡単なスクリプトを書くだけでLunascapeの機能を拡張したり、いろいろな操作を自動化したりすることができます。 このページでは、スクリプトの作り方を詳しく解説していきます。

対応するスクリプト言語

Lunascape5でサポートしているスクリプト言語は、VBScriptとJScript(Microsoft版JavaScript)の2つです。それぞれの言語の詳細な説明については以下のサイトを参考にしてください。

LunascapeAPI

Lunascapeが外部に公開しているAPIの一覧になります。 スクリプトからこのAPIを実行することで、Lunascapeを操作することが可能となります。

スクリプトの登録の仕方

スクリプトを作成したら、Lunascapeに登録する必要があります。

スクリプトのLunascapeへの登録方法

[メニューバー]より[表示]-[サイドバー]-[設定]を実行して[設定]ツリーを表示します。 [設定]ツリーに表示されている[機能]以下の[スクリプト]アイテムを右クリックします。 [新規アイテムの追加]あるいは[新規スクリプトフォルダアイテムの追加]を実行する ことでスクリプトをLunascapeに登録できます。

[新規アイテムの追加]により追加されるアイテムでは、実行されるスクリプトから Lunascapeを操作することができます。

[新規スクリプトフォルダアイテムの追加]により追加されるアイテムでは Lunascapeを操作に加えて、実行されるスクリプトから追加されたフォルダアイテム自身に子アイテムを追加 することができます。 なお両方のアイテムとも、インターネット上からHTMLやXMLをダウンロードして 解析することができます。

スクリプトをワンクリックで呼び出せるようにする方法

[設定]ツリーに登録したスクリプトは[お気に入り]ツリーに登録することができます。 [お気に入り]に登録したいスクリプトを右クリックメニューから[コピー]あるいは[切り取り]を して、お気に入りツリーの追加したい場所に[貼り付け]ることでスクリプトがお気に入りから 利用可能になります。 また、[設定]ツリーと[お気に入り]ツリーの間でマウスのドラッグ&ドロップをしても同様の 結果を得られます。 また、[リンクバーの参照先]に指定しているフォルダに登録することで、リンクバーから スクリプトを実行することもできます。

新形式スクリプトと旧形式スクリプトについて

新形式スクリプトと旧形式スクリプトの違い

旧形式のスクリプトアイテムでは、スクリプトからLunascapeを操作することだけが 可能であり、アイテム自身に子アイテムを追加したり、インターネット上からHTMLや XMLをダウンロードすることはできません。 また、Lunascapeのレジストリへの登録も必要となります(登録作業はLunascape 自身が行います)。

新形式のスクリプトではLunascapeを操作することのほかに、スクリプトアイテム自身に 子アイテムを追加したり、インターネット上からHTMLやXMLをダウンロードして 解析することができます。 また、レジストリへの登録を必要としません。

またスクリプトを旧形式か新形式で実行するかにより、作成するスクリプトの内容が 異なる場合があります。 サンプルでは必要であれば旧形式と新形式両方を記載します。 なお、旧形式と新形式いずれのサンプルも動作結果は同じです。

登録したスクリプトの実行方法の選択

Lunascapeの[設定ツリー]より登録したスクリプトアイテムは、設定を変更することで新形式で実行するか旧形式で実行するかを選択できます。設定方法は以下のとおりです。

  • 登録したスクリプトアイテムを右クリックし、[詳細]を実行
  • [スクリプトの設定]タブを開く
  • [旧形式のスクリプトとして実行する]を、新形式で実行する場合はオフに旧形式で実行する場合はオンにする

なお、インストール時に登録されていたスクリプトアイテムは新形式で実行することはできません。

旧形式と新形式スクリプトによるLunascapeの操作方法の違い

スクリプトを旧形式で実行する際にLunascapeを操作するには 以下のようにする必要があります。

	Dim lunascape
	Set lunascape = CreateObject("Lunascape2.LunascapeAPI")

スクリプトを新形式で実行する際にLunascapeを操作するには旧形式のようにする必要はなく、'lunascape'オブジェクトとしてそのまま利用可能です。

新形式スクリプトの記述について

スクリプトを新形式として実行する場合は特定の名前でスクリプトファイル内に関数を用意する必要があります。 Lunascapeはスクリプトアイテムからスクリプトを実行する際に特定の名前の関数をスクリプト内に探しその関数実行をします。実行される関数は実行結果をTrueもしくはFalseで返すことができます。[新規スクリプトフォルダアイテムの追加] により追加されたアイテムの場合、関数がTrueを返した場合のみアイテム自身の更新が行われます。 実行される関数名は以下のとおりです。

登録するアイテムの種類 スクリプトに用意する関数名
新規スクリプトフォルダアイテムの追加 OnGetChildList
新規アイテムの追加 OnClick

onclickの記述例です。

Function OnClick()
	・
	・
	・
	If ... Then
		OnClick = True
	Else
		OnClick = False
	End If
	・
	・
	・
End Function


OnGetChildListの記述例です。

Function OnGetChildList()
	・
	・
	・
	If ... Then
		OnGetChildList = True
	Else
		OnGetChildList = False
	End If
	・
	・
	・
End Function

それでは、実際にスクリプトを作成してみましょう!

サンプルその1:現在アクティブなタブをリンクに

まずは基本ということで、簡単なスクリプトからはじめます。 ブログなどを書いているときにこのページにリンクしたい!と思うことはよくありますね。 そんなときに便利なスクリプトです。 このスクリプトを実行するだけでリンクタグがクリップボードにコピーされるので、 あとは貼り付けるだけでリンクの完了です。

旧形式のスクリプトとして実行する場合のサンプル

'Lunascape Co., LTD.  All rights reserved.

Option Explicit

' Lunascapeを操作するオブジェクトを作成
Dim lunascape
Set lunascape = CreateObject("Lunascape2.LunascapeAPI")

' 処理を実行
build_link_tag_from_active_document()

' Sub build_link_tag_from_active_document
'
'タブのタイトルとURLを元に、
'<a href="URL" target="_blank">タイトル</a>
'という文字列にコピーするスクリプトを作成します。
'
Sub build_link_tag_from_active_document()
	' アクティブなドキュメントのIDを取得
	Dim dcid
	dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())

	' アクティブなドキュメントオブジェクトを取得
	Dim document
	Set document = lunascape.GetDocumentObject(dcid)

	If document Is Nothing Then
		' メッセージを表示
		lunascape.MessageBox("アクティブなドキュメントを取得できませんでした")
	Else
		' ドキュメントのタイトルを取得
		Dim title
		title = document.title

		' タイトルが取得できない場合は代替のタイトルを利用する
		If title = "" Then
			title = "タイトルなし"
		End If

		' コピーする文字列を準備
		Dim strTag
		strTag = "<a href='" & document.URL & "' target='_blank'>" & title & "</a>"

		' クリップボードにコピー
		Dim oclip
		Set oclip = document.parentWindow.clipboardData

		Dim cltext
		cltext = oclip.getData("text")
		cltext = strTag
		oclip.setData "text", cltext
	End If
End Sub

新形式のスクリプトとして実行する場合のサンプル

'Lunascape Co., LTD.  All rights reserved.

Option Explicit

' Function onclick
'
'タブのタイトルとURLを元に、
'<a href="URL" target="_blank">タイトル</a>
'という文字列にコピーするスクリプトを作成します。
'
Function onclick()
	onclick = True

	' アクティブなドキュメントのIDを取得
	Dim dcid
	dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())

	' アクティブなドキュメントオブジェクトを取得
	Dim document
	Set document = lunascape.GetDocumentObject(dcid)

	If document Is Nothing Then
		' メッセージを表示
		lunascape.MessageBox("アクティブなドキュメントを取得できませんでした")
	Else
		' ドキュメントのタイトルを取得
		Dim title
		title = document.title

		' タイトルが取得できない場合は代替のタイトルを利用する
		If title = "" Then
			title = "タイトルなし"
		End If

		' コピーする文字列を準備
		Dim strTag
		strTag = "<a href='" & document.URL & "' target='_blank'>" & title & "</a>"

		' クリップボードにコピー
		Dim oclip
		Set oclip = document.parentWindow.clipboardData

		Dim cltext
		cltext = oclip.getData("text")
		cltext = strTag
		oclip.setData "text", cltext
	End If
End Function

スクリプトの解説

Dim dcid
dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())

Lunascapeで現在アクティブなタブの番号を取得し、その番号から ドキュメントのIDを取得しています。

If document Is Nothing Then
			・
			・

Lunascapeで表示されているタブが存在しない場合はアクティブな ドキュメントは有効なオブジェクトとして取得できないので、 その判定をしています。

lunascape.MessageBox("アクティブなドキュメントを取得できませんでした")

lunascapeオブジェクトのMessageBoxメソッドを利用してエラーメッセージを 表示しています。 有効なオブジェクトとしてdocumentを取得できた場合は処理を続行します。

Dim title
title = document.title

ドキュメントのタイトルを取得しています。 lunascapeオブジェクトGetDocumentObjectで取得したオブジェクトは Document Object Model(DOM)としてスクリプトから操作できます。 DOMについての詳細は http://msdn2.microsoft.com/en-us/library/ms533050.aspx を参照してください。

Dim strTag
strTag = "<a href='" & document.URL & "' target='_blank'>" & title & "</a>"

クリップボードにコピーする<a>タグを組み立ててstrTag変数に 格納しています。

Dim oclip
Set oclip = document.parentWindow.clipboardData
Dim cltext
cltext = oclip.getData("text")
cltext = strTag
oclip.setData "text", cltext

DOMの機能を活用して組み立てた<a>タグをクリップボードにコピー しています。

サンプルその2:現在開いているAmazonのページからアソシエイト用URLを生成する

次にちょっと難しいスクリプトにチャレンジしてみましょう。 その2はAmazonの商品ページを開いているときに実行すると、自分のアソシエイトIDが埋め込まれた URLがクリップボードにコピーされるというスクリプトです。 Amazonのアソシエイトをやっている人には必須のスクリプトですね。

旧形式のスクリプトとして実行する場合のサンプル

    'Lunascape Co., LTD.  All rights reserved.
    
    Option Explicit
    
    Dim strAssosiateId
    strAssosiateId = "lunascape-22"
    
    ' Lunascapeを操作するオブジェクトを作成
    Dim lunascape
    Set lunascape = CreateObject("Lunascape2.LunascapeAPI")
    
    ' 処理を実行
    get_amazon_assosiate_url()
    
    ' Function get_amazon_assosiate_url
    '
    ' 現在開いているAmazonのページからアソシエイト用URLを生成して
    ' Lunascapeの出力ウィンドウに表示します。
    ' また、商品の画像へのURLもLunascapeの出力ウィンドウに表示します。
    Function get_amazon_assosiate_url()
        get_amazon_assosiate_url = True
    
        ' アクティブなドキュメントのIDを取得
        Dim dcid
        dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())
    
        ' アクティブなドキュメントオブジェクトを取得
        Dim document
        Set document = lunascape.GetDocumentObject(dcid)
    
        If document Is Nothing Then
            ' メッセージを表示
            lunascape.MessageBox("アクティブなドキュメントを取得できませんでした")
        Else
            ' アフィリエイトURLを取得
            Dim strAssosiateUrl
            strAssosiateUrl = get_assosiate_url(document.URL)
    
            If strAssosiateUrl <> "" Then
                ' アイテムの画像
                Dim strItemImageUrl
                strItemImageUrl = get_item_image_url(document)
    
                ' クリップボードにコピー
                Dim oclip
                Set oclip = document.parentWindow.clipboardData
    
                Dim cltext
                cltext = oclip.getData("text")
                cltext = "アフィリエイトURL" _
                        & Chr(13) & Chr(10)  _
                        & strAssosiateUrl    _
                        & Chr(13) & Chr(10)  _
                        & "商品の画像"       _
                        & Chr(13) & Chr(10)  _
                        & strItemImageUrl    _
                        & Chr(13) & Chr(10)
    
                oclip.setData "text", cltext
            End If
        End If
    End Function
    
    ' Function get_assosiate_url
    '
    ' 指定されたURLがAmazon.co.jpの商品ページであれば
    ' そのURLからアフィリエイト用のURLを組み立てます。
    Function get_assosiate_url(strUrl)
        get_assosiate_url = ""
    
        ' 商品のページは
        ' http://www.amazon.co.jp/o/ASIN/商品のID/...
        ' という構成になっているので、この文字列に
        ' 部分一致したら商品のページを表示していると
        ' 判断する
        Dim strAmazonItem
        strAmazonItem = "http://www.amazon.co.jp/o/ASIN/"
    
        If InStr(strUrl, strAmazonItem) Then
            ' 商品のID以降の部分を取得
            Dim strRight
            strRight = Right(strUrl, Len(strUrl)-Len(strAmazonItem))
    
            ' 次に"/"が出現するまでを商品のIDとして切り出す
            Dim s
            s = Split(strRight, "/", -1)
    
            Dim strItemId
            strItemId = s(0)
    
            ' アフィリエイト用URLを組み立てる
            get_assosiate_url = strAmazonItem & strItemId & "/" & strAssosiateId
        End If
    End Function
    
    ' Function get_item_image_url
    '
    ' 指定されたHTMLドキュメントから
    ' 商品の画像のURLを取得します。
    Function get_item_image_url(document)
        get_item_image_url = ""
    
        ' 商品の画像は
        ' <td id="prodImageCell">
        '   <a href="..."><img src="..."></a>
        ' </td>
        ' を解析することで取得できる。
    
        ' "prodImageCell"というIDの要素を取得
        Dim prodImageCell
        Set prodImageCell = document.getElementById("prodImageCell")
    
        If IsObject(prodImageCell) Then
            ' 1番目の子アイテムを取得
            Dim a
            Set a = prodImageCell.firstChild
    
            If IsObject(a) Then
                ' 1番目の子アイテムを取得
                Dim img
                Set img = a.firstChild
    
            If IsObject(img) Then
                ' srcを取得
                get_item_image_url = img.src
            End If
        End If
    End If
End Function

新形式のスクリプトとして実行する場合のサンプル

'Lunascape Co., LTD.  All rights reserved.

Option Explicit

Dim strAssosiateId
strAssosiateId = "lunascape-22"

' Function onclick
'
' 現在開いているAmazonのページからアソシエイト用URLを生成して
' Lunascapeの出力ウィンドウに表示します。
' また、商品の画像へのURLもLunascapeの出力ウィンドウに表示します。
Function onclick()
    onclick = True

    ' アクティブなドキュメントのIDを取得
    Dim dcid
    dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())

    ' アクティブなドキュメントオブジェクトを取得
    Dim document
    Set document = lunascape.GetDocumentObject(dcid)

    If document Is Nothing Then
        ' メッセージを表示
        lunascape.MessageBox("アクティブなドキュメントを取得できませんでした")
    Else
        ' アフィリエイトURLを取得
        Dim strAssosiateUrl
        strAssosiateUrl = get_assosiate_url(document.URL)

        If strAssosiateUrl <> "" Then
            ' アイテムの画像
            Dim strItemImageUrl
            strItemImageUrl = get_item_image_url(document)

            ' クリップボードにコピー
            Dim oclip
            Set oclip = document.parentWindow.clipboardData

            Dim cltext
            cltext = oclip.getData("text")
            cltext = "アフィリエイトURL" _
                    & Chr(13) & Chr(10)  _
                    & strAssosiateUrl    _
                    & Chr(13) & Chr(10)  _
                    & "商品の画像"       _
                    & Chr(13) & Chr(10)  _
                    & strItemImageUrl    _
                    & Chr(13) & Chr(10)

            oclip.setData "text", cltext
        End If
    End If
End Function

' Function get_assosiate_url
'
' 指定されたURLがAmazon.co.jpの商品ページであれば
' そのURLからアフィリエイト用のURLを組み立てます。
Function get_assosiate_url(strUrl)
    get_assosiate_url = ""

    ' 商品のページは
    ' http://www.amazon.co.jp/o/ASIN/商品のID/...
    ' という構成になっているので、この文字列に
    ' 部分一致したら商品のページを表示していると
    ' 判断する
    Dim strAmazonItem
    strAmazonItem = "http://www.amazon.co.jp/o/ASIN/"

    If InStr(strUrl, strAmazonItem) Then
        ' 商品のID以降の部分を取得
        Dim strRight
        strRight = Right(strUrl, Len(strUrl)-Len(strAmazonItem))

        ' 次に"/"が出現するまでを商品のIDとして切り出す
        Dim s
        s = Split(strRight, "/", -1)

        Dim strItemId
        strItemId = s(0)

        ' アフィリエイト用URLを組み立てる
        get_assosiate_url = strAmazonItem & strItemId & "/" & strAssosiateId
    End If
End Function

' Function get_item_image_url
'
' 指定されたHTMLドキュメントから
' 商品の画像のURLを取得します。
Function get_item_image_url(document)
    get_item_image_url = ""

    ' 商品の画像は
    ' <td id="prodImageCell">
    '   <a href="..."><img src="..."></a>
    ' </td>
    ' を解析することで取得できる。

    ' "prodImageCell"というIDの要素を取得
    Dim prodImageCell
    Set prodImageCell = document.getElementById("prodImageCell")

    If IsObject(prodImageCell) Then
        ' 1番目の子アイテムを取得
        Dim a
        Set a = prodImageCell.firstChild

        If IsObject(a) Then
            ' 1番目の子アイテムを取得
            Dim img
            Set img = a.firstChild

            If IsObject(img) Then
                ' srcを取得
                get_item_image_url = img.src
            End If
        End If
    End If
End Function

スクリプトの解説

	Dim strAssosiateId
	strAssosiateId = "lunascape-22"

アフィリエイトIDをグローバル変数として定義しています。 個人用のアフィリエイトURLを作成するにはこの値を編集する必要があります。

	Dim dcid
	dcid = lunascape.GetDocumentID(lunascape.ActiveIndex())

	' アクティブなドキュメントオブジェクトを取得
	Dim document
	Set document = lunascape.GetDocumentObject(dcid)
  
	If document Is Nothing Then

アクティブなドキュメントを取得する作業です。サンプルその1と同様の作業です。


	Dim strAssosiateUrl
	strAssosiateUrl = get_assosiate_url(document.URL)

スクリプト内に用意したget_assosiate_url関数を用いてアクティブなドキュメントのURLからアフィリエイト用URLを作成して取得しています。


	Dim strItemImageUrl
	strItemImageUrl = get_item_image_url(document)

スクリプト内に用意したget_item_image_url関数を用いてアイテムの画像へのURLを取得しています。


	Dim cltext
	cltext = oclip.getData("text")
	cltext = "アフィリエイトURL" _
		& Chr(13) & Chr(10)  _
		& strAssosiateUrl    _
		& Chr(13) & Chr(10)  _
		& "商品の画像"       _
		& Chr(13) & Chr(10)  _
		& strItemImageUrl    _
		& Chr(13) & Chr(10)
  
	oclip.setData "text", cltext

取得したアフィリエイトURLと画像へのURLをクリップボードにコピーしています。


サンプルその3:「スクリプトフォルダアイテム」で新形式スクリプトを利用する方法

新形式スクリプトの導入に伴い利用可能となった「スクリプトフォルダアイテム」に登録するためのスクリプトをサンプルコードで解説します。
「スクリプトフォルダアイテム」はスクリプトによって自身に子アイテムを追加することのできるアイテムです。
子アイテムとして登録されるアイテムはスクリプトから利用可能な「TreeItemManager」オブジェクトを通じて行うことができ、「お気に入りフォルダ」および「お気に入りリンク」を登録できます。
「スクリプトフォルダアイテム」を新規に追加して以下のコードをVBScriptファイルとして保存し、アイテムに登録します。
追加したアイテムを右クリックして表示されるメニュー「最新の状態に更新」をクリックすると子アイテムが追加されます。

スクリプトのサンプル

Function OnGetChildList()
  OnGetChildList = True

  Dim idRoot
  idRoot = treeitemmanager.GetRootItemID()

  Dim itemFolder
  itemFolder = treeitemmanager.AppendChild(idRoot, "FAVORITE_FOLDER", "フォルダアイテム")

  Dim itemLink
  itemLink= treeitemmanager.AppendChild(itemFolder, "FAVORITE_LINK", "リンク")
  treeitemmanager.ItemURL(itemLink) = "http://www.luna.tv/"
End Function

スクリプトの解説

  Dim idRoot
  idRoot = treeitemmanager.GetRootItemID()

「TreeItemManager」オブジェクトへのアイテムの登録は必ずルートアイテム以下に行う必要があります。
この行ではGetRootItemIDメソッドを呼び出してルートアイテムの識別子を取得しています。

  Dim itemFolder
  itemFolder = treeitemmanager.AppendChild(idRoot, "FAVORITE_FOLDER", "フォルダアイテム")

AppendChildメソッドを呼び出してルートアイテム以下に「お気に入りフォルダ」アイテムを追加しています。
AppendChildメソッドの1番目の引数に親アイテムの識別子を指定し、2番目の引数に「お気に入りフォルダ」追加を示す"FAVORITE_FOLDER"を指定し、3番目の引数にアイテムのタイトルを指定しています。

  Dim itemLink
  itemLink= treeitemmanager.AppendChild(itemFolder, "FAVORITE_LINK", "リンク")
  treeitemmanager.ItemURL(itemLink) = "http://www.luna.tv/"

AppendChildメソッドを呼び出して直前に追加した「お気に入りフォルダ」アイテム以下に「お気に入りリンク」アイテムを追加しています。
AppendChildメソッドの1番目の引数に直前に追加した「お気に入りフォルダ」アイテムの識別子を指定し、2番目の引数に「お気に入りリンク」の追加を示す"FAVORITE_LINK"を指定し、3番目の引数にアイテムのタイトルを指定しています。 次にItemURLに追加した「お気に入りリンク」アイテムの識別子を指定してアイテムのURLを設定しています。
このアイテムをクリックするとLunaTVが開かれます。