tetsunosukeのnotebook

tetsunosukeのメモです

Greasemonkey で Authorization ヘッダーを送信できなかった(特定の条件下?)

調査をかねて、こんな感じのぐりもん書いていました。

// ==UserScript==
// @name           gcaladd
// @namespace      http://d.hatena.ne.jp/kidd-number5
// @include        *
// ==/UserScript==
(function() {
    // init
    var authToken;
    var authHeader;
    var w = unsafeWindow;
    var _onload = w.onload;
    document.addEventListener( 'keypress', kbEventListener, false );
    

    // 対象画面読み込み後の挙動
    w.onload = function() {
        console.info("loaded");
    };
    
    // start
    authToken = GM_getValue("authtoken");
    if (typeof authToken == "undefined") {
        console.log("undef");
        window.setTimeout(function() {
            GM_xmlhttpRequest({
                method: 'POST',
                url: 'https://www.google.com/accounts/ClientLogin',
                data: 'Email=' + encodeURIComponent('xxxxxxxxxxxx') +
                      '&Passwd=' + encodeURIComponent('yyyyyyyyyy') + 
                      '&source=' + encodeURIComponent('GM-GcalClient2') + 
                      '&service=' + encodeURIComponent('cl'),
                headers: {
                    'Content-type' : 'application/x-www-form-urlencoded',
                },
                onload: loginHandler,
                onerror: onerrorHandler,
                onreadystatechange: onreadystatechangeHandler,
            });
        }, 0);
    }
        


    function loginHandler(detail) {
        console.info("onloadhandler");
        var val = detail.responseText.split("Auth=");
        var auth = val[1];
        authToken = val[1];   
        GM_setValue("authtoken", authToken);     
    };
    function add(authToken) {
        console.info("calendarCall:" + authToken);
        window.setTimeout(function() {
            authHeader = 'GoogleLogin auth=' + authToken; // ほんとならここを使いたい
            GM_xmlhttpRequest({
                method: 'post',
                url: 'http://www.google.com/calendar/feeds/default/private/full',
                data: '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gCal="http://schemas.google.com/gCal/2005"><content type="html">Tennis with John June 15 3pm-4:30pm</content><gCal:quickadd value="true"/></entry>',
                headers: {
                    'Authorization' : 'GoogleLogin auth=xxxxxxxxxxxxxxxx', // べたで書かないで、変数を使いたい。 要は、 'Authorization' : authHeader と書きたい。
                    'Content-type' : 'application/atom+xml',
                },
                onload: calendarHandler,
                onerror: onerrorHandler,
                onreadystatechange: onreadystatechangeHandler,
                
            });
        }, 0);    
    };
    
    function kbEventListener(event) {
        console.log("kbEventListener");
        console.log(event.shiftKey + " " + event.charCode);
        // shift + C
        if(event.shiftKey && event.charCode == 67){
            add(authToken);
        }
    };
    function onreadystatechangeHandler(detail) {
        console.debug(detail);
    };
    function calendarHandler(detail) {
        console.info(detail);
    };
    function onerrorHandler(detail) {
        console.error("error: " + detail.responseText);
    };
})();

なぜか、onreadystatechange で見ていてもステータスが1のままで、ヘッダーを送るときに失敗している。(Live HTTP Header で見ていても何も送られない)これはいったいなんでしょうね・・・。

ちなみに何がしたいかというと、あるページでイベントを見つけたときに選択した文字列を Google Calendar に放り込みたいんですけどね。Token ってたぶん固定じゃなくて、時間とかで変わると思うので、このままではうまくできない...(GM_getでやってもそもそも変数としてわたらないからダメ。)

文字列が長すぎるとだめ、とか、そういうのありますかね。改行文字とかが入ってるとかあんのかな。

あ。やっぱり文字列の長さが違った。末尾に改行とか入ってるみたい。それ除去したら通った