Если не предусмотрена регистрация (а иначе не понятно в чем проблема), а постить может кто угодно, то вместе с сообщением отсылаем
https://github.com/Valve/fingerprintjs2
Запоминаем в базу слепок пользователя с временем публикации.
При попытке публикации проверяем наличие слепка и время последнего постинга.
Периодически по крону удаляем из базы старые слепки, дабы не забивать базу.
Чтобы улучшить юзабилити, можно также спрятать форму публикации. Проще всего это сделать через куки. При постинге ставим пользователю флаг куку со сроком протухания в 3 дня. На сервере в зависимости от наличия куки выводим форму публикации или нет.
Куки легко удалить поэтому полностью нельзя полагаться на них при постинге (годится только для скрытия формы у порядочных пользователей) и требуется дополнительно использовать слепки.