tungus1973
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Откопал в архивах только этот плагин. Большая часть алгоритма в нём реализована. Обратите внимание, что плагин был написан давно, поэтому некоторые теги могут не соответствовать текущему html-коду Яндекс.Новостей. Код: ' Плагин обработки новостей сайта Яндекс.Новости ' Установки странички: сортировка "по дате", "не группировать" по сюжетам '******************************************************************************* 'Эта функция удаляет из текста двойные пробелы, табуляции, символы CRLF, ' пробелы слева и справа от текста Function OptimizeText(sText) As String OptimizeText = Trim(OptimizeHtml(DeleteHtmlTags(sText))) End Function '******************************************************************************* ' Процедура начинается сразу после скачивания странички из интернета Sub Wsw_PreProcessPage(Handle, ByRef sMemWeb, ByRef sStatusMessage, ByRef iStatusCode) '------------------------------------------------------------------------------- ' ОБЪЯВЛЯЕМ ПЕРЕМЕННЫЕ '------------------------------------------------------------------------------- ' Переменная для текущей даты-времени Dim sCurDate ' Строковая переменная, которая будет собирать в себя новости со странички Dim sMem ' Переменная для "тела" новостей Dim sNewsBody ' Переменная для списка старых новостей Dim sOldNews ' Переменные для списков ссылок со старой и новой страниц и списка новых ссылок Dim sLinkListOld, sLinkListWeb ' Теги-признаки начала-конца ссылки на новость, даты-времени публикации, источника, сниппета Dim sTitleTagStart, sSourceTagStart, sDateTagStart, sSnippTagStart Dim sTitleTagEnd, sSourceTagEnd, sDateTagEnd, sSnippTagEnd ' Переменные для сбора ссылки на новость, даты-времени публикации, источника, сниппета Dim sLink, sTitle, sSource, sDateTime, sSnipp ' Переменные для обозначения позиции начала подтекста и его длины Dim iStart, iLen ' Переменные для счётчиков Dim i, j ' Максимальное количество новостей на странице Dim iMaxNews '------------------------------------------------------------------------------- ' ПРИСВАИВАЕМ ПЕРЕМЕННЫМ ЗНАЧЕНИЯ '------------------------------------------------------------------------------- ' Сюда вписываем теги-признак начала-конца атрибутов новости ' Теги начала и конца ссылки-заголовка новости sTitleTagStart = "<div class=""b-news-groups__news-title"">" sTitleTagEnd = "</a>" ' Теги начала и конца названия источника sSourceTagStart = "<div class=""b-news-groups__provider-name""><span class=""source"">" sSourceTagEnd = "</span></div></div>" ' Теги начала и конца даты-времени публикации sDateTagStart = "<div class=""b-news-groups__news-date-time"">" sDateTagEnd = "</div>" ' Теги начала и конца сниппета публикации sSnippTagStart = "<span class=""b-news-groups__news-description" sSnippTagEnd = "</span>" '------------------------------------------------------------------------------- ' ТЕЛО ПЛАГИНА '------------------------------------------------------------------------------- ' Получаем текущие дату и время в виде строки sCurDate = CStr(Now) ' Преобразуем текущую дату в формат "ДД.ММ.ГГ" sCurDate = Left(sCurDate, 6) + Mid(sCurDate, 9, 2) ' Присваиваем переменной sMem текстовое значение html-кода странички. Теперь все текстовые операции ' будем выполнять с этой переменной, а в sMemWeb будем формировать новую html-страничку sMem = sMemWeb ' Тела новостей и списка ссылок у нас пока нет, поэтому присваиваем их переменным "пустую строку" sNewsBody = "" sLinkListWeb = "" '------------------------------------------------------------------------------- ' НАЧИНАЕМ ФОРМИРОВАТЬ НОВОЕ ТЕЛО WEB-СТРАНИЧКИ '------------------------------------------------------------------------------- ' Начинаем "шапку страницы". В заголовок страницы помещаем название закладки sMemWeb = "<html><head><title>" + Bookmark_GetProperty(Handle, "name") ' Устанавливаем кодировку UTF-8 sMemWeb = sMemWeb + "</title><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">" ' Закрываем "шапку" страницы sMemWeb = sMemWeb + "</head><body>" ' Новости будут располагаться в виде нумерованного списка (тег <ol>) sMemWeb = sMemWeb + "<ol>" + CRLF '------------------------------------------------------------------------------- ' ВЫБИРАЕМ ИЗ СТРАНИЧКИ НОВОСТИ И РАССТАВЛЯЕМ ИХ В НУЖНОМ НАМ ПОРЯДКЕ '------------------------------------------------------------------------------- ' Теперь нам нужно вписать в тело странички новости ' Запускаем цикл, который будет выполняться, пока найден хотя бы один признак новости Do While FindString(sMem, sSourceTagStart, iStart, iLen) ' Удаляем из странички весь текст до начала найденной новости Delete(sMem, 1, iStart -1) ' Выбираем сведения об ИСТОЧНИКАХ НОВОСТЕЙ If FindWildcard(sMem, sSourceTagStart + "*" + sSourceTagEnd, iStart, iLen) Then ' Найденный текст копируем в переменную, удаляем из общего текста, оптимизируем sSource = OptimizeText(CopyAndDelete(sMem, iStart, iLen)) Else ' Иначе... ' ...завершаем выполнение плагина с ошибкой iStatusCode = 2 sStatusMessage = "Ошибка: Не найден шаблон!" End If ' Выбираем сведения о ДАТЕ-ВРЕМЕНИ ПУБЛИКАЦИИ If FindWildcard(sMem, sDateTagStart + "*" + sDateTagEnd, iStart, iLen) Then ' Найденный текст копируем в переменную, удаляем из общего текста, оптимизируем sDateTime = OptimizeText(CopyAndDelete(sMem, iStart, iLen)) ' Проверяем, если для новости указано только время публикации,... If Len(sDateTime) = 5 Then ' ...то добавляем к ней сегодняшнюю дату в формате "дд.мм.гг чч:мм" sDateTime = sCurDate + " " + sDateTime End If End If ' Выбираем сведения о ССЫЛКЕ-ЗАГОЛОВКЕ НОВОСТИ If FindWildcard(sMem, sTitleTagStart + "*" + sTitleTagEnd, iStart, iLen) Then ' Найденный текст копируем в переменную, удаляем из общего текста, оптимизируем sTitle = CopyAndDelete(sMem, iStart, iLen) ' Внутри найденного текста ищем теги ссылки If FindWildcard(sTitle, "<a *</a>", iStart, iLen) Then ' Вырезаем ссылку с тегами sTitle = CopyAndDelete(sTitle, iStart, iLen) ' Вырезанный текст также присваиваем переменной, из которой потом извлечём ссылку sLink = sTitle ' Оптимизируем заголовок, удаляем начальные и конечные пробелы, выделенный текст оставляем sTitle = Trim(DeleteHtmlTags(sTitle)) ' Если найдена ссылка на новость, то... If FindWildcard(sLink, "href=""*""", iStart, iLen) Then ' ...извлекаем ссылку на новость из переменной sLink = Mid(sLink, iStart +6, iLen -7) End If End If End If ' Выбираем текст СНИППЕТА НОВОСТИ If FindWildcard(sMem, sSnippTagStart + "*" + sSnippTagEnd, iStart, iLen) Then ' Оптимизируем сниппет, удаляем начальные и конечные пробелы, выделенный текст оставляем sSnipp = Trim(CopyAndDelete(sMem, iStart, iLen)) End If ' Собираем чистый текст новостей в одну переменную, с которой потом будем работать через инфополе1 ' В конце каждой новости вставляем знак CRLF, формируя таким образом строковой список ' В первую строку новости помещаем извлеченную ссылку-заголовок sNewsBody = sNewsBody + "<li><p align=""justify""><a href=""" + sLink + """>" + sTitle + "</a><br>" ' Во второй строке будет название источника новости sNewsBody = sNewsBody + sSource + "<br>" ' В третьей строке новости будет дата-время публикации sNewsBody = sNewsBody + sDateTime + "<br>" ' В четвёртой строке разместим извлечённый сниппет новости sNewsBody = sNewsBody + sSnipp + "</p>" + CRLF ' В список ссылок с веб странички добавляем извлечённую ссылку на новость sLinkListWeb = sLinkListWeb + sLink + CRLF Loop '------------------------------------------------------------------------------- ' ОПРЕДЕЛЯЕМ, ПОЯВИЛИСЬ ЛИ НОВЫЕ НОВОСТИ '------------------------------------------------------------------------------- ' Переменной Старых новостей присваиваем значение из Инфополя1 sOldNews = Bookmark_GetProperty(Handle, "infofield1") ' Переменной Старых ссылок на новости присваиваем значение из Инфополя2 sLinkListOld = Bookmark_GetProperty(Handle, "infofield2") ' Если же Инфополе1 было пустым,... If sOldNews = "" Then ' ...то вписываем в него переменную с собранными новостями, ... Bookmark_SetProperty(Handle, "infofield1", sNewsBody) ' ...а в Инфополе2 вписываем список ссылок на новости Bookmark_SetProperty(Handle, "infofield2", sLinkListWeb) Else ' Если же Инфополе1 не пустое, значит, у нас уже были собраны новости. ' Начинаем формировать список новых новостей ' Сравним ссылки из веб-странички с ссылками из старой странички ' Если списки полностью равны, значит, изменений не произошло If sLinkListOld = sLinkListWeb Then ' Завершаем выполнение плагина с кодом "Закладка проверена, изменений нет" iStatusCode = 0 sStatusMessage = "OK" End If ' Определяем максимальное количество новостей на страничке, чтобы не накапливать ' очень большие списки новостей ' Если количество ссылок на новости больше 10, то... If StringList_ItemCount(sLinkListWeb) > 10 Then ' ...максимальное количество новостей на страничке будет в 4 раза больше, ' чем общее количество новостей, получаемое обычно из веб-странички ' Если Вы хотите видеть на странице другое количество новостей, то ' вместо цифр 4 и 40 (см.ниже) впишите другие значения. iMaxNews = StringList_ItemCount(sLinkListWeb) * 4 Else ' Если же новостей на веб-страничке меньше или равно 10, то просто ' устанавливаем максимум 40 новостей iMaxNews = 100 End If ' Выявляем новые ссылки ' Будем сравнивать ссылки из нового списка со ссылками из старого списка For i = StringList_ItemCount(sLinkListWeb)-1 To 0 Step -1 ' Устанавливаем счётчик для списка ссылок с локальной страницы For j = StringList_ItemCount(sLinkListOld)-1 To 0 Step -1 ' Если ссылка с веб-страницы равна ссылке с локальной страницы, ... If StringList_GetItem(sLinkListWeb, i) = StringList_GetItem(sLinkListOld, j) Then ' ...то удаляем её из списка ссылок, и... StringList_DeleteItem(sLinkListWeb, i) ' ...удаляем новость из списка новых новостей StringList_DeleteItem(sNewsBody, i) ' ...завершаем цикл для счётчика j Exit For End If Next Next ' По окончании работы цикла, мы имеем список новых ссылок и список новых новостей. '------------------------------------------------------------------------------- ' ВЫКАЧИВАЕМ НОВЫЕ НОВОСТИ ' (Если Вы не хотите выкачивать странички, то поставьте знак "комментарий" (') перед ' тремя следующими строками, начинающихся с For, DownloadFile и Next) '------------------------------------------------------------------------------- ' Выкачиваем странички с новыми новостями For i = 0 To StringList_ItemCount(sLinkListWeb)-1 ' Если в менеджере загрузок уже есть файл с таким URL, то этот файл не будет загружен DownloadFile(Handle, StringList_GetItem(sLinkListWeb, i), "", FALSE) Next '------------------------------------------------------------------------------- ' ОБЪЕДИНЯЕМ НОВЫЕ И СТАРЫЕ НОВОСТИ '------------------------------------------------------------------------------- ' Объединяем новые и старые новости (новые ставим в начало страницы) sNewsBody = sNewsBody + sOldNews ' Объединяем новые и старые ссылки на новости (новые ставим в начало списка) sLinkListWeb = sLinkListWeb + sLinkListOld ' Если общее количество новостей превышает установленное нами максимальное значение, ' то удаляем лишние новости IF StringList_ItemCount(sLinkListWeb) > iMaxNews Then ' Запускаем цикл для лишних новостей For i = StringList_ItemCount(sLinkListWeb) -1 To iMaxNews Step -1 ' Удаляем лишное ссылки на новости StringList_DeleteItem(sLinkListWeb , i) ' Удаляем лишние новости StringList_DeleteItem(sNewsBody, i) Next End If ' Помещаем в поля "Инфополе1" и "Инфополе2" новые списки новостей и ссылок Bookmark_SetProperty(Handle, "infofield1", sNewsBody) Bookmark_SetProperty(Handle, "infofield2", sLinkListWeb) End If '------------------------------------------------------------------------------- ' ЗАКАНЧИВАЕМ СТРОИТЕЛЬСТВО HTML-СТРАНИЧКИ '------------------------------------------------------------------------------- ' Закрываем нумерованный список sMemWeb = sMemWeb + sNewsBody + "</ol>" ' Заканчиваем "подвал" странички sMemWeb = sMemWeb + "</body></html>" End Sub |
| Всего записей: 94 | Зарегистр. 28-05-2006 | Отправлено: 17:01 30-12-2013 | Исправлено: tungus1973, 17:06 30-12-2013 |
|