Расширение для Google Chrome — Парсер 1

Автор: | 23 июля, 2021

Техническое задание — ТЗ

Отслеживать изменение цены на сайте. Сигналить, когда цена станет ниже минимальной. Ссылка на пример: https://eu.tamrieltradecentre.com/pc/Trade/SearchResult?SearchType=Sell&ItemID=11807&ItemNamePattern=%D0%AD%D1%82%D0%B5%D1%80%D0%B8%D0%B5%D0%B2%D0%B0%D1%8F+%D0%BF%D1%8B%D0%BB%D1%8C&ItemCategory1ID=&ItemTraitID=&ItemQualityID=&IsChampionPoint=false&LevelMin=&LevelMax=&MasterWritVoucherMin=&MasterWritVoucherMax=&AmountMin=&AmountMax=&PriceMin=&PriceMax=&SortBy=Price&Order=asc

Подготовка

Первое что нам нужно сделать, так это создать папку где собственно и будет находиться всё что касается нашего будущего приложения/аддона/расширения для Google Chrome. В этой же папке создадим парочку подкаталогов js и css. В них будут лежать наши скрипты и описание внешнего вида, соответственно.

Начало

Минимальный состав плагина — manifest.json и main.html. Файл описания и файл запуска/реакции нашего плагина. Ну, может ещё и иконка. Иконки это PNG файлы размером 16*16, 48*48, 128*128.

В нашем случае начало и того меньше — файл манифеста и иконка.

manifest.json

{
	"manifest_version": 2,
	"name": "My Parser",
	"version": "1.0",
	"description": "Парсер хитрого сайта с AJAX и JavaScripts",
    "icons": {
        "128": "128.png"
    },
    "browser_action": {
        "default_title": "Нажмите на иконку HTML5",
        "default_icon" : "128.png"
    }
}
Иконка с именем 128.PNG

Загрузка

Подошли к «серьёзному» шагу — загрузке нашего расширения в Chrome. Справа от адресной строки жмём на многоточие, выбираем «дополнительные инструменты» и наконец видим «Расширения».

После этого нам надо включить «Режим разработчика», потому что у нас будет так называемое «не упакованное» расширение. Данное действие нам позволит загрузить расширение с НАШЕГО компьютера в НАШ браузер.

И таким же образом должна появиться кнопка нашего расширения в панели. Если же её нет, то жмём на значёк отдалённо напоминающий кусок пазла и там подсвечиваем скрепку возле нашего расширения, нажав на неё.

Поздравляю! Ваше первое расширение для браузера готово и оно.. ничего не делает. 🙂

Имейте ввиду, что формат манифеста уже 3. Более подробно можно узнать у самого Google по ссылке ниже:

https://support.google.com/chrome/a/answer/2714278?hl=ru

Немного магии

Добавим немного «магии» в наше расширение. Ну… Чтобы оно хоть что-то делало. В папку js положим файл content.js с данным содержимым:

alert("Hello from your Chrome extension!")

И добавим в manifest.json несколько строк:

"content_scripts": [
  {
    "matches": [
      "<all_urls>"
    ],
    "js": ["content.js"]
  }
]

Получим файл примерно такого содержания:

{
	"manifest_version": 2,
	"name": "My Parser",
	"version": "1.0",
	"description": "Парсер хитрого сайта с AJAX и JavaScripts",
    "icons": {
        "128": "128.png"
    },
    "browser_action": {
        "default_title": "Нажмите на иконку HTML5",
        "default_icon" : "128.png"
    },
	"content_scripts": [
		{
		"matches": [
			"<all_urls>"
		],
		"js": ["js/content.js"]
		}
	]
}

И если мы перезагрузим наше расширение в браузере, то получим новый функционал, наш скрипт content.js будет добавлен на каждую новую страницу или когда она будет обновлена. И… будем наблюдать всплывающее сообщение данного вида:

Это конечно замечательно, но.. есть небольшая проблема. Страница которую мы собираемся парсить использует AJAX запросы и кучу скриптов. А потому, нам надо чтобы наше расширение начало работать через ХХ секунд. В связи с этим немного исправим наше content.js

var foo = function(){
	alert("Прошло 5 секунд...");
};
var timeout = setInterval(foo, 5000); // в 1 секунде 1000 миллисекунд
// setTimeout(expression, timeout); запускает код/функцию один раз после тайм-аута.
// setInterval(expression, timeout); запускает код/функцию с интервалами, с длиной тайм-аута между ними.
// clearInterval(timeout); останавливает выполнение по интервалу

После обновления расширения, сообщение будет выскакивать каждые 5 секунд. Что собственно нам и нужно. Уж за 5 секунд страница точно загрузится. Хотя… 5 секундный интервал весьма достаёт. Поэтому добавим туда нолик и получим 50 секунд.

А ещё… Нам не нужно чтобы это работало на любом сайте (пока не нужно) и потому заменим «<all_urls>» в манифесте на маску нашего подопытного сайта «https://eu.tamrieltradecentre.com/*». Вот таким не хитрым образом (и конечно после обновления плагина в браузере) добиваемся того, что он будет работать только на страницах указанного сайта. В чём собственно, мы незамедлительно и убеждаемся, открыв разные страницы и нужный сайт.

Можно сказать что на данном этапе мы немножко разобрались со скриптами контента (содержимого) — content.js. А чтобы работать с кнопкой на панели, тут уже нам нужен фоновый процесс и за него отвечает: background.js.

Так что добавим блок в manifest.json:

"background": {
  "scripts": ["js/background.js"]
}

И собственно сам файл background.js

// background.js // Вызывается, когда пользователь нажимает на действие браузера.
chrome.browserAction.onClicked.addListener(function(tab) {
  // Отправить сообщение на активную вкладку
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    var activeTab = tabs[0];
    chrome.tabs.sendMessage(activeTab.id, {"message": "clicked_browser_action"});
  });
});

Стоит обратить внимание на addListener — это значит что код помещён в слушателя события и будет исполняться только когда произойдёт данное событие. onClicked — когда произойдёт клик по значку.

И ещё, для наглядности, немножко изменим manifest.json, чтобы он приобрёл следующий вид:

{
	"manifest_version": 2,
	"name": "My Parser",
	"version": "1.0",
	"description": "Парсер хитрого сайта с AJAX и JavaScripts",
	"background": {
	  "scripts": ["js/background.js"]
	},
	"icons": {
        "128": "128.png"
    },
    "browser_action": {
        "default_title": "Нажмите на иконку",
        "default_icon" : "128.png",
	"default_popup": "popup.html"
    },
	"permissions": ["activeTab"],
	"content_scripts": [
		{
		"matches": [
			"https://eu.tamrieltradecentre.com/*"
		],
		"js": ["js/content.js"]
		}
	]
}

И соответственно добавим файл popup.html

<h1>hello world</h1>

В результате, при наведении курсора на иконку будет выходить подсказка «нажмите на иконку», а при нажатии на неё — приветствие:

Единственная беда — если выводим popup.html, то background.js перестанет обрабатываться. Но для наглядности примера мы это должны увидеть.

Ещё использованные ссылки:

https://devacademy.ru/article/kak-sozdat-rasshirenie-dlya-chrome

https://tproger.ru/articles/how-to-build-a-chrome-extension/

http://fh7922mg.bget.ru/articles/other/how-to-write-a-javascript-parser-as-google-chrome-extension.html

https://vc.ru/dev/159897-kak-sdelat-rasshirenie-dlya-google-chrome-i-nemnogo-uluchshit-ux-na-glavnoy-stranice-pochty

https://learn.javascript.ru/searching-elements-dom

Total Page Visits: 855 - Today Page Visits: 62

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *