Hit-a-HintでTumblrに画像を投稿する拡張

↑ArcCosine さんに作れと言われてる気がしたので作った。試験的。使用はあまりおすすめしない。

パスワードを直接書くよりは安全だが、悪意のあるサイトに任意の画像を投稿されてしまうなどの脆弱性 (?) はある。この方法では仕方ないかも。まあ個人的にはこんな野良スクリプトを狙う攻撃なんてありあえないと思う。

使い方。

  1. 下の UserJS をインストール。
  2. 前に作った HaH ブックマークレット2.0ではヒント要素に色を付けるのがうまくいっていないバグがあったので、最新版を入れる。
  3. 普通に HaH を実行すると、画像にこういうヒントが付くようになる。
  4. 選択したら「t」を押すと、ページの左下に赤いが出るのでそれの色が変わったら投稿に成功してるはず。

Opera のみで動作確認。
一応複数投稿にも対応してるはず。試してない。試したら変な感じになった。
あまりちゃんと作り込んでないので、バグが多数あるかもしれない。
例えば、左下に出る四角は自動で消えたりしなくて、ずっと残ってしまう。
ArcCosine さんがあとで使い易くしてくれるはず。期待大!

動作原理は下あたりを参考に。

// ==UserScript==
// @name            HaH-gazo-tumblr
// @description     Hit-a-Hint extention to enable posting gazo to tumblr
// @namespace       http://d.hatena.ne.jp/edvakf/
// @include         http://*
// ==/UserScript==

(function(){
if(location.href == 'http://www.tumblr.com/new/photo?from=HaH'){
  opera.addEventListener('BeforeScript',function(e){e.preventDefault()},false);
  document.addEventListener('DOMContentLoaded',function(){
    var css = document.createElement('style');
    css.type = 'text/css';
    css.innerHTML = '*{margin:0;padding:0;overflow:hidden;}';
    document.getElementsByTagName('head')[0].appendChild(css);
    var box = document.createElement('div');
    box.style = 'margin:0;padding:0;border:none;height:12px;width:12px;background-color:red;position:fixed;left:0;top:0;';
    document.body.appendChild(box);
  },false);
  document.addEventListener('message',function(e){
    var data = e.data.split(':key=');
    for(i=0;i<data.length;i++){
      var kv = data[i].match(/^(.*?):value=(.*)$/);
      if(kv && kv.length>1){
        document.getElementById(kv[1]).value=kv[2];
      }
    }
    document.getElementById('edit_post').submit();
  },false);
}else{

  if(!window.HitaHint) window.HitaHint = {};
  if(!window.HitaHint.types) window.HitaHint.types = [];
  HitaHint.types.push({
    xpath :
      '//img|//xhtml:img',
    accessor :
      function(element){
        return (element.tagName.toLowerCase() == 'img' && !element.onclick);
      },
    type :
      'HaHtumblr',
    color :
      '#ABF'
  });

  if(!window.HitaHint) window.HitaHint = {};
  if(!window.HitaHint.keys) window.HitaHint.keys = [];
  HitaHint.keys.push({
    func : 
      function(modified,chosenHints){
        if (modified) return;
        chosenHints.forEach(function(hint){
          ele = hint.element;
          var obj = document.createElement('object');
          obj.class = 'HaH-tumblr';
          obj.setAttribute('style', 'margin:0;padding:0;border:none;height:12px;width:12px;left:3px;bottom:3px;position:fixed;');
          setTimeout(function(){
            obj.addEventListener('load',function(){
              obj.contentWindow.postMessage([
                ':key=photo_src:value='+ele.src,
                ':key=post_three:value='+location.href,
                ':key=post_two:value='+'<a href='+location.href+'>'+document.title+'</a>'
              ].join(''),'*');
            },false);
            obj.data = 'http://www.tumblr.com/new/photo?from=HaH';
          },0);
          document.body.appendChild(obj);
        });
      },
    keyName : 't'
  });
};
})();