2013年04月01日


Google Chrome 拡張作成入門

最新の情報は以下のリンク先です

マウスカーソル下の画像表示用 HTML コードをクリップボードにコピーする Google Chrome 拡張

▼ 以下はバージョンアップ(仕様変更)の為、動作しません
---------------------------------------------------------

以下のコードは最も簡単でかつ利用価値の高いものです。必要なファイルは、拡張アプリケーションの基本定義である『background.html』と、全体の仕様を定義する『manifest.json』と、アイコンファイルが3つです( アイコンは必ずしも必要ではありません )

以上の5つファイルを任意のディレクトリ内に配置して、Google Chrome から読み込むだけで、拡張機能として実装されて、デバッグも可能になります。もし、世の中に配布したいのであれば、そこからパッケージを作成する事も可能です
background.html(UTF-8N)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">

// *************************************************
// クリップボードへコピー
// *************************************************
function clip_Copy(str) {
	document.getElementById('text').value = str;
	document.getElementById('text').select();
	document.getElementById('text').focus();
	document.execCommand("Copy");
}

// *********************************************************
// 右クリックメニューの処理
// *********************************************************
function active_Action(info, tab) {

	var str = "";

	if ( info.mediaType == 'image' && typeof( info.srcUrl ) !== 'undefined' ) {
		str = '<img src="' + info.srcUrl + '"';
		str += ' style="border: solid 0px #000000" />';
		clip_Copy( str );
		chrome.tabs.executeScript(
			null,
			{ code: "alert('"+str+"');" },
			function() {
			}
		);
	}

}

// *********************************************************
// 初期処理
// *********************************************************
try {
	chrome.contextMenus.removeAll();
}catch(e) {}

// 右クリックメニューを作成
chrome.contextMenus.create(
	{
		"title": "画像HTML取得",
		"contexts":["image"],
		"onclick": active_Action
	}
);
</script>
</head>
<body>
<textarea name="text" id="text"></textarea> 
</body>
</html>

manifest.json
{
   "background_page": "background.html",
   "description": "\u53F3\u30AF\u30EA\u30C3\u30AF\u3088\u308A\u6A19\u6E96\u7684\u306A \u753B\u50CF\u7528HTML \u3092\u53D6\u5F97\u3057\u307E\u3059",
   "icons": {
      "128": "icon128.png",
      "16": "icon16.png",
      "48": "icon48.png"
   },
   "name": "\u753B\u50CFHTML\u53D6\u5F97",
   "permissions": [ "contextMenus", "tabs", "http://*/*", "https://*/*" ],
   "version": "1.0"
}

まず最初にデベロッパーモードのチェックボックスをオンにします。そうすると、読み込み用のボタンが現れるので5つのファイルを配置したフォルダを選択します






ファイルを読み込んだ状態



詳細を表示した状態



background.html のリンクをクリックすると、非表示である background.html 用のデベロッパーツールが開きます( 通常は F12 でひらくもの )

id は、仮の id で、正式に登録されるとGoogle Chrome の環境フォルダ でダウンロードしたスクリプトを実行して、さらに extentions フォルダに入るとその中にあるはずです。

この拡張機能の要点

画像を右クリックすると、コンテキストメニューに登録した機能が表示されて、選択するとその画像を使用した HTML 記述がクリップボードにコピーされます。





クリップボードへのコピー

background.html はもともと非表示なので、コピーするために必要な入力エリアを作成しておいて、データをセットして選択して document.execCommand("Copy"); でコピーします

コンテキストメニューの追加

これは、API の処理なので、まず manifest.json で利用する API を宣言する必要があります。その上で、chrome.contextMenus.removeAll(); で既存のメニューを削除しておいて、chrome.contextMenus.create で作成します。

"contexts":["image"] の記述が、対象が画像のみであることを示しています。他には、 "page", "frame", "selection", "link", "editable", "video", "audio" というようなコンテンツを複数配列で指定する仕様になっています。

実際の処理

クリックすると、定義した function が呼び出されますが、その際に API から引数が渡されて、ある程度の情報をその場で利用する事ができます。この場合は、画像の URL を使って、IMG 要素を完成させています。

1) OnClickData
2) Tab

表示されているページへの通信

セキュリティ上の理由だと思われますが、直接表示しているページへのアクセスは禁じられており、メッセージを送る事によって互いに通信するような仕様になっているようです。

その中で簡単に background から呼び出せる方法がこの、chrome.tabs.executeScript を使った実行です。

この処理はメニューとは別の API 分類になるので、manifest.json で宣言しておく必要があります。

関連する記事

Twitter用埋め込みコードを取得する Google Chrome 拡張


posted by at 2013-04-01 02:24 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする

2013年02月07日


Google News Search API の NewsShow でニュースコンテンツを利用する

Code Playground

慣れている場合は、Code Playground( サンプルコードと実演 ) でチェックして動作を確認します( IE では動かないので注意して下さい )

※ Code Playground は使い方が解りにくいので、以下に抜粋サンプルを作成しています

その他のサンプルコードと実装

Google NewsShow ( queryList ) - SOURCE
Google NewsShow( IFRAME ) - SOURCE
( IFRAME のほうが簡単で CSS の影響が出ません )

実装について

ドキュメント : NewsShow Documentation - Google News Search API - Google Code

Google のサンプルはページの onload で実装されているので、単独ページなら良いですが、部品としてコンテンツとして埋め込みたい場合はなかなか面倒ですですが、本来 onload で実装する必要は全く無いので以下のように書きます。
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
▲はヘッダ部分に記述します
( 必ずしもヘッダ部分で描く必要は無く、実装したい DIV の直前でもかまいません )

ここをクリックすると、以下と同等のコードを編集しながらテストできます
( onload での実装 )
<div style='position:absolute;left:951px;top:0px;height:250px;'>
<div id="ggnews"></div>
</div>
<script type="text/javascript">
google.load("elements", "1", {packages : ["newsshow"]});
</script>
<script type="text/javascript">
(function () {
	var options = {
		"format" : "300x250",
		"linkTarget" : "_blank",
		"displayTime" : 30000
	}
	var content = document.getElementById('ggnews');
	var newsShow = new google.elements.NewsShow(content, options);
})();
</script>

displayTime は表示が切り替わる間隔で、ここでは 30 秒にしています

フォーマットは以下の二通りが有効です
■ "728x90"
■ "300x250"



posted by at 2013-02-07 08:24 | Comment(0) | Google | このブログの読者になる | 更新情報をチェックする

2013年01月19日


Seesaa に VBScript でログインする

HTTP でアクセスするオブジェクトは、サーバー用クライアント用と二つありますが、現時点ではサーバー用が優れているように思われます。この場合(記事下のサンプルコード)は、おそらくクライアント用では動かないと思いますが、少なくともタイムアウトの設定が可能なのは、サーバー用です。

経験上、クッキーの処理はオブジェクトが自動的に引き継いでいるようなので、このサンプルではクッキーの処理はありません。しかし、WEB サービスのシステムとして突然 URL にアクセスしても拒否されるので( Seesaa では、POST する場合は事前に表示されたページのキーが必要です )正規表現での処理が必要になります。

これが理由で、ページの HTML 構成が変更されると、この手のアプリケーションは動かなくなるので注意が必要です。( 今回を含めて過去に2回変更しています )

実際のブラウザで処理してネットワークの情報を読み、どのような情報が必要かは各ブラウザの開発者用ツールを使って確認しますが、IE のそれは役に立たないので注意して下さい。Google Chrome か Firefox を使うと良いです。

POST する場合は、HTTP ヘッダに "application/x-www-form-urlencoded" を送るのは HTTP の仕様なので必ず必要ですが、POST も通常の POST 以外に "multipart/form-data; boundary=xxxxxxx" というバイナリデータを送る事が可能な仕様もあります。そのあたりの仕様はなかなか解りづらいですが、ここでは説明していません。

Seesaa のシステムも人間の作ったアプリケーションなので、完璧では無いので、この手のアプリで対応しようとする場合、首をかしげるような時もありますが、だいたいにおいて『結果オーライ』で深く考えないほうがいいと思います。あと、システム的な不明点もあり、どうしてもこのサンプルで返ってくるページが utf-8 ではなく SHIFT_JIS でかえって来ます。しかし、次の処理には関係無いので『ログイン』としてはこれで OK であると思います。

テキストファイルへの書き込みは、取得したページを確認できるようにする為で処理とは直接関係はありません。
' ***********************************************************
' サーバーオブジェクトの準備
' ***********************************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' ***********************************************************
' 正規表現用
' ***********************************************************
Set regEx = New RegExp
' ***********************************************************
' ページ書き込み用
' ***********************************************************
Set Fs = CreateObject( "Scripting.FileSystemObject" )

' ログインページの取得
Call objHTTP.Open("GET","https://ssl.seesaa.jp/auth",False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send()

' ページ全体
strPage = objHTTP.responseText

' 書き込み専用(2)で、存在しない場合は作成(True)
Set OutObj = Fs.OpenTextFile( "page_login.html", 2, True )
OutObj.Write objHTTP.responseText
OutObj.Close

' 投稿用のキーを取得
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = "authpost""><input value=""([^""]+)"""
Set Matches = regEx.Execute( strPage )
For Each Match in Matches
	strPostKey = Match.SubMatches(0)
	Exit For
Next

Wscript.Echo strPostKey

' ***********************************************************
' ログイン用の情報
' ***********************************************************
' Seesaa のログインユーザ( メールアドレス )
emailData = ""
' Seesaa のログインパスワード
passData = ""
' 対象となるブログの ID
blogData = ""

' ***********************************************************
' ログイン ( POST )
' ***********************************************************
' ログイン URL
Call objHTTP.Open("POST","https://ssl.seesaa.jp/auth",False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = ""
strData = strData & "aXt=" & strPostKey
strData = strData & "&email=" & emailData
strData = strData & "&password=" & passData
strData = strData & "&return_to=http%3A%2F%2Fblog.seesaa.jp%2F"
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)

Set OutObj = Fs.OpenTextFile( "page_login_after.html", 2, True )
OutObj.Write objHTTP.responseText
OutObj.Close

関連する記事

Seesaa ブログのエクスポートを呼び出して全てをバックアップするスクリプト

VBScript で Seesaaブログへ禁止ワード一括登録( アップロード )




タグ:VBScript HTTP
posted by at 2013-01-19 23:15 | Comment(0) | Seesaa | このブログの読者になる | 更新情報をチェックする

2012年11月19日


HTML(ローカル) を使用して Facebook へ画像をアップロードする

『App ID/API Key』が必要です。以下の client_id のフィールドに API Key をセットして送信すると、Facebook にログインしていない場合は、ログイン画面が表示されるのでそこでログインすると、URL に access_token=アクセストークン の形でセットされているのでそれを取得します。

※ ログイン済の場合は Success と表示されるのでアドレスバーを見ます。

get_login.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<body>
<form action="https://www.facebook.com/dialog/oauth/">
<pre>
<input type="text" name="redirect_uri" value="http://www.facebook.com/connect/login_success.html">
<input type="text" name="response_type" value="token">
<input type="text" name="client_id">
<input type="text" name="scope" value="user_about_me,user_photos,read_stream,publish_stream">
<input type="submit" name="send" value="get login">
</pre>
</form>
</body>
</html>

『アクセストークン』を以下の該当部分( FORM の action の中 )にセットしてブラウザで実行してファイルをアップロードできます(メッセージも同時に投稿できます)

▼ UTF-8N で保存します
file_upload.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Facebook に画像アップロード</title>
</head>
<body>
<form method="post" action="https://graph.facebook.com/me/photos?access_token=アクセストークン" enctype="multipart/form-data">
<pre>
<input type="file" name="source">
<textarea name="message"></textarea>
<input type="submit" name="send" value="file upload">
</pre>
</form>
</body>
</html>





タグ:Facebook API
posted by at 2012-11-19 23:29 | Comment(0) | WEBサービス | このブログの読者になる | 更新情報をチェックする

2012年06月19日


既存の Google Chrome 拡張のカスタマイズ( ブラウザのクイックリンク )



この拡張は便利ですし、中身は難しい事を一切やっていないので、ちょっと知識があれば自分でカスタマイズできます。画像の下3つは追加したもので、上の部分も順序を入れ替えています。必要無いエントリは、コードの一番下の div 一列を削除するだけです。

1) Google Chrome の拡張フォルダへ移動
( このスクリプトで開くフォルダの中にある Extentions フォルダが拡張フォルダです )
2) plpjogfhobhpdcmcblieglnoooccfcmm フォルダに入る
3) 1.5_0\popup.html をエディタで開く
4) 以下のコードですべて置き換える
<style> 
body {
  overflow: hidden;
  margin: 0px;
  padding: 0px;
  background: white;
}
 
div:first-child {
  xmargin-top: 0px;
}
 
div {
  cursor: pointer;
  text-align: left;
  padding: 0px;
  
  width: 212px;
  height:38px;
  margin-top: 0px;
  background: #ffffff;
  background-image:url(Blank.png);
  background-position:center center;
  background-repeat:no-repeat;
}
div:hover {
  background-image:url(Hover.png);
}
table 
{
    border-collapse:collapse;
    padding:0;
    margin-left:2px;
    vertical-align:middle;
    font-family: verdana, Arial, Helvetica;
    font-size: 12px;
    font-weight:500;

}
</style> 


<body onload="Localise();">

    <script>
        function getLocal(sID, sDefault) {
            var sRes = chrome.i18n.getMessage(sID);
            if (sRes == "") sRes = sDefault;
            return(sRes);
        }

        function Localise() {
            document.getElementById("tB").innerHTML = getLocal("lbookmarks", "Bookmarks");
            document.getElementById("tH").innerHTML = getLocal("lhistory", "History");
            document.getElementById("tD").innerHTML = getLocal("ldownloads", "Downloads");
            document.getElementById("tE").innerHTML = getLocal("lextensions", "Extensions");
            document.getElementById("tP").innerHTML = getLocal("lplugins", "Plugins");
            document.getElementById("tM").innerHTML = getLocal("lmemory", "Memory");
            document.getElementById("tS").innerHTML = getLocal("lsettings", "Settings");
        }

    
        function xclick(ClickedItem) {
            var Clicked = ClickedItem.id.toString();
            var strURL = "";
            if (Clicked.charAt(0) == "c") {
                strURL = "chrome://";
                strURL += Clicked.substr(1);
                strURL += "/";
            }
            if (Clicked.charAt(0) == "a") {
                strURL = "about:";
                strURL += Clicked.substr(1);
                strURL += "/";
            }
            if (Clicked.charAt(0) == "w") {
                strURL = "http://goo.gl/";
                strURL += Clicked.substr(1);
            }
            chrome.tabs.create({ url: strURL, selected: true });
            window.close();
        }
    </script> 

    <div onclick="xclick(this);" id="csettings"><table><tr><td><img src="iSettings.png" /></td><td id=tS>Settings</td></tr></table></div>
    <div onclick="xclick(this);" id="cdownloads"><table><tr><td><img src="iDownloads.png" /></td><td id=tD>Downloads</td></tr></table></div>
    <div onclick="xclick(this);" id="cbookmarks"><table><tr><td><img src="iBookmarks.png" /></td><td id=tB>Bookmarks</td></tr></table></div>
    <div onclick="xclick(this);" id="chistory"><table><tr><td><img src="iHistory.png" /></td><td id=tH>History</td></tr></table></div>
    <div onclick="xclick(this);" id="cextensions"><table><tr><td><img src="iExtensions.png" /></td><td id=tE>Extensions</td></tr></table></div>
    <div onclick="xclick(this);" id="cplugins"><table><tr><td><img src="iPlugins.png" /></td><td id=tP>Plugins</td></tr></table></div>
    <div onclick="xclick(this);" id="amemory"><table><tr><td><img src="iMemory.png" /></td><td id=tM>Memory</td></tr></table></div> 

    <div onclick="xclick(this);" id="csettings/cookies"><table><tr><td><img src="iSettings.png" /></td><td>Cookies</td></tr></table></div>
    <div onclick="xclick(this);" id="w"><table><tr><td><img src="iBookmarks.png" /></td><td>URL短縮</td></tr></table></div> 
    <div onclick="xclick(this);" id="wg4lFF"><table><tr><td><img src="iBookmarks.png" /></td><td>Google+</td></tr></table></div> 

</body>

どういうわけか、SHIFT_JIS で直接日本語書き込んでいるのに正しく表示されました。
c と a は、chrome:// と about: が対象ですが、新たに http:// を追加しました。id の一文字目を w にして、http://goo.gl/ に続く文字列を w に続けて id にするようにしています。続ける内容は移動したい URLを Google URL 短縮で短縮して作成しています。


posted by at 2012-06-19 22:42 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする