Archive for the 'TeamViewer' Category

2015/02/23 GUI ScriptingでTeam Viewer10の画面上の情報を取得する

TeamViewer経由で遠隔地のMacを動かすために作ったAppleScriptです。PC/Mac/タブレット上で動作するリモート操作アプリケーション「TeamViewer」の画面上のIDとパスワードを取得します。

tv1.png

危ない用途のために作ったものではなく、自分で管理しているMacの遠隔操作のために作成したものです。

離れた場所にあるMacを遠隔操作する際には、OS X標準搭載のMessage.app(旧称:iChat)経由で画面共有を行うことが多いですが、うまくつながらないケースもあります。そうしたケースではTeamViewerを使うことがままあります。

ただ、TeamViewerは遠隔接続のためのIDとPasswordが(起動するたびに)変更になり、お客様にIDとPasswordを教えていただく必要が(汗)。なので、このやりとりをAppleScriptで自動化してしまおう、という話です(以前からやっていました。セキュリティが強化されたYosemiteで効くかどうか実験中)。

tv2.png

Message.appごしに自動応答でAppleScriptを実行させ、TeamViewerを起動してGUI Scriptingを用いてTeamViewerのIDとPasswordを取得。さらにこれをMessage.app経由でテキストチャットで返させる・・・という処理のための部品です。

IDとパスワードの検出のために、ルールにもとづく文字列検出ルーチンを使っています。このあたり、逆にASOCを使ったほうが短く書けそうな気がとてもしています、、、

調べてみたら、YosemiteのMessage.appにバグがあって、AppleScriptによる自動応答ができないことが判明しました(ーー;; バグレポートしておきましたが、Appleは純粋に「数」でバグ対処の優先順位を決めるので、多くの方々のAppleへのバグレポートをお願いしたいです。

mes1.png

mes2.png

AppleScript名:GUI ScirptingでTeam Viewer10の画面上の情報を取得する
activate application “TeamViewer”
delay 1
tell application “Sy stem Events”
  tell process “TeamViewer”
    tell group 2 of group 1 of window 1
      set tList to value of every static text
    end tell
  end tell
end tell

set ruleList to {“999 999 999″, “9999″} –ID, Pass Pattern
set hitList to {}
repeat with i in ruleList
  set j to contents of i
  
  
repeat with ii in tList
    set jj to contents of ii
    
set aRes to chkCode(jj, j) of me
    
set bRes to chkAllTrue(aRes) of me
    
if bRes = true then
      set the end of hitList to jj
      
exit repeat
    end if
  end repeat
end repeat

hitList
–> {”123 456 789″, “1234″}

–超簡易マクロ展開つきのコードチェック
–[99999]の展開を実装(1箇所のみ)。[99999]の場合には、0〜99999の可変桁チェックを実施
on chkCode(aCode, ruleCode)
  set macroPos1 to offset of “[” in ruleCode
  
set macroPos2 to offset of “]” in ruleCode
  
set ruleLen to length of ruleCode
  
  
if {macroPos1, macroPos2} = {0, 0} then
    set aRes to chkCodeSub(aCode, ruleCode) of me
    
  else if (macroPos1 * macroPos2) is not equal to 0 and (macroPos1 < macroPos2) then
    if macroPos1 > 1 then
      –1文字目以外の場合
      
set baseRule1 to text 1 thru (macroPos1 - 1) of ruleCode
    else
      –1文字目に存在する場合
      
set baseRule1 to “”
    end if
    
    
if macroPos2 is not equal to ruleLen then
      –末尾以外の場合
      
set baseRule2 to text (macroPos2 + 1) thru -1 of ruleCode
    else
      –末尾に存在した場合
      
set baseRule2 to “”
    end if
    
    
set paramLen to macroPos2 - macroPos1 - 1
    
set tmpStr to “9″
    
set hitF to false
    
    
repeat with i from 1 to paramLen
      set tmpRule to baseRule1 & tmpStr & baseRule2
      
set aRes to chkCodeSub(aCode, tmpRule) of me
      
if aRes is not equal to false then
        set hitF to true
        
exit repeat
      end if
      
set tmpStr to tmpStr & “9″
    end repeat
    
    
if hitF = false then return false
    
    
return aRes
    
  end if
end chkCode

–コードのチェックを行う(処理本体)
on chkCodeSub(aCode, ruleCode)
  
  
–set ruleCode to “9999Z99″ –コードのルールを記述しておく–> コードのルール自体も外部から供給するようにしてみた
  
set ruleList to characters of ruleCode
  
  
–コード長のチェック
  
set rLen to length of ruleList
  
set aLen to length of aCode
  
if aLen is not equal to rLen then return false
  
  
–与えられたコードをリストに分解
  
set aList to characters of aCode
  
  
set resList to {}
  
  
repeat with i from 1 to rLen
    
    
set j1 to contents of item i of ruleList
    
set j2 to contents of item i of aList
    
    
set {fromID, toID} to getCharRange(j1) of me
    
set aCharCode to ASCII number of j2
    
    
if (aCharCode fromID) and (aCharCode toID) then
      –ルールに合っている場合には何もしない
      
set the end of resList to true
    else
      set the end of resList to false
    end if
    
  end repeat
  
  
return resList
  
end chkCodeSub

–文字レンジを返す
on getCharRange(a)
  set aCode to ASCII number of a
  
  
if aCode 48 and aCode 57 then
    return {48, aCode} –数字(0〜指定数字まで)
  else if aCode 65 and aCode 90 then
    return {65, aCode} –アルファベット(大文字 A〜指定文字まで)
  else if aCode 97 and aCode 122 then
    return {97, aCode} –アルファベット(大文字 a〜指定文字まで)
  else
    return {aCode, aCode} –その他(ハイフンなどの記号を想定。上記とかぶらない文字)
  end if
end getCharRange

on chkAllTrue(aList as list)
  if false is in aList then return false
  
return true
end chkAllTrue

★Click Here to Open This Script 

2010/06/19 TeamViewerを起動してIDとパスワードを取得する

リモート操作アプリケーション「TeamViewer」を起動してIDとパスワードを取得するAppleScriptです。パラメータとして、相手側マシン上でTeamViewerが起動してID等を取得するのを待つ時間を秒で指定します。

tv1.jpg

リモート操作アプリケーション「TeamViewer」は、iChatでリモート操作できないようなネットワーク環境のマシンでもリモート操作できるなど、かなり「つぶし」の効くソフトです。

たいへん便利なのですが、相手側のマシン上でTeamViewerを起動し、IDとパスワードをメールや電話などで教えてもらう必要があります。この点がけっこう面倒で……それをiChat経由で本Scriptを相手マシンに送り付けてIDとパスワードを調査できれば、それを元にTeamViewerですぐにリモート接続可能になります。

iChatの文字チャット経由で本Scriptを送り付けて実行させれば、相手側マシンではTeamViewerが起動し、そのIDとパスワードをiChat経由で受信することができ、リモートメンテナンスを効率的に行えることでしょう。

スクリプト名:TeamViewerを起動してIDとパスワードを取得する
set aRec to getTeamViewerInfo(30) of me
–> {idInfo:”594 395 137″, passInfo:”9568″}

–TeamViewerを起動して、IDとパスワードを取得する
–ただし、GUI Scriptingをイネーブルにしておくことが必要
on getTeamViewerInfo(waitSeconds)
  repeat waitSeconds times
    activate application “TeamViewer”
    
tell application “System Events”
      tell process “TeamViewer”
        tell window “TeamViewer”
          set idText to value of (static text 1 of group 1)
          
set passText to value of (static text 2 of group 1)
        end tell
      end tell
    end tell
    
    
–両方取得できたらループから抜ける
    
if (idText is not equal to “”) and (passText is not equal to “”) then
      exit repeat
    end if
    
    
delay 1
  end repeat
  
  
return {idInfo:idText, passInfo:passText}
end getTeamViewerInfo

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に