休日に思いつきで苦労した。作ってからもっとマシな方法を思いついたのでもう使ってないが、いつか役に立つかもしれないのでメモ
今回の思いつき
VivaldiにTooter
という拡張を入れている。これはWeb版Twitterの投稿ページにマストドンへのクロスポストボタンを追加するアドオンだ。これを使って面倒なウェブサービスを使わずにクロスポストを簡単にしてやろうと考えた。そこで思いついたのが AppleScript。これを使って
- 実行したらシステムの入力窓が出現
- 窓にポスト内容を入力
- ブラウザで投稿画面を呼び出し
- 投稿 -> クロスポスト成功!
をやってやろうということだ。ちなみに作ってからもっとマシな方法を思いついたのでもう使ってない。
AppleScriptは使わない
開幕から手のひらを返すが、AppleScriptは使わない。なんでもMacOS Elcapitanから、AppleScriptが要求されていた場面でJavaScriptが使えるようになったらしいので、それで行く。
参考 : 知らないうちにMacがシステム標準でJavaScriptで操作できるようになってた (JXA)
https://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87
完成品
ちなみに、VivaldiはChrome派生なのでアプリケーション名を差し替えればChromeでも使える。
//変数にアプリケーションIDをセット
vivaldi = Application('Vivaldi');
//標準コマンドを使用可能にする
vivaldi.includeStandardAdditions = true
//新規ウィンドウの作成と同時に関数winにウィンドウIDをセット
win = vivaldi.Window().make();
//ウィンドウが開くまで3s待つ
delay(3);
//アクティブなタブを取得
tab = win.activeTab();
//boundにウィンドウ情報を代入
var bound = win.bounds();
//ウィンドウの大きさを書き換え
bound.width = 840;
bound.height = 525;
bound.x = 0;
bound.y =0;
//ウィンドウ情報を書き戻して変更
win.bounds = bound;
//DisplayDialogで入力(投稿内容)を取る
var tweet = vivaldi.displayDialog("What you doing?", {
defaultAnswer: "",
withIcon: "note",
buttons: ["Cancel", "Continue"],
defaultButton: "Continue"
})
//urlに含められない文字を置換
//encodeURL()は使えなかった。必要なら置換を増やす。
tweet.textReturned = tweet.textReturned.replace(/\r?\n/g, '%0a');
tweet.textReturned = tweet.textReturned.replace(/&/g, '%26');
//投稿ページを開く
tab.url = "http://twitter.com/home?status=" + tweet.textReturned;
//開いたページが読み込み終わるまで待つ
while(tab.loading()){
}
//送信確認ダイアログを出す
var dialogText = "以下の内容で送信していいですか?\n" + tweet.textReturned;
var dig = vivaldi.displayDialog(dialogText,{
buttons: ["No", "Yes"],
defaultButton: "Yes",
cancelButton: "No"
});
//前の確認でYesが選ばれたら
if(dig.buttonReturned == "Yes"){
//送信ボタンの要素を取得してクリックする
vivaldi.execute(tab, {javascript:"var tmp = document.getElementsByClassName('tweettoot');console.log(tmp);tmp[0].click();"});
}
//邪魔なのでウィンドウサイズを小さくする
bound = win.bounds();
bound.width = 10;
bound.height = 10;
bound.x = 0;
bound.y =0;
win.bounds = bound;
//送信の処理が終わるのを待つ
while(tab.loading()){
}
//ウィンドウを閉じる
win.close();