スクリプト

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>"

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

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

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

サンプルその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が開かれます。

Comments