Хотел давно попробовать и вот результат. Если кому интересно то при помощи этого скрипта можно извлечь все комментарии к статье и показать в один столбик.
1. Создаём TXT файл.
2. Копируем туда скрипт и сохраняем.
3. Меняем окончание файла на HTML.
4. Запускаем файл в браузере.
5. В окне вбиваем адрес первой страницы статьи и жмём поиск.
6. Скрипту нужно время, со страницы не уходим, ничего не двигаем и не жмём иногда с первого раза не загружает все комментарии при повторном старте обычно догружает оставшиеся.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Поиск комментариев</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
background-color: #f0f0f0;
overflow-y: scroll;
}
.container {
text-align: center;
background-color: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
width: 800px;
max-height: 90vh;
overflow-y: auto;
}
input[type="text"] {
width: 80%;
padding: 10px;
border-radius: 5px;
border: 1px solid #ccc;
margin-bottom: 10px;
}
button {
padding: 10px 20px;
background-color: #28a745;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #218838;
}
#comments {
margin-top: 20px;
text-align: left;
}
.comment {
display: flex;
background-color: #f8f9fa;
padding: 10px;
margin: 10px 0;
border-radius: 5px;
}
.avatar {
margin-right: 10px;
border-radius: 50%;
width: 40px;
height: 40px;
flex-shrink: 0;
}
.comment-content {
flex-grow: 1;
}
.loading {
margin-top: 10px;
font-size: 14px;
color: #888;
}
.loader {
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
width: 24px;
height: 24px;
animation: spin 1s linear infinite;
display: inline-block;
margin-right: 5px;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.quote {
background-color: #f0f0f0;
color: #666;
border-left: 3px solid #ccc;
padding: 10px;
margin: 10px 0;
}
.media {
max-width: 100%;
height: auto;
margin-top: 10px;
}
.error-message {
color: #721c24;
background-color: #f8d7da;
border: 1px solid #f5c6cb;
padding: 10px;
margin-top: 10px;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="container">
<h2>Поиск комментариев</h2>
<input type="text" id="url" placeholder="Введите URL страницы" />
<br />
<button onclick="startFetchingComments()">Поиск</button>
<div id="loading" class="loading" style="display: none;">
<div class="loader"></div>
Загрузка комментариев...
</div>
<div id="comments"></div>
</div>
<script>
let isFetching = false;
async function startFetchingComments() {
const url = document.getElementById('url').value;
if (!url) {
showErrorMessage('Пожалуйста, введите URL страницы');
return;
}
if (!isFetching) {
isFetching = true;
document.getElementById('comments').innerHTML = '';
document.getElementById('loading').style.display = 'block';
await fetchComments(url);
document.getElementById('loading').style.display = 'none';
isFetching = false;
}
}
async function fetchComments(url) {
try {
console.log(`Fetching URL: ${url}`);
const response = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(url)}`);
const data = await response.json();
const parser = new DOMParser();
const doc = parser.parseFromString(data.contents, 'text/html');
const comments = doc.querySelectorAll('div.comment');
const commentsContainer = document.getElementById('comments');
if (comments.length > 0) {
comments.forEach(comment => {
const commentDiv = document.createElement('div');
commentDiv.classList.add('comment');
// Аватарка
const avatarImg = comment.querySelector('img[src*="avatar"]');
if (avatarImg) {
const img = document.createElement('img');
img.src = avatarImg.src;
img.classList.add('avatar');
commentDiv.appendChild(img);
}
const contentDiv = document.createElement('div');
contentDiv.classList.add('comment-content');
// Обработка содержимого комментария
let isFirstLink = true;
Array.from(comment.childNodes).forEach(node => {
if (node.nodeType === Node.TEXT_NODE) {
const textNode = document.createTextNode(node.textContent.trim());
contentDiv.appendChild(textNode);
} else if (node.nodeType === Node.ELEMENT_NODE) {
if (node.classList.contains('quote')) {
const quoteDiv = document.createElement('div');
quoteDiv.classList.add('quote');
quoteDiv.innerHTML = node.innerHTML;
contentDiv.appendChild(quoteDiv);
} else if (node.tagName === 'IMG') {
const img = document.createElement('img');
img.src = node.src;
img.classList.add('media');
contentDiv.appendChild(img);
} else if (node.tagName === 'VIDEO') {
const video = document.createElement('video');
video.src = node.src;
video.controls = true;
video.classList.add('media');
contentDiv.appendChild(video);
} else if (node.tagName === 'A') {
// Пропускаем первую ссылку (обычно это ник пользователя)
if (!isFirstLink) {
// Проверяем, содержит ли ссылка текст или изображение
if (node.textContent.trim() !== '' || node.querySelector('img')) {
contentDiv.appendChild(node.cloneNode(true));
}
}
isFirstLink = false;
} else {
contentDiv.appendChild(node.cloneNode(true));
}
}
});
commentDiv.appendChild(contentDiv);
commentsContainer.appendChild(commentDiv);
});
commentsContainer.scrollTop = commentsContainer.scrollHeight;
} else {
showErrorMessage('Комментарии не найдены на текущей странице.');
}
const nextPageLink = doc.querySelector('a[title="На следующую страницу"]');
if (nextPageLink) {
const relativeUrl = nextPageLink.getAttribute('href');
const nextPageUrl = new URL(relativeUrl, url).href;
console.log(`Следующая страница: ${nextPageUrl}`);
await new Promise(resolve => setTimeout(resolve, 1000));
await fetchComments(nextPageUrl);
} else {
console.log('Все страницы загружены.');
}
} catch (error) {
console.error('Ошибка при получении комментариев:', error);
showErrorMessage('Не удалось загрузить комментарии. Пожалуйста, проверьте URL и попробуйте снова.');
}
}
function showErrorMessage(message) {
const commentsContainer = document.getElementById('comments');
const errorDiv = document.createElement('div');
errorDiv.className = 'error-message';
errorDiv.textContent = message;
commentsContainer.appendChild(errorDiv);
}
</script>
</body>
</html>
Комментарии
Крутяк
Спасибо!
Молодец!
Это тянет на нобелевку?
Нет, не тянет
А смысл?
матрица АШ
Если кто то хочет найти комментарий то не надо переключать между страницами потому что все комментарии на виду. Например к статье "Про призывы запретить преподавать теорию эволюции" 635 комментариев на 13 страницах найти там нужный комментарий бывает не очень удобно.
А не надо переключаться между страницами. К адресу страницы допишите &full - и все комментарии будут на одной странице. Как пример - https://m.aftershock.news/?q=node/1424103&full
О, а я не знал, спасибо большое
Пользуйтесь на здоровье
Как знание вот таких простых вещей делает жись на форуме проще..
Спасибо!
Теперь понятно,а то слова какие-то не понятные буквы из нё дружеспого языка,с картинками было-бы ещё понятней.:))
Или например все Ваши 30509 комментариев в столбик и тогда легко найти нужный
Вот за эту возможность спасибо. Скрипт нужный.
Это мы здесь просто так, от времени свободного.
А люди - работают.
А просто кликнуть на кнопку "Мои комментарии" не проще будет?
Нет, не проще у меня например 113 страниц с комментариями как мне там найти нужный
А какая разница, если у вас последние комментарии в начале? Вы же не сотни комментов к статье в день пишете?
Например мне надо найти комментарий годичной давности и я помню только фразу из этого комментария
Хорошая работа, спасибо.
Спасибо.
У меня почему то аватарки по две штуки от всех комментаторов...
А размер шрифта можно в скрипте увеличить?
Вещь хорошая, пригодиться.
Спасибо!!!
запрос в гуле по шаблону site:aftershock.news "Зоозащитникам пора бить тревогу"
пример отработки запроса в гугле - это ссылка
но надо понимать, что индексируется гуглом АШ не каждые 20 минут. раз .. ну в три-пять часов.
разбор
site:aftershock.news - ищем только на данном сайте.
"Зоозащитникам пора бить тревогу" - ищем только указанную фразу
взял первый попавшийся коммент, в случайной статье.
Спасибо