Автор: tungus1973
Дата сообщения: 30.12.2013 15:01
Откопал в архивах только этот плагин. Большая часть алгоритма в нём реализована.
Обратите внимание, что плагин был написан давно, поэтому некоторые теги могут не соответствовать текущему 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