هل تريد الوصول إلى بيانات تعريف Greasemonkey من داخل البرنامج النصي الخاص بك؟
-
01-07-2019 - |
سؤال
هل هناك أي طريقة يمكن للبرنامج النصي الخاص بي من خلالها استرداد قيم البيانات التعريفية المعلنة في رأسه الخاص؟لا أرى أي شيء واعد في واجهة برمجة التطبيقات (API)، إلا ربما GM_getValue()
.سيتضمن ذلك بالطبع صيغة اسم خاصة.لقد حاولت على سبيل المثال: GM_getValue("@name")
.
الدافع هنا هو تجنب المواصفات الزائدة عن الحاجة.
إذا لم يكن من الممكن الوصول إلى البيانات التعريفية لـ GM بشكل مباشر، فربما تكون هناك طريقة لقراءة نص البرنامج النصي نفسه.من المؤكد أنها موجودة في الذاكرة في مكان ما، ولن يكون من الصعب تحليلها "// @"
.(قد يكون ذلك ضروريًا في حالتي بأي شكل من الأشكال، نظرًا لأن القيمة التي أهتم بها حقًا هي @version
, ، وهي قيمة موسعة تمت قراءتها بواسطة userscripts.org.)
المحلول
هذه الإجابة قديمة: اعتبارًا من Greasemonkey 0.9.16 (فبراير 2012) يرجى الاطلاع إجابة بروك متعلق GM_info
نعم.مثال بسيط جدا هو:
var metadata=<>
// ==UserScript==
// @name Reading metadata
// @namespace http://www.afunamatata.com/greasemonkey/
// @description Read in metadata from the header
// @version 0.9
// @include https://stackoverflow.com/questions/104568/accessing-greasemonkey-metadata-from-within-your-script
// ==/UserScript==
</>.toString();
GM_log(metadata);
يرى هذا الموضوع على مجموعة مستخدمي Greemonkey للمزيد من المعلومات.يمكن العثور على تنفيذ أكثر قوة بالقرب من النهاية.
نصائح أخرى
يستخدم ال GM_info
هدف, ، والذي تمت إضافته إلى Greasemonkey في الإصدار 0.9.16.
على سبيل المثال، إذا قمت بتشغيل هذا البرنامج النصي:
// ==UserScript==
// @name _GM_info demo
// @namespace Stack Overflow
// @description Tell me more about me, me, ME!
// @include http://stackoverflow.com/questions/*
// @version 8.8
// ==/UserScript==
unsafeWindow.console.clear ();
unsafeWindow.console.log (GM_info);
سيتم إخراج هذا الكائن:
{
version: (new String("0.9.18")),
scriptWillUpdate: false,
script: {
description: "Tell me more about me, me, ME!",
excludes: [],
includes: ["http://stackoverflow.com/questions/*"],
matches: [],
name: "_GM_info demo",
namespace: "Stack Overflow",
'run-at': "document-end",
unwrap: false,
version: "8.8"
},
scriptMetaStr: "// @name _GM_info demo\r\n// @namespace Stack Overflow\r\n// @description Tell me more about me, me, ME!\r\n// @include http://stackoverflow.com/questions/*\r\n// @version 8.8\r\n"
}
بناءً على إجابة أثينا، هذا هو الحل المعمم الذي ينتج عنه كائن من أزواج الاسم/القيمة، يمثل كل منها خاصية بيانات التعريف.لاحظ أن بعض الخصائص يمكن أن تحتوي على قيم متعددة، (@include، @exclude، @require، @resource)، وبالتالي فإن المحلل اللغوي الخاص بي يلتقط تلك القيم كمصفوفات - أو في حالة @resource، ككائن ثانوي لأزواج الاسم/القيمة.
var scriptMetadata = parseMetadata(.toString()); function parseMetadata(headerBlock) { // split up the lines, omitting those not containing "// @" function isAGmParm(element) { return /\/\/ @/.test(element); } var lines = headerBlock.split(/[\r\n]+/).filter(isAGmParm); // initialize the result object with empty arrays for the enumerated properties var metadata = { include: [], exclude: [], require: [], resource: {} }; for each (var line in lines) { [line, name, value] = line.match(/\/\/ @(\S+)\s*(.*)/); if (metadata[name] instanceof Array) metadata[name].push(value); else if (metadata[name] instanceof Object) { [rName, rValue] = value.split(/\s+/); // each resource is named metadata[name][rName] = rValue; } else metadata[name] = value; } return metadata; } // example usage GM_log("version: " + scriptMetadata["version"]); GM_log("res1: " + scriptMetadata["resource"]["res1"]);
هذا يعمل بشكل جيد في البرامج النصية الخاصة بي.
يحرر:تمت إضافة @resource و@require، اللذين تم تقديمهما في Greasemonkey 0.8.0.
يحرر:التوافق مع FF5+، لم يعد Array.filter() يقبل التعبير العادي