先日、長男としまじろうコンサートに行って、二人で後半は昼寝気味なっていた@kjunichiです。
大まかな流れ
iOSやOSXのSafariのリーディングリストはBookmarks.plistに格納されている。 この中から未読のURLをリスト化してphantomjsでスクリーンショットをpdfとして保存。 このpdfを添付メールとして@kindle宛に送れば、手元のkindle Fire HDで未読の URLを読むことができる。
MacのSafariのBookmarks.plistから未読のリーディングリストを取得
バイナリ形式からアスキー形式に変換しておく
plutil -convert xml1 -o url.plist ~/Library/Safari/Bookmarks.plist
node-plistを使ってURLリストを作成
node-plistのインストール
npm install plist
URLリストを取得する
// リーディングリストから未読のURLを取得する var plist = require('plist'); var obj = plist.parseFileSync('url.plist'); //console.log(JSON.stringify(obj)); //lista = data['Children'] //rl=lista[lista.size-1]['Children'] //(0..598).each{|i| // puts rl[i]['URIDictionary']['title'] + " " + rl[i]['URLString'] //} var lista = obj.Children; var rl = lista[lista.length-1].Children; for(var i =0;i<rl.length;i++){ if(!rl[i].ReadingList.DateLastViewed) { console.log(/*rl[i].URIDictionary.title + " " + */rl[i].URLString); } else { //console.log("DL="+rl[i].ReadingList.DateLastViewed); } }
動かし方
node geturls.js >urls.txt
phantomjsでスクリーンキャプチャをpdfに保存
phantomjs用のスクリプト
var webpage = require('webpage'); var fs = require('fs'); // read urls from file //var urlList = fs.read("urls.txt"); if (phantom.args.length <= 0) { console.log('Usage: phantomjs rasterizes.js [FILE]'); phantom.exit(1); } // HTMLコンテンツを読み込む // コマンドライン起動前提なので同期I/Oで //console.log(phantom.args[0]); var urlList = fs.read(phantom.args[0], 'utf8'); //console.log(urlList); var urlArray = urlList.split("\n"); //console.log(urlArray); var Pile = function() { this.pile = []; this.concurrency = 0; this.done = null; this.max_concurrency = 10; }; Pile.prototype = { add: function (callback) { this.pile.push(callback); }, run: function (done,max_concurrency) { this.done = done || this.done; this.max_concurrency = max_concurrency||this.max_concurrency; var target = this.pile.length; var that = this; var next = function() { that.concurrency--; target--; if(target === 0){ that.done(); } else { that.run(); } }; while(this.concurrency<this.max_concurrency && this.pile.length > 0) { this.concurrency++; var callback = this.pile.shift(); callback(next); } } }; var pilex = new Pile(); for(var i = 100; i < urlArray.length; i++) { pilex.add(make_handler(i)); } pilex.run(function () { console.log("fetch done."); finish(); },1); function finish() { phantom.exit(); } function make_handler(num) { return function (next) { console.log("fetching : "+urlArray[num]); var page = webpage.create(); page.viewportSize = {width:960}; page.paperSize = {format:"A4",orientation:"portrait",margin:"1cm"}; page.open(urlArray[num], function (status) { if (status !== 'success') { console.log('Unable to load the address! : '+urlArray[num]); next(); } else { window.setTimeout(function () { page.render(num+".pdf"); console.log("done : "+num); next(); },200); } }); } }
動かし方
phantomjs rasterizes.js urls.txt
pdfを@kindle.comに送る
Nodemailerを使うと超簡単
SMTPサーバはGMailのものを利用するので、25番ポートにtelnetするように簡単には行かないが、 このモジュールだとそこら辺もうまいことやってくれて、簡単にメールを送る事が出来る。
npm install nodemailer
var nodemailer = require('nodemailer'); var smtpTransport = nodemailer.createTransport("SMTP",{ service:"Gmail", auth:{ user:"@gmail.com", // GMailのアドレス pass:"" // GMailのパスワード } }); fileName = process.argv[2]; var mailOptions={ from:"@gmail.com", to:"@kindle.com", subject:"test", text:"test", attachments:[ { filename:fileName, filePath:fileName } ] }; smtpTransport.sendMail(mailOptions,function(error,response){ if(error){ console.log(error); }else { console.log("OK "+ response.message); } smtpTransport.close(); });
関連記事
- SafariをAppleScriptで操る〜 外貨預金編 その1 〜
- #trouble SafariでWebGLを有効にしてテクスチャ貼ると死ぬ件
- SafariのリーディングリストをFirefoxなどで読む
- Safariだとオレオレ証明書でWebSocketが使えない!?