автоудаление дубликатов

Аватар пользователя Гость Гость (не проверено) 15 февраля 2005 в 14:18

Часто бывает так, что посетители из-за плохого коннекта или по другим причинам создают дубликаты контента (например, 2 одинаковых комментария). Друпал такую штуку не отслеживает. Проверяется просто - создается нода, в момент "ожидания ответа" нажимается "стоп", а потом ещё раз "отправить". В результате - две одинаковых ноды с одинаковым временем создания и контентом.

Собственно вопрос, имеет ли движок друпала возможность автоматически удалять такие дубли?

Лучший ответ

Аватар пользователя axel axel 10 марта 2005 в 0:25

Если не заработало - пиши. Но на drupal.ru получилось - работает как надо вроде.

--
Axel,
www.axel.drupal.ru

Комментарии

Аватар пользователя axel axel 15 февраля 2005 в 19:24

А я вот так не понял, отслеживает или нет - в логах иногда попадаются сообщения о дубликатах (т.е. отслеживает? - а может глюки в переводе), но на сайт дубликат запостить просто - действительно нажать быстро стоп и заново отправить ноду или комментарий. Лучше было в старых версиях, вот у меня один сайт работает на Drupal 4.3 и там в настройках можно было указать время блокировки, в которое новые ноды/комментарии от пользователя не принимались - дубликатов на этом сайте не встречается. Не пойму почему эту фичу в следующих версяиях убрали?

Пока мысли о решении проблемы такие: либо отслеживать регулярно по cron новые ноды/комментарии и сравнивать их заголовки - если одинаковые, сравнивать тексты и если тож одинаковые - удалять. Либо прицепить это к редактировнию документа - при отправке смотреть ближайшие по номерам ноды (скажем последние 3-5) и сравнивать заголовки. Оба варианта можно сделать доп. модулем, не трогая стандартных модулей.

Ещё интересно такую штуку приспособить к аггрегатору новостей - часто одинаковые новости гуляют с сайта на сайт (благодаря другим аггрегаторам на каждом сайте) и собирая новости с сайтов общей тематики часто можно получать с разных сайтов набор дублей новости. Удобно тож убивать это автоматом.

Для drupal.ru удаление дублей актуально, но я не знаю когда доберусь до такого модуля (разве кто оплатить захочет такую работу?) или раньше на drupal.org кто-нибудь представит готовое решение.

--
Axel,
www.axel.drupal.ru

Аватар пользователя PG PG 15 февраля 2005 в 20:07

Quote:
Не пойму почему эту фичу в следующих версяиях убрали?
Ну, я примерно догадываюсь.

Видишь ли, для тех, кто сидит на диалапе, вполне традиционной является тактика сперва вылезти и открыть в десяти окнах десять форм ввода, а потом отключиться, вдумчиво их заполнить и подключившись второй раз одну за другой быстренько все отправить.

О админах, любителях ставить таймаут на прием сообщений от одного и того ж пользователя, они обычно отзываются настолько ласково, что я здесь даже упоминать не буду.
Smile
Может быть среди девелоперов на drupal.org количество таких пользователей больше, чем количество таких админов?

Технически решение проблемы можно сделать гораздо проще: сделать javascript, который будет дизаблить кнопку отправки после первого же использования. На invision board сделано именно так. Просто и со вкусом.

Quote:
Ещё интересно такую штуку приспособить к аггрегатору новостей - часто одинаковые новости гуляют с сайта на сайт (благодаря другим аггрегаторам на каждом сайте) и собирая новости с сайтов общей тематики часто можно получать с разных сайтов набор дублей новости. Удобно тож убивать это автоматом.
О! Кстати, давно хотел спросить, да все как-то забывал.

Как у Drupal с опасностью рекурсивного обмена новостями? Не обязательно друг у друга новости тырить. Вполне можно себе представить конструкцию из трех сайтов, когда новость, появившаяся на одном, утаскивается на другой, с него ее утаскивают на третий сайт, а новостями с третьего питается как раз первый.

Это не столь уж невозможная конструкция: ведь оно и логично, что кучка узкоспециализированных сайтов тырят друг у друга новости.

Аватар пользователя axel axel 16 февраля 2005 в 0:12

Да, объяснение о диалапе у друпаловских девелоперов многое объясняет Wink Вообще, есть рекомендация в случае глухого диалапа пользовать промежуточный софт, вроде проксей там типа wwwoffle - очень помогает. Я так и делал когда на диалапе сидел - открываем кучу страниц, затем отключаемся и переводим wwwoffle в оффлайн-режим. В этом режиме всё что в него из броузера попало - запоминается в его кеше. А при подключении к сети он все накопленные запросы рассылает по сайтам. Да, блокировка в этом случае будет мешаться, эт точно Beee

Но с JS решение вкусным не назовёшь никак. Вот выключу я у себя в браузере JavaScript и что - нет больше никакой блокировки. А в IB кстати фигово в случае сбоев связи (это даже не только диалапу актуально) - послал сообщение, оно где-то потерялось, ответа нет, кнопка задизеблена Beee В Друпал можно её ещё раз хоть потом ткнуть (вот они дубли ;)) Не, хороший сайт должен без JS работать, а JS только для косметики испльзоваться и исключительно вспомогательных функций. В Друпал это именно так. И проверка ввода должна быть на сервере, а не у клиента.

Насчёт "тырения" новостей. Дык кто ж это запретит? Если сайт выдаёт контент в инет - значит этот контент будут по всякому использовать. RSS в Drupal сделан неотключаемым - пора приучаться, что вебсайт это не обязательно только браузер и только HTML Smile Конечно тырить контент по RSS куда легче, но к счастью пока те кто этим может заняться про RSS обычно ни сном ни духом, т.что некоторое время можно жить спокойно Smile Вообще никто не жаловался. Разве что на к.л. злобном коммерческом сайте могут не захотеть отдавать свои новости "нахаляву" - ну так за деньги можно им это в движке отключить Wink

--
Axel,
www.axel.drupal.ru

Аватар пользователя PG PG 16 февраля 2005 в 2:24

Quote:
Но с JS решение вкусным не назовёшь никак. Вот выключу я у себя в браузере JavaScript и что - нет больше никакой блокировки. А в IB кстати фигово в случае сбоев связи (это даже не только диалапу актуально) - послал сообщение, оно где-то потерялось, ответа нет, кнопка задизеблена

1) "Если отключить - нет блокировки."
А ты не отключай. Wink

2) "Послал сообщение, оно потерялось, кнопка задизейблена."
У тебя две кнопки. Ты обе задизейблил? Wink

Аватар пользователя PG PG 16 февраля 2005 в 2:26

"В этом режиме всё что в него из броузера попало - запоминается в его кеше. А при подключении к сети он все накопленные запросы рассылает по сайтам."

ОГО!!!
Нехило. А ты ничего не путаешь?
Никогда не слышал про отложенное кэширование записи в приложении к веб-браузингу.

И честно говоря, слабо представляю себе практическую реализацию. Wink

Аватар пользователя axel axel 16 февраля 2005 в 22:23

Не путаю. Это гораздо проще чем ты предположил Smile Ведь браузер отправляет на сайт данные - у него есть адрес сервера и запрос, содержащий имена полей формы и данные в них. Представь что этот запрос ты отправил не сразу, а через время. Если форум тебя не отлогинил за это время - то ему пофиг пришёл запрос через 1 минуту или 1 час. Вот прокси это и делает. В состоянии оффлайна он принимает запросы и сообщает, что запрос записан. При переходе в онлайн - ему можно сказать, чтобы он отправил данные из кеша.

Технология не уникальна и реализована подозреваю во многих софтинах. Я пользовал вот эту: http://www.gedanken.demon.co.uk/wwwoffle/ WWW Offline Explorer. Кроме кеширования оно ещё умеет мониторить страницы с заданным интервалом и забирать в кеш новые версии, к кешу можно прикрутить поисковик и сделать себе маленький локальнй интернет Smile - я сначала ht://Dig цеплял, потом mnogosearch, но при постоянном коннекте пришёл к выводу, что гуглом проще Wink А вот для диалапа - вещь незаменимая. Можно несколько броузеров завернуть на прокси и у них будет общий кеш.

--
Axel,
www.axel.drupal.ru

Аватар пользователя PG PG 16 февраля 2005 в 2:29

Quote:
Разве что на к.л. злобном коммерческом сайте могут не захотеть отдавать свои новости "нахаляву" - ну так за деньги можно им это в движке отключить

Нет, я не о том, ты не понял.

Попытаюсь объяснить на пальцах.

Есть сайты схожей тематики А, Б и Ц.

А тырит новости с Б, Б тырит новости с Ц, а Ц тырит новости с А (это для простоты, на самом деле все трое тырят новости с обоих конкурентов). Wink

Вопрос: что будет при добавлении новости на сайт А?

Аватар пользователя axel axel 16 февраля 2005 в 22:12

Quote:
Есть сайты схожей тематики А, Б и Ц.
А тырит новости с Б, Б тырит новости с Ц, а Ц тырит новости с А (это для простоты, на самом деле все трое тырят новости с обоих конкурентов).

У меня только один комментарий: мудаки они все трое.

--
Axel,
www.axel.drupal.ru

Аватар пользователя Nick Nick 16 февраля 2005 в 18:44

В Друпале стандартный агреготор отделен от структуры сайта. Агрегируемые новости - это даже не ноды ...

http://drupal.ru/aggregator
Поэтому, сагрегированные новости нельзя вынести на главную страницу... Расзве что copy/paste.

И агрегировать сагрегированные новости нельзя.

--
USU-Lug http://usu-lug.org.ru

Аватар пользователя genie genie 16 февраля 2005 в 0:54

спасибо за развернутый ответ.

> в логах иногда попадаются сообщения о дубликатах

я тоже заметил, не понял только, удаляются они или нет.

> при отправке смотреть ближайшие по номерам ноды

тут скорее по времени смотреть надо.

по поводу аггрегации новостей - мне кажется сайты делятся на 1) производителей контента 2) распространителей контента. когда сайт "подсасывает" новости с другого сайта - он должен брать только уникальные новости. иначе может дойти до абсурда - перекрестной аггрегации.

оффтопик: почему на форуме друпал.ру нет индикатора того, залогинился ли я или нет. уже второй раз начинаю новую тему как "гость", предварительно просканировав страницу в поисках "вы зашли как" или "логиньтесь тут" и не найдя этого.

Аватар пользователя PG PG 16 февраля 2005 в 2:38

Quote:
по поводу аггрегации новостей - мне кажется сайты делятся на 1) производителей контента 2) распространителей контента. когда сайт "подсасывает" новости с другого сайта - он должен брать только уникальные новости. иначе может дойти до абсурда - перекрестной аггрегации.

ВОТ! Это уже теплее.
Там разве есть понятие "собственная новость"/"распространяемая новость"? И разве можно ограничить сбор новостей только первым типом?

Аватар пользователя genie genie 16 февраля 2005 в 12:51

такое понятие есть как минимум у меня в голове Smile если вопрос отсеченния одних от других ещё не встал, то рано или поздно он встанет. сейчас же отсекать можно по сайтам - например на ИТАР-ТАСС новости все свои (я так думаю, не проверял), а на Яндекс.Новости - агрегированные.

какой смысл сайту кроме своих новостей показывать чужие? сайт интересен посетителю именно своим контентом. чужие новости можно почитать на чужом сайте (если они интересны пользователю). а свои затеряются среди чужих.

Аватар пользователя PG PG 16 февраля 2005 в 20:23

Я так понял, перед поиском по drupal.ru всегда полезно сперва открыть страничку ht-tp://drupal.ru/cron.php
Wink

Кстати, а для Drupal существуют поисковые модули отличные от штатного?

Аватар пользователя axel axel 16 февраля 2005 в 21:59

Конечно спасибо тебе, за то что облегчаешь работу системному cronу Smile но друпаловский cron.php не дорабатывает до конца - звать его бесполезно. Я не выяснил пока почему. Модули, которые использую крон - отключал, всё равно в лог пишется - крон не завершил работу. Как-нибудь утащу сайт на локальный комп - разберусь. Пока как-нибудь так, гуглом там и пр. подручными средствами Smile

--
Axel,
www.axel.drupal.ru

Аватар пользователя Nick Nick 16 февраля 2005 в 22:27

Я несколько не это имел ввиду. Просто axel там в алгоритме писал про поиск одинаковых комментов.

А вот завязвть этот поиск на штатную поисковую систему - эта мысль мне не пришла в голову. Правда, она, конечно, не идеаельна...

http://drupal.org/node/16428
http://drupal.org/project/trip_search

--
USU-Lug http://usu-lug.org.ru

Аватар пользователя PG PG 16 февраля 2005 в 23:33

А, пардон. Кто о чем, а вшивый о бане. Естественно, искать лучше не тупым сравнением, а хэшированием. Тогда и количество проверяемых на повтор страниц можно увеличить. Скажем, до полусотенки.

Вариант, предельно близкий к идеальному.

Аватар пользователя axel axel 17 февраля 2005 в 18:17

Сейчас проверил что сделано в comment.module. Там действительно стоит проверка на дубликаты и она работает, вот только реакцией является лишь запись в лог о дубликате - на сайт он всё равно постится. Разработчики имхо пошутили других объяснений нет Smile В node.module подобные проверки отсутствуют вовсе, долго не искал, кому интересно поковыряйте.

Получаем патчик к comment.module + модуль для проверки нодов (править node.module не будет правильным когда nodeapi есть). Работы тут совсем немного, потестировать только для надёжности. Учитывая общественную полезность такой штуки можно отвлечься за символические 5WMZ. Скажем завтра тогда могу сделать - модуль и патч под 4.5.

--
Axel,
www.axel.drupal.ru

Аватар пользователя PG PG 19 февраля 2005 в 17:39

Вот это, кстати, правильно. Не глотать сообщения, а выдавать предупреждение с запросом.

Ну и понятно, что под байес должны подпадать сообщения от этого же пользователя и из последних 15-20 отправленных им.

Аватар пользователя axel axel 19 февраля 2005 в 18:27

Зачем сложно, когда можно просто? Простое правило: дубликаты идут подряд. Исключений на этом сайте я не видел. Не будет юзер постить один коммент, потом другой, потом опять первый - если только он не спамер. Проверка по тексту двух-трёх ближайших нодов/комментариев данного пользователя эффективна и достаточна.

--
Axel,
www.axel.drupal.ru

Аватар пользователя axel axel 19 февраля 2005 в 18:20

Попробую ЯндексДеньговский клиент под wine - если будет работать, то устроит Smile Люди, кто-нибудь ЯндексДеньги под Линукс запускал в Wine? В Webmoney вебинтерфейс есть, а в Яндексе на это почему-то забили.

--
Axel,
www.axel.drupal.ru

Аватар пользователя axel axel 22 февраля 2005 в 13:39

ЯндексДеньги запустились под эмулятором, но глючновато выглядит. Потестить неплохо б для надёжности. Genie, а можешь мне мелкую сумму (какие-нибудь там 0.01$ или сколько минимум там можно передавать) кинуть на кошелёк, понятно будет хоть работает реально он или нет? Сумму можно тогда вычесть из 5$, но просто сразу 5$ если уйдут в никуда это будет жалко Smile А кошелёк я заведу сейчас и номер сообщу.

Блокировку дублей для comment.module тем временем сделал - см. как это работает на drupal.ru. Для нодов модуля не делал пока.

--
Axel,
www.axel.drupal.ru

Аватар пользователя axel axel 3 марта 2005 в 16:52

Решил не возиться с этим глючным ЯндекДеньги. Клиент под wine работает со странностями и деньги ему в таком виде доверять стрёмно. Раз через Webmoney никак, то лови бесплатно Smile Поправки ниже следует внести в comment.module, чтобы функция comment_post выглядела как ниже:

function comment_post($edit) {
...пропущено до комментария
      // Check for duplicate comments.  Note that we have to use the
      // validated/filtered data to perform such check.

      $duplicate = db_result(db_query("SELECT COUNT(cid) FROM {comments} WHERE pid = %d AND nid = %d AND subject = '%s' AND comment = '%s'", $edit["pid"], $edit["nid"], $edit['subject'], $edit['comment']), 0);
      if ($duplicate != 0) {
        watchdog('warning', t('Comment: duplicate %subject.', array('%subject' => '<em>'. $edit["subject"] .'</em>')));
        drupal_set_message(t('Duplicate comment. You comment already posted! Don\'t clone it!'), 'error');
      }

    if (!form_get_errors() && !$duplicate) {

...и т.д.дальше без изменений

--
Axel,
www.axel.drupal.ru

Аватар пользователя B.X B.X 3 марта 2005 в 21:24

кстати, решение более чем спорное... более того в Drupal 4.4 что-то подобное уже было, когда при редактирование собственного сообщения и совпадения заголовка не было возможности это сообщение добавить...

Аватар пользователя axel axel 10 марта 2005 в 0:23

В 4.3 была блокировка по времени (о чём выше тут обсуждалось). Редактировать свои сообщения оно даёт, это я проверял. Собственно, просто изменил реакцию на событие, а проверка уже делалась в 4.5.2 - реакцией была запись в лог.

--
Axel,
www.axel.drupal.ru