2

次のグリースモンキー スクリプトを作成して、Steam の年齢チェック ページを自動的にスキップできるようにしました。

// ==UserScript==
// ...
// @include     http://store.steampowered.com/agecheck/*
// ==/UserScript==

//Mini script for doing steam age checks automatically
if( document.URL.indexOf('agecheck') > -1 )
{
    var form = document.getElementById('agegate_box').getElementsByTagName('form')[0];
    form.ageDay.value = 18;
    form.ageMonth.value = 'August';
    form.ageYear.value = 1987;
    form.submit();
}

このようなページの例: http://store.steampowered.com/agecheck/app/16730/ . store.steampowered.com「生年月日」Cookie が設定されている場合、このページは自動的にゲームにスキップすることに注意してください。そのため、最初に削除する必要がある場合があります。

Windows XP で動作する Firefox 17.0 (ベータ) にこのグリースモンキー スクリプトをインストールすると、正常に動作します。

次に、最新の FF (16) を実行している Windows 7 マシンにスクリプトをインストールしました。このマシンでは、form.ageDay にアクセスするとスクリプトが壊れます。エラー コンソールには次のように表示されます。

Error: form.ageDay is undefined

さらに奇妙なことに、単にスクリプトを Firefox Scratchpad (Shift+F4) に貼り付けて実行すると、検索が機能し、フォームが送信されます。

XP では GM スクリプトが機能し、Win7 ではスクリプトがスクラッチパッドで機能するのに、Win7 ではスクリプトが GM で機能しないというのはどうしてでしょうか?

さらに別の奇妙な点は、Win7 マシンで Firebug をアクティブにすると、var form明らかに「ageDay」プロパティがあるのに、ウォッチ式が undefined を返すことです。

ここに画像の説明を入力

4

1 に答える 1

1

そのコードは、Windows XP でも Windows 7 でも機能しません。GM スクリプトは (通常) そのような名前付きフォーム オブジェクトを使用できません。Greasemonkey の落とし穴: 名前付きフォームとフォーム要素を参照してください。

これらのフォーム要素を取得するには、サンドボックスで安全な (そしてより強力な) メソッドを使用してください。たとえば、querySelector(). このスクリプトは、リンクしたページで機能します。

// ==UserScript==
// @name        _delme 677
// @include     http://store.steampowered.com/agecheck/*
// @grant       GM_xmlhttpRequest
// ==/UserScript==

//Mini script for doing steam age checks automatically
if (/agecheck/i.test (location.pathname) ) {
    var ageForm = document.querySelector ("#agegate_box form");
    ageForm.querySelector ("[name='ageDay']").value     = 18;
    ageForm.querySelector ("[name='ageMonth']").value   = 'August';
    ageForm.querySelector ("[name='ageYear']").value    = 1987;
    ageForm.submit ();
}

ノート:

  1. Firefox Scratchpad は、GM サンドボックスによって分離されていないため、機能しました。
  2. Win XP で動作するように見える理由については、これはまぐれである可能性が最も高いです。XP では動作しませんし、動作するはずもありません。

    特定の@grant noneシナリオでは、そのようなコードが機能する可能性があります。(@grant none多くの場合、デフォルトで適用されます。ドキュメントを参照してください。)

    または、実行中のスクリプトのバージョンが複数あったか、FF が破損して再起動が必要になった可能性もあります。

    要するに、そのようにコーディングしないでください。

  3. についてはbut the watch expression returns undefined?...それは機能しているサンドボックスの分離にすぎず、XPでも同じように見えます。

  4. 上記の使用のようなコードはquerySelector()、ユーザーが遭遇する可能性のあるほぼすべてのページで機能し、この質問のパラメーター内で確実に機能します。ただし、現在、一部のサイトで使用されていたとされる一部のHTML5 フォームや無効なHTMLでは機能しません。

    どちらの場合も、上記の落とし穴のリンクに記載されているコードは、特定の無効な HTML または最先端の HTML5 によって提案された機能にもかかわらず機能します。

    具体的には、この種のコードは、 ほど柔軟ではありませんquerySelectorが、より幅広いシナリオで機能します (無効な HTML であっても)。

    if (/agecheck/i.test (location.pathname) ) {
        var ageForm = document.querySelector ("#agegate_box form");
        ageForm.elements.namedItem ('ageDay').value     = 18;
        ageForm.elements.namedItem ('ageMonth').value   = 'August';
        ageForm.elements.namedItem ('ageYear').value    = 1987;
        ageForm.submit ();
    }
    
于 2012-10-31T22:30:10.540 に答える