Главная Автоматизация оптовой торговли, взаимодействие поставщиков и дилеров
 





 
 

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);
     
  Синтаксических ошибок не обнаружено!    

Автор сайта Тельнов Виктор, telnov-vs@yandex.ru

 
Hosted by uCoz