スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Safariで閲覧中のページの被はてブ数を表示するAppleScript

SafariScriptingと、XML-RPCを使った『はてなブックマーク件数取得API』を組み合わせて、閲覧中のページの被はてブ数を表示するAppleScript。

ダイアログで結果を表示するだけでは味気無いので、user数をクリックするとブクマしたユーザが一覧出来るページに飛ぶようにHTMLを生成して、do javascriptでSafariに表示させるようにしてます。(AppleScript内でスタイルシート書くのも変な感じ)

最前面のウインドウの全タブのURLを処理して表示します。


はてなAPIでのやり取りはシンプルで、被ブクマ数を取得するメソッド『bookmark.getCount』を使って、
tell application "http://b.hatena.ne.jp/xmlrpc"
   call xmlrpc {method name:"bookmark.getCount", parameters:{"<ページのURL>"}}
end tell
みたいにしてやれば、URLをラベルにしたレコードでブクマ数が返ってきます。

Safariのタブの切り替えにはGUI Scriptingを使ってるんですが、Safari 1.xと2.xとではUIのグループ番号(アドレスバーやブックマークバーの列に番号が付いている)が変わってるみたいで、2.xだとブックマークバーを表示した状態でのタブバーのグループは3になる様です。(いや、ひょっとしたら調べ方が悪いかも知れない)

GUI Scriptingが使えるように、あらかじめユニバーサルアクセスの『補助装置にアクセスできるようにする』をチェックしておく必要があります。

あと、今回初めて気付いたんですが、OS X 10.4のスクリプトエディタって、エスケープ記号が『円マーク』では無く『バックスラッシュ』でないとコンパイル出来ないんですね。10.3のとは逆になってるのでSafariからコピペする場合円マークをバックスラッシュに置換してやる必要があります。

■動作確認
MacOS X 10.4.8
Safari 2.0.4
property hatebu_href : "<a href=\"http://b.hatena.ne.jp/entry/"
property styleTag1 : "<style type=\"text/css\">a:link,a:visited{color:#0000FF;font-size:90%}"
property styleTag2 : ".hatebu a:link,.hatebu a:visited{color:#FF0000;font-size:80%}</style>"

global cntTab, uiGroup
--set uiGroup to 1
set uiGroup to my check_UIgroup()
set cntTab to my get_countTab()
set theResults to {} as list

tell application "Safari"
   activate
   repeat with rep from 1 to cntTab
      my switch_currentTab(rep)
      if URL of document 1 exists then
         set theURL to URL of document 1
         set theTitle to name of document 1
         
         --はてブAPIを呼び出し、結果をリストに保存
         try
            tell application "http://b.hatena.ne.jp/xmlrpc"
               set cntHatebu to (call xmlrpc {method name:"bookmark.getCount", parameters:{theURL}}) as list
            end tell
         on error
            set cntHatebu to " 不明 "
         end try
         set theResults to theResults & ""
         set theRec to {|URL|:theURL, title:theTitle, hatebu:cntHatebu as text}
         set last item of theResults to theRec
      end if
   end repeat
   
   --リストから結果を取り出し、HTMLで書き出す
   set resultHTML to ""
   repeat with rep from 1 to (count of items of theResults)
      set _url to get |URL| of item rep of theResults
      set _title to get title of item rep of theResults
      set _hatebu to get hatebu of item rep of theResults
      if _hatebu > 1 then
         set _users to " users"
      else
         set _users to " user"
      end if
      set entry_title to "<a href=\"" & _url & "\" target=_blank>" & _title & "</a></div>"
      set resultHTML to resultHTML & entry_title & "<div class=\"hatebu\">" & hatebu_href & _url & "\" target=_blank>" & _hatebu & _users & "</a></div><br>"
   end repeat
   
   set resultHTML to styleTag1 & styleTag2 & resultHTML
   --display dialog resultHTML
   make new document
   do JavaScript "document.write (" & quoted form of resultHTML & ")" in document 1
end tell

--タブのUIグループを特定
on check_UIgroup()
   try
      tell application "System Events"
         tell process "Safari"
            set cntBtn to count of buttons of group 3 of window 1
         end tell
         set chkGroup to 3
         if cntBtn is 0 then set chkGroup to 2
         return chkGroup
      end tell
   on error
      display dialog "アドレスバーは表示されていますか?"
      error number -128
   end try
end check_UIgroup

--開いているタブの数を取得
on get_countTab()
   tell application "System Events"
      tell process "Safari"
         set cntTab to count of buttons of group uiGroup of window 1
      end tell
   end tell
end get_countTab

--num番のタブを開く
on switch_currentTab(num)
   tell application "System Events"
      tell process "Safari"
         click button num of group uiGroup of window 1
      end tell
   end tell
end switch_currentTab
スポンサーサイト

PhotoshopCS2での操作を記録してJavaScriptで書き出す

こんなのが付属していたとは知りませんでした。PhotoshopCS2での操作を記録してJavaScriptで書き出すプラグイン。

『ScriptingListener.plugin』

Mac版のPhotoshopCS2では『Adobe Photoshop CS2/スクリプティングガイド/ユーティリティ』フォルダ内にあるので、これをプラグインフォルダに入れて起動すれば、デスクトップにファイル『ScriptingListenerJS.log』が作成され、操作した内容がどんどん記録されていきます。

こんな感じ。
// =======================================================
var id1878 = charIDToTypeID( "slct" );
    var desc387 = new ActionDescriptor();
    var id1879 = charIDToTypeID( "null" );
        var ref236 = new ActionReference();
        var id1880 = charIDToTypeID( "HstS" );
        var id1881 = charIDToTypeID( "Ordn" );
        var id1882 = charIDToTypeID( "Nxt " );
        ref236.putEnumerated( id1880, id1881, id1882 );
    desc387.putReference( id1879, ref236 );
executeAction( id1878, desc387, DialogModes.NO );

// =======================================================
var id1883 = charIDToTypeID( "slct" );
    var desc388 = new ActionDescriptor();
    var id1884 = charIDToTypeID( "null" );
        var ref237 = new ActionReference();
        var id1885 = charIDToTypeID( "HstS" );
        var id1886 = charIDToTypeID( "Ordn" );
        var id1887 = charIDToTypeID( "Prvs" );
        ref237.putEnumerated( id1885, id1886, id1887 );
    desc388.putReference( id1884, ref237 );
executeAction( id1883, desc388, DialogModes.NO );

// =======================================================

『シャープネス』や『ぼかし』なんかの定番フィルタはJavaScriptで記述できるメソッドが用意されてますが、『スケッチ』等に含まれるフィルタ類にはどう記述すればいいのか解らない物もあるので、その部分をScriptingListenerプラグインで書き出してスクリプトに組み込めば解決します。


試しに、以前デイリーポータルZでやってたネタっぽいのをJavaScriptでやってみました。画像をちょっと品質の悪いビデオキャプチャ風に加工します。

使用例。(手頃な画像が無かった…文字等はあらかじめ入れときます)


この程度ならわざわざスクリプト書かなくてもアクションで記録すれば良いんですが。これに任意の文字を入力出来て、グラデーションかける部分もJavaScriptで作れば面白いかもしれません。

『.jsx』ファイルとしてテキストを保存し、『ファイル→スクリプト→参照』から読み込むと実行されます。
#target photoshop
var originalUnit = preferences.rulerUnits ;
var docRef = activeDocument;

// 定規の単位をピクセルに
preferences.rulerUnits = Units.PIXELS;

//カラーモードをRGBに
docRef.changeMode(ChangeMode.RGB);

//描画色を黒、背景色を白に
app.foregroundColor.rgb.red = 0;
app.foregroundColor.rgb.green = 0;
app.foregroundColor.rgb.blue = 0;

app.backgroundColor.rgb.red = 255;
app.backgroundColor.rgb.green = 255;
app.backgroundColor.rgb.blue = 255;

//画像サイズを一旦幅1300pxにリサイズ
//(なんとなく経験則)
var wTmp = 1300;
var w = docRef.width;
var h = docRef.height;
//alert(w+","+h);
var eSize = wTmp/w;
//alert(eSize);
docRef.resizeImage(wTmp,h*eSize);

//画像を統合
docRef.flatten();

////レイヤを複製
var layObj = docRef.artLayers;
//layObj[layObj.length-1].opacity = 100;//背景に不透明度を設定するとレイヤに変わる
layObj[layObj.length-1].duplicate();
layObj[0].name = "フィルタ処理レイヤ";
layObj[0].blendMode = BlendMode.LUMINOSITY;

//フィルタ処理
//この部分はScriptingListenerJSで記録した物を使用
// =======================================================
//レイヤ『フィルタ処理レイヤ』をアクティブに
var id150 = charIDToTypeID( "slct" );
    var desc39 = new ActionDescriptor();
    var id151 = charIDToTypeID( "null" );
        var ref30 = new ActionReference();
        var id152 = charIDToTypeID( "Lyr " );
        ref30.putName( id152, "フィルタ処理レイヤ" );
    desc39.putReference( id151, ref30 );
    var id153 = charIDToTypeID( "MkVs" );
    desc39.putBoolean( id153, false );
executeAction( id150, desc39, DialogModes.NO );
// =======================================================
//フィルタ『ハーフトンパターン』を適用
var id154 = charIDToTypeID( "HlfS" );
    var desc40 = new ActionDescriptor();
    var id155 = charIDToTypeID( "GEfk" );
    var id156 = charIDToTypeID( "GEft" );
    var id157 = charIDToTypeID( "HlfS" );
    desc40.putEnumerated( id155, id156, id157 );
    var id158 = charIDToTypeID( "HlSz" );
    desc40.putInteger( id158, 1 );
    var id159 = charIDToTypeID( "Cntr" );
    desc40.putInteger( id159, 0 );
    var id160 = charIDToTypeID( "ScrT" );
    var id161 = charIDToTypeID( "ScrT" );
    var id162 = charIDToTypeID( "ScrL" );
    desc40.putEnumerated( id160, id161, id162 );
executeAction( id154, desc40, DialogModes.NO );
// =======================================================

//画像サイズを幅640pxにリサイズ
docRef.resizeImage(640,activeDocument.height*640/wTmp);
//ぼかし(強)
layObj[0].applyBlurMore () ;
//アンシャープマスクを適用
layObj[0].applyUnSharpMask(300,1.5,0);

// 定規の単位設定を元に戻す
app.preferences.rulerUnits = originalUnit;

Lightbox対応FC2ブログ用アップロードスクリプト

■追記
このエントリのスクリプトは、FC2Blogがリニューアルで仕様変更されたため動作しなくなっています。
リニューアル後のFC2Blogに対応した改良版は、下記のエントリで公開しています。
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScript その4
■追記ここまで


◆FC2ブログ専用◆

ドラッグ&ドロップでFC2ブログのサーバに画像等のファイルをアップロードするAppleScriptその2。
前回のが、あまりにやっつけっぽいので、幾つか機能追加してもうちょっと真面目に書き直しました。

今回のは、アップロードした画像を表示するためのHTMLタグも勝手に生成してクリップボードに納めるようになっているので、それを記事中にペーストすれば管理画面の『ファイルアップロード』を経由することなくエントリを書く事が出来ます。生成するHTMLは、サムネイルを使用して表示する内容になってます。



あと、新たにLightbox JS v2.0に対応しました。(使わない選択も可)
Lightbox導入して画像を表示させる場合、<img>タグ中にtitleとrel属性を手作業で追加しないといけませんが、このスクリプトではそれらも含めたHTMLをクリップボードに納めます。


■使い方
  • <管理画面のURL>と<ユーザ名>の部分を書き換える
  • その下、Lightboxを使う場合は『1』に、使わない場合は『0』のまま
  • スクリプトをアプリケーションとして保存し、アップロードするファイルをドラッグ&ドロップ
  • パスワードを入力
..........でしばらく待つ。

あとは終了のダイアログが出ると、画像表示のHTMLがクリップボードにコピーされているのでそれを記事中にペーストします。
アップロードされたファイルが画像以外の場合、タグは生成されません。


■動作確認
Mac OS X 10.3.9
AppleScript 1.9.3
curl 7.10.2

■Firefoxからコピペする場合、バックスラッシュを円マークに置換する必要があります
property cr : (ASCII character 13)
property msg1 : "FC2ブログ管理画面のパスワードを入力" as Unicode text
property msg2 : "ログインに失敗しました。" as Unicode text
property msg3 : "終了しました。" as Unicode text
property msg4 : "以下のファイルは処理できませんでした。" as Unicode text
property msg5 : "以下のHTMLタグをクリップボードにコピーしました。" as Unicode text
global rel

--FC2ブログ管理画面のURL:"<ブログのURL>/admin.php"を入れる
property myURL : "<管理画面のURL>"

--ユーザ名を入れる
property myID : "<ユーザ名>"

--Lightboxに対応させる場合は 1 にする
property availLB : 0

on open drop
   if availLB is 1 then
      set rel to " rel=\"lightbox[roadtrip]\""
   else
      set rel to ""
   end if
   activate me
   set imageTags to ""
   set tempTag to ""
   set errList to {}
   set myPass to text returned of (display dialog msg1 default answer "")
   
   
   --ログイン処理&cookie取得
   set loginScript to "curl -d \"id=" & myID & "&pass=" & myPass & "&mode=admin\" -c - -L " & myURL & " | tail -n 40"
   set resultLogin to do shell script loginScript
   if resultLogin contains "http://blog.fc2.com/?mode=reminder" then --ログイン失敗なら
      beep
      display dialog msg2 with icon 2 buttons "OK" default button 1
      error number -128
   end if
   set myCookie to last word of (paragraph -2 of resultLogin)
   
   --最初のファイルがアップロード失敗した場合にチェックする為、現状を取得しておく
   set tempTag to my get_ImageTags(do shell script "curl -b \"cr=" & myCookie & "\" -F mode=upload -L " & myURL & " | tail -n 140 | head -n 20")
   
   
   --メインループ
   repeat with theFile in drop
      tell application "Finder"
         set fPath to POSIX path of theFile as Unicode text
         set fName to name of theFile
      end tell
      
      --アップロード処理
      try
         set uploadScript to "curl -b \"cr=" & myCookie & "\" -F upfile=@" & quoted form of fPath & " -F mode=upload -F upload[sumb]=checked  -L " & myURL & " | tail -n 140 | head -n 20"
         set returnHTML to (do shell script uploadScript)
         
         --タグ取得ルーチンへ
         set newTag to my get_ImageTags(returnHTML)
         
         --アップロード成功かチェック(アップロードページのHTMLで判断)
         if newTag is not tempTag then
            set imageTags to imageTags & newTag
            set tempTag to newTag
         end if
      on error
         set errList to errList & fName
      end try
   end repeat
   
   
   --終了処理
   activate me
   if errList is not {} then
      beep
      set myResult to ""
      repeat with aElement in errList
         set myResult to myResult & aElement & cr
      end repeat
      display dialog msg4 & cr & cr & myResult with icon 2 buttons "OK" default button 1
   end if
   beep
   if imageTags is "" then
      display dialog msg3 buttons "OK" default button 1
   else
      display dialog msg3 & cr & cr & msg5 & cr & cr & imageTags buttons "OK" default button 1
      set the clipboard to imageTags
   end if
end open


--返ってきたHTMLより画像URLを抽出しタグを生成
on get_ImageTags(returnHTML)
   set newTag to ""
   set countLines to count of paragraph of returnHTML
   repeat with rNum from 1 to countLines
      set theLine to paragraph rNum of returnHTML as string
      if theLine contains "title" then
         
         --元画像のURLを取得
         set extImgScript to "echo " & quoted form of theLine & " | sed s'/.*<a href=\"//' | sed s'/\".*//'"
         set imageURL to (do shell script extImgScript)
         
         --サムネイルのURLを取得
         set extThumbScript to "echo " & quoted form of theLine & " | sed s'/.*<img src=\"//' | sed s'/\".*//'"
         set thumbURL to (do shell script extThumbScript)
         exit repeat
      end if
   end repeat
   
   --画像表示用HTMLタグ生成
   if theLine contains "<img src=" then
      set newTag to "<a href=\"" & imageURL & "\" title=\"\"" & rel & "><img src=\"" & thumbURL & "\" alt=\"\" border=\"0\"></a>" & cr & cr
   end if
   return newTag
end get_ImageTags

そんなワケで今んとこ10.3.9がベター

Tags : [MacOSX]
CLさんにブクマされてるし…恐!!

ファイル共有でDDP一掃したいのは山々で、ていうかスキャナにくっ付いてる古いMac以外はOS9以降なんで問題ないんですが、自分はスキャナオペもやってるんで、スキャンした画像を自分のMacに引っぱるのにいちいち中継するのもかったるいしな~って事なんですよね。
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。