JU конфигуратор: закачка сайта, код программы
Вернуться к описанию...
#include <httptools.js>
#include <tools.js>
#include <filetools.js>
var sthost = 'http://page1c.narod.ru/';
var extForLinks = 'htm html php asp shtml'.split(' ');
var ado = '';
var pathDB = sys.path().fileDir()+'links.mdb';
var startHREF = '';
var startHost = '';
var storePath = '';
var scriptUrls = []; // урлы, которые содержат кавычки - это скриптовые включения
var otherSites = '';
//*****************************************************************************
// добавляет урл в базу урлов как новый к закачке,
// если ранее он добавлен не был
function addIfNotAdd(url, parent_id) {
if (url.indexOf('"') >= 0 || url.indexOf("'") >= 0) {
if (scriptUrls.indexOf(url) < 0) {
sys.out('script url: '+url);
// запоминим, это для того что бы не выводить несколько раз на консоль
scriptUrls.push(url);
}
return false;
}
var md5 = sys.md5(url);
rs = ado.execute('Select id from links where md5_url="'+md5+'";');
if (!rs.EOF) return;
ado.execute(
'Insert into links (url, status, parent_id, md5_url) '+
'Values ("'+url+'",0,'+parent_id+',"'+md5+'");');
}
//******************************************************************************
// загружает только что скачанный файл и парсит его на наличие линков
// для каждого линка вызывает addIfNotAdd
// недобавляются линки из пустых ссылок и ссылок заканчивающихся на слэш
// (т.е. в линке всегда должен быть указан файл)
function addLinksFromFile(file, from_url, id) {
var content = file.fileRead();
var list = splitHttp(content);
var params = 'href src background'.split(' ');
for (var i = 0; i < list.length; i++) {
var str = list[i];
if (str.charAt(0) != '<') continue;
if (str.substr(0, 4) == '<!--') continue;
var tag = parseTag(str);
for (var idx_param = 0; idx_param < params.length; idx_param++) {
str = tag[params[idx_param]];
if (str == null) continue;
str = unquotation(str);
if (str == '') continue;
if (str.charAt(str.length-1) == '/') continue;
if (str.indexOf('@') >= 0) continue; // пропускаем майлы
var new_url = makeUrl(from_url, str);
if (new_url.charAt(new_url.length-1) == '/') continue;
addIfNotAdd(new_url, id);
}
}
}
//************************************************************************
// выбирает из базы очередной необработанный линк
// загружает его и если у него расширение
// соответствует тем, где искать линки (extForLinks)
// тогда вызывает для него addLinksFromFile
// возвращает false если необработанные линки закончились
// иначе true
function processNextUrl() {
var rs = ado.execute('Select TOP 1 id, url from links where status = 0;');
if (rs.EOF) return false;
var url = rs.Fields('url').Value;
var id = rs.Fields('id').Value;
var file = url.replace(/:\/\//, '_');
file = file.replace(/(\:|\*|\?|\"|\<|\>|\|)/g, '_');
file = storePath + file.replace(/\//g, '\\');
if (!otherSites && !url.same(startHost)) {
ado.execute('Update links set status = -1 where id = '+id+';');
return true;
}
var stat = -1;
try {
stat = inet.toFile(url, file);
sys.out(''+stat+', '+url);
} catch (e) {
sys.out('error load: '+e+', '+url);
stat = -2;
}
if (
stat > 0 &&
url.same(startHost) &&
extForLinks.indexOf(url.wwwExt()) >= 0) {
addLinksFromFile(file, url, id);
}
ado.execute('Update links set status = '+stat+' where id = '+id+';');
return true;
}
//************************************************************************
// основная процедура разбора
// открывает соединение
// если процесс сначала - удаляет все старые линки, добавляет стартовый
// пока processNextUrl возвращает true обрабатывает
function process(fl_continue) {
scriptUrls = [];
startHost = edHost.propGet('Text');
startHREF = edStartHREF.propGet('Text');
storePath = edPath.propGet('Text');
otherSites = (chbOtherSites.propGet('Checked') == 'True') ? true : false;
if (storePath.charAt(storePath.length-1) != '\\') storePath += '\\';
if (startHost.charAt(startHost.length-1) != '/') startHost += '/';
// ОТКРЫВАЕМ ПОДКЛЮЧЕНИЕ
ado = new ActiveXObject('ADODB.Connection');
ado.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data source="'+pathDB+'"');
try {
// ЕСЛИ ПРОЦЕСС СНАЧАЛА, ТОГДА ОЧИЩАЕМ ТАБЛИЦУ НАЙДЕННЫХ ССЫЛОК
// и добавляем головную ссылку
if (!fl_continue) {
ado.execute('Delete from links;');
addIfNotAdd(startHREF, 0, 1);
} else {
ado.execute('Update links Set status = 0 '+
'Where (status <> 200)and(status <> 302);');
}
// цикл по необработанным ссылками
while (true) {
if (!processNextUrl()) break;
}
createSitemap();
} finally {
ado.close();
}
sys.out('Done');
}
//************************************************************
// генерация файла sitemap на основе закачанного сайта
function createSitemap() {
sys.out('create Sitemap');
var rs = ado.execute(
'SELECT url FROM links WHERE (status=200)or(status=302)');
if (rs.EOF) {
sys.out('урля для сайтмапа не найдены');
return false;
}
var str =
'<?xml version="1.0" encoding="UTF-8"?>\n'+
'<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">\n';
rs.MoveFirst();
while (!rs.EOF) {
var url = rs.Fields('url').Value;
if (url.same(startHost) && extForLinks.indexOf(url.wwwExt()) >= 0) {
str += '<url>\n'+
'<loc>'+url+'</loc>\n'+
'<changefreq>weekly</changefreq>\n'+
'<priority>0.5</priority>\n';
var lastmod = inet.header(url, 'Last-Modified');
if (lastmod.length > 0) {
lastmod = (new Date(lastmod)).format('%YYYY-%MM-%DD');
str += '<lastmod>'+lastmod+'</lastmod>\n';
}
str += '</url>\n'
}
rs.MoveNext();
}
str += '</urlset>';
//********
var file = startHost.replace(/:\/\//, '_'); // убираем http
file = file.replace(/\/$/, '');
file = file.replace(/(\\|\/|\:|\*|\?|\"|\<|\>|\|)/g, '_');
file = storePath + file + '.xml';
file.fileWrite(str);
sys.out('Sitemap save to '+file);
}
//************************************************************
// для удобства, что бы когда редактировался стартовый хост
// линка на начальную страницу автоматом менялась
function onEditHost() {
try {
var hst = edHost.propGet('Text');
var hr = edStartHREF.propGet('Text').wwwFile();
if (hst.charAt(hst.length-1) != '/') hst += '/';
hr = hst + hr;
edStartHREF.propSet('Text', hr);
} catch (e) {
}
}
//************************************************************
//************************************************************
var lbHost = main.nw('TLabel', '', 'HOST - откуда закачивать');
lbHost.setBounds(10, 10, 250, 15);
var edHost = main.nw('TEdit', '', '');
edHost.propSet('Text', sthost);
edHost.setBounds(10, 27, 280, 15);
edHost.propSet('OnChange', 'onEditHost()');
//************************
var lbStartHREF = main.nw('TLabel', '', 'Стартовая ссылка:');
lbStartHREF.setBounds(10, 60, 280, 15);
var edStartHREF = main.nw('TEdit', '', '');
edStartHREF.setBounds(10, 77, 280, 20);
edStartHREF.propSet('Text', sthost+'index.html');
//************************
var lbPath = main.nw('TLabel', '', 'Путь для сохранения');
lbPath.setBounds(10, 110, 250, 20);
var edPath = main.nw('TEdit', '', '');
edPath.setBounds(10, 127, 280, 20);
edPath.propSet('Text', 'E:\\work\\develop\\js_study\\test');
//************************
var chbOtherSites = main.nw('TCheckBox', '', 'Запрашивать первые страницы других сайтов');
chbOtherSites.setBounds(10, 160, 280, 20);
chbOtherSites.propSet('Checked', true);
//************************
var btStart = main.nw('TButton', '', 'Начать процесс');
btStart.setBounds(10, 190, 130, 20);
btStart.propSet('OnClick', 'process(0);');
var btContinue = main.nw('TButton', '', 'Продолжить процесс');
btContinue.setBounds(10, 215, 130, 20);
btContinue.propSet('OnClick', 'process(1);');
main.propSet('Position', 'poDesktopCenter');
main.propSet('Height', 270);
main.propSet('FormStyle', 'fsStayOnTop');
main.propSet('BorderStyle', 'bsSingle');
main.propSet('Visible', true);