Часто бывает так, что посетители из-за плохого коннекта или по другим причинам создают дубликаты контента (например, 2 одинаковых комментария). Друпал такую штуку не отслеживает. Проверяется просто - создается нода, в момент "ожидания ответа" нажимается "стоп", а потом ещё раз "отправить". В результате - две одинаковых ноды с одинаковым временем создания и контентом.
Собственно вопрос, имеет ли движок друпала возможность автоматически удалять такие дубли?
Комментарии
А я вот так не понял, отслеживает или нет - в логах иногда попадаются сообщения о дубликатах (т.е. отслеживает? - а может глюки в переводе), но на сайт дубликат запостить просто - действительно нажать быстро стоп и заново отправить ноду или комментарий. Лучше было в старых версиях, вот у меня один сайт работает на Drupal 4.3 и там в настройках можно было указать время блокировки, в которое новые ноды/комментарии от пользователя не принимались - дубликатов на этом сайте не встречается. Не пойму почему эту фичу в следующих версяиях убрали?
Пока мысли о решении проблемы такие: либо отслеживать регулярно по cron новые ноды/комментарии и сравнивать их заголовки - если одинаковые, сравнивать тексты и если тож одинаковые - удалять. Либо прицепить это к редактировнию документа - при отправке смотреть ближайшие по номерам ноды (скажем последние 3-5) и сравнивать заголовки. Оба варианта можно сделать доп. модулем, не трогая стандартных модулей.
Ещё интересно такую штуку приспособить к аггрегатору новостей - часто одинаковые новости гуляют с сайта на сайт (благодаря другим аггрегаторам на каждом сайте) и собирая новости с сайтов общей тематики часто можно получать с разных сайтов набор дублей новости. Удобно тож убивать это автоматом.
Для drupal.ru удаление дублей актуально, но я не знаю когда доберусь до такого модуля (разве кто оплатить захочет такую работу?) или раньше на drupal.org кто-нибудь представит готовое решение.
--
Axel,
www.axel.drupal.ru
Видишь ли, для тех, кто сидит на диалапе, вполне традиционной является тактика сперва вылезти и открыть в десяти окнах десять форм ввода, а потом отключиться, вдумчиво их заполнить и подключившись второй раз одну за другой быстренько все отправить.
О админах, любителях ставить таймаут на прием сообщений от одного и того ж пользователя, они обычно отзываются настолько ласково, что я здесь даже упоминать не буду.
Может быть среди девелоперов на drupal.org количество таких пользователей больше, чем количество таких админов?
Технически решение проблемы можно сделать гораздо проще: сделать javascript, который будет дизаблить кнопку отправки после первого же использования. На invision board сделано именно так. Просто и со вкусом.
О! Кстати, давно хотел спросить, да все как-то забывал.Как у Drupal с опасностью рекурсивного обмена новостями? Не обязательно друг у друга новости тырить. Вполне можно себе представить конструкцию из трех сайтов, когда новость, появившаяся на одном, утаскивается на другой, с него ее утаскивают на третий сайт, а новостями с третьего питается как раз первый.
Это не столь уж невозможная конструкция: ведь оно и логично, что кучка узкоспециализированных сайтов тырят друг у друга новости.
Да, объяснение о диалапе у друпаловских девелоперов многое объясняет Вообще, есть рекомендация в случае глухого диалапа пользовать промежуточный софт, вроде проксей там типа wwwoffle - очень помогает. Я так и делал когда на диалапе сидел - открываем кучу страниц, затем отключаемся и переводим wwwoffle в оффлайн-режим. В этом режиме всё что в него из броузера попало - запоминается в его кеше. А при подключении к сети он все накопленные запросы рассылает по сайтам. Да, блокировка в этом случае будет мешаться, эт точно
Но с JS решение вкусным не назовёшь никак. Вот выключу я у себя в браузере JavaScript и что - нет больше никакой блокировки. А в IB кстати фигово в случае сбоев связи (это даже не только диалапу актуально) - послал сообщение, оно где-то потерялось, ответа нет, кнопка задизеблена В Друпал можно её ещё раз хоть потом ткнуть (вот они дубли ;)) Не, хороший сайт должен без JS работать, а JS только для косметики испльзоваться и исключительно вспомогательных функций. В Друпал это именно так. И проверка ввода должна быть на сервере, а не у клиента.
Насчёт "тырения" новостей. Дык кто ж это запретит? Если сайт выдаёт контент в инет - значит этот контент будут по всякому использовать. RSS в Drupal сделан неотключаемым - пора приучаться, что вебсайт это не обязательно только браузер и только HTML Конечно тырить контент по RSS куда легче, но к счастью пока те кто этим может заняться про RSS обычно ни сном ни духом, т.что некоторое время можно жить спокойно Вообще никто не жаловался. Разве что на к.л. злобном коммерческом сайте могут не захотеть отдавать свои новости "нахаляву" - ну так за деньги можно им это в движке отключить
--
Axel,
www.axel.drupal.ru
1) "Если отключить - нет блокировки."
А ты не отключай.
2) "Послал сообщение, оно потерялось, кнопка задизейблена."
У тебя две кнопки. Ты обе задизейблил?
"В этом режиме всё что в него из броузера попало - запоминается в его кеше. А при подключении к сети он все накопленные запросы рассылает по сайтам."
ОГО!!!
Нехило. А ты ничего не путаешь?
Никогда не слышал про отложенное кэширование записи в приложении к веб-браузингу.
И честно говоря, слабо представляю себе практическую реализацию.
Не путаю. Это гораздо проще чем ты предположил Ведь браузер отправляет на сайт данные - у него есть адрес сервера и запрос, содержащий имена полей формы и данные в них. Представь что этот запрос ты отправил не сразу, а через время. Если форум тебя не отлогинил за это время - то ему пофиг пришёл запрос через 1 минуту или 1 час. Вот прокси это и делает. В состоянии оффлайна он принимает запросы и сообщает, что запрос записан. При переходе в онлайн - ему можно сказать, чтобы он отправил данные из кеша.
Технология не уникальна и реализована подозреваю во многих софтинах. Я пользовал вот эту: http://www.gedanken.demon.co.uk/wwwoffle/ WWW Offline Explorer. Кроме кеширования оно ещё умеет мониторить страницы с заданным интервалом и забирать в кеш новые версии, к кешу можно прикрутить поисковик и сделать себе маленький локальнй интернет - я сначала ht://Dig цеплял, потом mnogosearch, но при постоянном коннекте пришёл к выводу, что гуглом проще А вот для диалапа - вещь незаменимая. Можно несколько броузеров завернуть на прокси и у них будет общий кеш.
--
Axel,
www.axel.drupal.ru
Нет, я не о том, ты не понял.
Попытаюсь объяснить на пальцах.
Есть сайты схожей тематики А, Б и Ц.
А тырит новости с Б, Б тырит новости с Ц, а Ц тырит новости с А (это для простоты, на самом деле все трое тырят новости с обоих конкурентов).
Вопрос: что будет при добавлении новости на сайт А?
У меня только один комментарий: мудаки они все трое.
--
Axel,
www.axel.drupal.ru
В Друпале стандартный агреготор отделен от структуры сайта. Агрегируемые новости - это даже не ноды ...
http://drupal.ru/aggregator
Поэтому, сагрегированные новости нельзя вынести на главную страницу... Расзве что copy/paste.
И агрегировать сагрегированные новости нельзя.
--
USU-Lug http://usu-lug.org.ru
спасибо за развернутый ответ.
> в логах иногда попадаются сообщения о дубликатах
я тоже заметил, не понял только, удаляются они или нет.
> при отправке смотреть ближайшие по номерам ноды
тут скорее по времени смотреть надо.
по поводу аггрегации новостей - мне кажется сайты делятся на 1) производителей контента 2) распространителей контента. когда сайт "подсасывает" новости с другого сайта - он должен брать только уникальные новости. иначе может дойти до абсурда - перекрестной аггрегации.
оффтопик: почему на форуме друпал.ру нет индикатора того, залогинился ли я или нет. уже второй раз начинаю новую тему как "гость", предварительно просканировав страницу в поисках "вы зашли как" или "логиньтесь тут" и не найдя этого.
ВОТ! Это уже теплее.
Там разве есть понятие "собственная новость"/"распространяемая новость"? И разве можно ограничить сбор новостей только первым типом?
такое понятие есть как минимум у меня в голове если вопрос отсеченния одних от других ещё не встал, то рано или поздно он встанет. сейчас же отсекать можно по сайтам - например на ИТАР-ТАСС новости все свои (я так думаю, не проверял), а на Яндекс.Новости - агрегированные.
какой смысл сайту кроме своих новостей показывать чужие? сайт интересен посетителю именно своим контентом. чужие новости можно почитать на чужом сайте (если они интересны пользователю). а свои затеряются среди чужих.
Axel, для эффктивного поиска стоит смотреть в сторону хэшей ...
--
USU-Lug http://usu-lug.org.ru
Я так понял, перед поиском по drupal.ru всегда полезно сперва открыть страничку ht-tp://drupal.ru/cron.php
Кстати, а для Drupal существуют поисковые модули отличные от штатного?
Конечно спасибо тебе, за то что облегчаешь работу системному cronу но друпаловский cron.php не дорабатывает до конца - звать его бесполезно. Я не выяснил пока почему. Модули, которые использую крон - отключал, всё равно в лог пишется - крон не завершил работу. Как-нибудь утащу сайт на локальный комп - разберусь. Пока как-нибудь так, гуглом там и пр. подручными средствами
--
Axel,
www.axel.drupal.ru
Я несколько не это имел ввиду. Просто axel там в алгоритме писал про поиск одинаковых комментов.
А вот завязвть этот поиск на штатную поисковую систему - эта мысль мне не пришла в голову. Правда, она, конечно, не идеаельна...
http://drupal.org/node/16428
http://drupal.org/project/trip_search
--
USU-Lug http://usu-lug.org.ru
А, пардон. Кто о чем, а вшивый о бане. Естественно, искать лучше не тупым сравнением, а хэшированием. Тогда и количество проверяемых на повтор страниц можно увеличить. Скажем, до полусотенки.
Вариант, предельно близкий к идеальному.
> разве кто оплатить захочет такую работу?
твои примерные трудозатраты и стоимость?
Сейчас проверил что сделано в comment.module. Там действительно стоит проверка на дубликаты и она работает, вот только реакцией является лишь запись в лог о дубликате - на сайт он всё равно постится. Разработчики имхо пошутили других объяснений нет В node.module подобные проверки отсутствуют вовсе, долго не искал, кому интересно поковыряйте.
Получаем патчик к comment.module + модуль для проверки нодов (править node.module не будет правильным когда nodeapi есть). Работы тут совсем немного, потестировать только для надёжности. Учитывая общественную полезность такой штуки можно отвлечься за символические 5WMZ. Скажем завтра тогда могу сделать - модуль и патч под 4.5.
--
Axel,
www.axel.drupal.ru
могу предложить эквивалент 5WMZ в Яндекс.Деньгах - устроит? у меня нет вебманей.
дубликаты можно вычислять по баес фильтру взять можно из модуля про спам
Вот это, кстати, правильно. Не глотать сообщения, а выдавать предупреждение с запросом.
Ну и понятно, что под байес должны подпадать сообщения от этого же пользователя и из последних 15-20 отправленных им.
Зачем сложно, когда можно просто? Простое правило: дубликаты идут подряд. Исключений на этом сайте я не видел. Не будет юзер постить один коммент, потом другой, потом опять первый - если только он не спамер. Проверка по тексту двух-трёх ближайших нодов/комментариев данного пользователя эффективна и достаточна.
--
Axel,
www.axel.drupal.ru
Попробую ЯндексДеньговский клиент под wine - если будет работать, то устроит Люди, кто-нибудь ЯндексДеньги под Линукс запускал в Wine? В Webmoney вебинтерфейс есть, а в Яндексе на это почему-то забили.
--
Axel,
www.axel.drupal.ru
должен быть какой-то обменнк
Наверно да, хотя подозреваю, что после обмена такой суммы как 5$ от них мало что останется
--
Axel,
www.axel.drupal.ru
как успехи?
ЯндексДеньги запустились под эмулятором, но глючновато выглядит. Потестить неплохо б для надёжности. Genie, а можешь мне мелкую сумму (какие-нибудь там 0.01$ или сколько минимум там можно передавать) кинуть на кошелёк, понятно будет хоть работает реально он или нет? Сумму можно тогда вычесть из 5$, но просто сразу 5$ если уйдут в никуда это будет жалко А кошелёк я заведу сейчас и номер сообщу.
Блокировку дублей для comment.module тем временем сделал - см. как это работает на drupal.ru. Для нодов модуля не делал пока.
--
Axel,
www.axel.drupal.ru
жду номера кошелька
куда пропал?
Решил не возиться с этим глючным ЯндекДеньги. Клиент под wine работает со странностями и деньги ему в таком виде доверять стрёмно. Раз через Webmoney никак, то лови бесплатно Поправки ниже следует внести в comment.module, чтобы функция comment_post выглядела как ниже:
...пропущено до комментария
// 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
кстати, решение более чем спорное... более того в Drupal 4.4 что-то подобное уже было, когда при редактирование собственного сообщения и совпадения заголовка не было возможности это сообщение добавить...
В 4.3 была блокировка по времени (о чём выше тут обсуждалось). Редактировать свои сообщения оно даёт, это я проверял. Собственно, просто изменил реакцию на событие, а проверка уже делалась в 4.5.2 - реакцией была запись в лог.
--
Axel,
www.axel.drupal.ru
тысячекратный респект и спасибо
Если не заработало - пиши. Но на drupal.ru получилось - работает как надо вроде.
--
Axel,
www.axel.drupal.ru