Проверьте, загружен ли мой javascript на сайте

Я задал этот вопрос раньше, но, похоже, меня неправильно поняли, поэтому я решил снова спросить, но на этот раз с большим количеством информации:

Для ленивого читателя моя цель здесь:

Есть ли способ проверить, включен ли javascript на внешнем сайте либо с PHP, либо через Ajax

Подробное описание:

Хорошо, поэтому у моей компании много клиентов, когда эти клиенты регистрируются на нашем сайте, им вручается javascript . Затем они могут использовать этот script на своем собственном веб-сайте, чтобы получить дополнительные функции.

Теперь все веб-сайты, которые есть у клиента, хранятся в нашей системе CMS (например, есть список всех сайтов, которые у них есть, которые подписаны с нами).

Теперь мой босс дал мне следующее задание:

Нам нужна функция, чтобы пользователь мог нажать кнопку «Тест», и система проверит, находится ли javascript на своем сайте и работает без ошибок (т. Е. Есть другой скрипт, блокирующий наш).

Теперь за последние пару дней я пытался найти подобные случаи в web и единственное, что мне было предложено, было Phantomjs, однако нет НИКАКИХ примеров того, как приблизиться к тому, чего я хочу достичь.

Итак, мой вопрос к вам:

  1. можно ли проверить, имеет ли сайт определенный javascript.
  2. можно проверить, работает ли javascript без ошибок (если консоль выдает ошибки или нет)

Я надеюсь, что на этот раз я не пойму неправильно понял. Если у вас есть какие-либо вопросы, просто оставьте сообщение, и я отвечу как можно быстрее!

Решение PhantomJs (первоначально размещенное Elias)

Это мой код:

  var page = require('webpage').create(); page.onConsoleMessage = function( message, line, srcId) {//show console errors for page console.log('Page has errors showing in console: ' + msg + ' (line: ' + (line || '?') + ', id: ' + srcId + ')'); }; page.open('http://www.marcrasmussen.com',function(status) { if (status != 'success') {//can't load page console.log('Failed to open page: ' + status); phantom.exit(); return; } var reslt = page.evaluate(function() { var usesOurScript = false, scripts = document.querySelectorAll('script');//get all script tags Array.forEach.apply(scripts, [function(elem) {//check all loaded scripts if (/jquery\.js/.js.js.test(elem.getAttribute('src'))) {//this src attribute refers your script usesOurScript = true;//set to true } }]); return {page: location.href, found: usesOurScript};//return its href and the use-status }); //script was found? adjust message reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!'; console.log(reslt.page + reslt.found);//logs url does not use || uses our script phantom.exit(); }); 

И нет выхода, он просто продолжает работать вечно, когда я запускаю его из php:

test.php

 <?php echo shell_exec('phantomjs hello.js'); ?> 

Я тоже отправлю его здесь. Поскольку я был тем парнем, который подвел вас к фантомам, справедливо предоставить вам, как я думаю, ответ на ваши проблемы.
Следующий скрипт открывает страницу в браузере безглавых фантомов, регистрирует любые сообщения консоли, которые эта страница будет onConsoleMessage в реальном браузере (используя событие onConsoleMessage ), также регистрирует ошибку, если страница не может быть загружена, и, если страница была открыта без проблем, она проверяет все теги <script> на этой странице, ища ваш файл javascript.

 var page = require('webpage').create(); page.onConsoleMessage = function( message, line, srcId) {//show console errors for page console.log('Page has errors showing in console: ' + msg + ' (line: ' + (line || '?') + ', id: ' + srcId + ')'); }; page.open('http://www.your-url-here.org',function(status) { if (status != 'success') {//can't load page console.log('Failed to open page: ' + status); phantom.exit(); return; } var reslt = page.evaluate(function() { var usesOurScript = false, scripts = document.querySelectorAll('script');//get all script tags /* Array.forEach is causing errors, as it turns out... Array.forEach.apply(scripts, [function(elem) {//check all loaded scripts if (/yourScriptName\.js/.test(elem.getAttribute('src'))) {//this src attribute refers your script usesOurScript = true;//set to true } }]);*/ for (var i=0;i<scripts.length;i++) { if (/yourScriptName\.js/.test(scripts[i].getAttribute('src'))) { return {page: location.href, found: true}; } } return {page: location.href, found: false}; }); //script was found? adjust message reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!'; console.log(reslt.page + reslt.found);//logs url does not use || uses our script phantom.exit(); }); 

Если этот файл делает что-то вроде jQ (создайте глобальную ссылку на какой-либо объект), вы можете даже добавить это в page.evaluate вызов page.evaluate :

  var reslt = page.evaluate(function() {//this code will behave like it's running on the target page var libs = {jQuery: ($ || jQuery), myLib: ourLibsGlobalName}; return libs; }); if (reslt.jQuery instanceof Object) { console.log('client uses jQ'); } if (reslt.myLib instanceof Object) { console.log('client uses our lib, successfuly');//wouldn't be accessible if it contained errors } console.log(reslt.myLib);//shows full object, so you can verify it's the right one 

Заметка:
Этот код не проверен , я просто написал его с головы. Он может содержать глупые опечатки. Это не ответный ответ на все ваши молитвы.
Я действительно верю, что page.evaluate вызов page.evaluate способен что-то вернуть: он запущен в контексте загруженной страницы и изолирован песочницей, поэтому вам может потребоваться принудительная ошибка:

 page.evaluate(function() { Array.forEach(document.querySelectorAll('script'), [function(elem) { if (/yourScript\.js/.test(elem.getAttribute('src'))) { throw {message: 'Script found', nodeSrc: elem.getAttribute('src'), pageUrl: location.href, myLib : yourGlobalVar}//<-- cf remarks on jQ-like usage } }]); }); 

Бросив эту настраиваемую ошибку, которая не будет поймана, так что это закончится на консоли, вы заставите обработчик page.onConsoleMessage справиться с этим исключением. Это может быть способом ограничения песочницы, в некотором смысле, если они вызывают проблему с бесконечным циклом.

Можно ли проверить, имеет ли сайт определенный JavaScript?

Вы могли бы сделать две вещи, где, я думаю, проще всего использовать JavaScript.

Использование PHP:

  • получить контент из URL-адресов в вашей базе данных
  • загрузите его в DOMDocument и найдите определенную часть вашего кода.
  • извлечь все внешние файлы JavaScript из этого документа
    • забрать их и найти определенную часть кода внутри

Использование JavaScript

  • реализовать запрос AJAX в конструкторе или метод initiate
  • отправьте текущий домен, где выполняется скрипт, и сравните его со списком в базе данных

Самообслуживание

  • как обсуждалось при написании этого ответа, это еще одна возможность, так как ваш журнал может отображать все страницы, к которым обращался этот скрипт

Можно ли проверить, работает ли javascript без ошибок?

Это немного сложнее, поскольку вы проверяете это во время выполнения. Представьте, что пользователь вашего скрипта расширяет или изменяет ваш код или просто неправильно использует его или имеет что-то, что конфликтует с вашим кодом. Возможно, этот код никогда не был достигнут, так как он вызывает некоторое взаимодействие с пользователем, которое может быть или не быть вызвано.

Одна из возможностей – отправить запрос AJAX вам, когда произошла ошибка. Вы можете проверить window.onerror для этой цели:

 window.onerror = function(message, url, lineNumber) {} 

Это даст вам подробную информацию, которую вы можете передать на свой сервер с помощью запроса AJAX.

Обходной путь или, скорее, наивный способ – создать определение фиктивного объекта с уникальным именем: «your_company_name _» + some_hash. как abc_45xcd.

 //your custom js file //BEWARE! this is global namespace. function abc_45xcd(){ console.log('abc_45scd custom js is loaded'); } 

Когда вы нажимаете кнопку «Тест», вы можете попробовать создать новый объект

  var x = new abc_45scd(); 

Вы можете проверить конструктор и тип, чтобы проверить, есть ли его собственный собственный настраиваемый фиктивный объект.

Примечание. На самом деле это наивное решение, так как кто-то может создать объект с тем же именем в своем скрипте. Кроме того, он загрязняет глобальное пространство имен без каких-либо причин.