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でやってもそもそも変数としてわたらないからダメ。)
文字列が長すぎるとだめ、とか、そういうのありますかね。改行文字とかが入ってるとかあんのかな。
あ。やっぱり文字列の長さが違った。末尾に改行とか入ってるみたい。それ除去したら通った