Представляю Вашему вниманию мою очередную попытку сделать мир лучше – проект «Thanks Button«.
Что это
В двух словах – это кнопка, нажимая на которую, посетитель говорит «спасибо» автору страницы. Такая кнопка будет полезна прежде всего людям, которые что-то созидают в Интернете. Не важно что – будь то блог, запись на форуме или собственный сайт. Если Вы один из таких людей, то знаете, что часто простое «спасибо» способно существенно повысить настроение и придать сил, чтобы продолжить дело. Большинству же посетителей сайтов часто бывает настолько сложно выразить благодарность автору (из-за спам фильтров, регистраций и т.п.), что они в итоге отказываются от этой идеи. Мой проект призван решить эту проблему – теперь, чтобы сказать спасибо, посетителю достаточно просто нажать на кнопку. Больше об этом на странице About проекта.
Концепция
Несмотря на кажущуюся простоту за ней скрывается оригинальная концепция. На многих сайтах существует возможность проголосовать за содержания, ставя плюс или минус. Оличие этой кнопки в том, что можно говорить только «Спасибо». Во-первых, спасибо гораздо более понятно обычному человеку, чем абстрактный плюс или минус, так как оно выражает вполне определенное чувство благодарности. Во-вторых, Интернет (как минимум Рунет) устроен так, что на 1 человека, ставящего плюс, приходится 50, которые поставят минус. Просто из-за своих личных проблем. Я думаю, негатива и так хватает в нашей жизни, поэтому в этом проекте разрешены только положительные эмоции.
Следующий момент – сознательное ограничение количества информации. Сделано это, во-первых, для борьбы со спамом – проект просто не интересен спамерам, так как не позволяет реализовать ни одну их цель. Во-вторых, чтобы сделать его как можно проще в использовании. И чтобы не забирать информацию, например, комментарии, у авторов.
Ну и наконец, никакой регистрации, чтобы не забивать голову лишней информацией типа логинов и паролей. Просто вводите адрес своей страницы или любой другой идентификатор (свою фамилию?) и получаете код кнопки. Все.
Реализация
От момента, когда мне пришла в голову такая идея, до сегодняшнего дня прошел почти месяц, а непосредственно на разработку сайта было потрачено около 16-20 часов. К сожалению, у меня не так много свободного времени, как хотелось бы.
Работает сайт на Google App Engine (спасибо Google), что позволяет теоретически держать огромную нагрузку – миллионы показов в день (бесплатно). Если проект станет популярным эти миллионы ему понадобятся, так как кнопка должна отображаться на множестве других сайтов. Если этого будет мало – уже существует возможность докупать мощности у Гугл.
Я изначально старался оптимизировать код, в частности, впервые применил memcache – все запросы по отображению кнопок жестко кэшируются. Программировать было достаточно интересно, пришлось даже поломать голову над некоторыми задачами. Например, appengine не позволяет динамически генерировать картинки. Google app engine, python, django – очень приятная и мощная платформа (хотя поначалу я не оценил ее возможности по достоинству).
Планы
Дальнейшее развитие будет идти по мере необходимости. Например, за 2 дня использования я уже понял, что неплохо бы иметь RSS для голосов, фильтровать клики на кнопку по User Agent, чтобы не учитывались пингбэки и поисковые роботы, и сделать поиск результатов по имени ресурса. Если проект вам понравится и вы будете им пользоваться, можете писать мне обо всех своих идеях и потребностях, буду рад.
Ну и наконец, если вдруг вы хотите сказать мне спасибо за него, то нажимайте эту кнопку:
А чтобы получить такую же – посетите сайт http://www.thanksbutton.net

Клёвая идея. И хорошая реализация. Только несколько пожеланий:
1) сделать русскую версию
и версию без графики (только html)
2) по умолчанию сделать Javascript-кнопочку, без перенаправления на другую страницу, у кого Javascript отключен, показывать как сейчас; переходить на другой сайт, а потом ещё и читать много букв, чтобы проголосовать — это слишком
3) IP-адреса не показывать, можно показывать флажки стран, откуда голосовали, но первые три цифры IP-адреса — довольно много
Вопросы:
Т.е. если я помещу кнопку в шаблон поста, то будет ли счётчик общий по всему блогу или отдельные страницы будут считаться отдельно?
Если будет считаться отдельно по каждому Referer, то как быть с постами на главной? Посты там меняются, а счётчик нет.
Как сделал динамическую генерацию картинок? Нашёл Pure-Python библиотечку? Писал PNG самостоятельно?
Будут ли исходники?
Сергей, спасибо за отзыв!
Несколько комментариев:
1) Русская версия – обязательно, я уже думал об этом. Отдельная версия без графики – вряд ли. Там ее минимум, ну а браузеры позволяют ее отключать всем желающим и так.
2) Javascript версия – хорошая идея. Я просто в первую очередь хотел сделать универсальный механизм работающий везде. На том же wordpress.com и livejournal.com пользовательские javascriptы запрещены по соображениям безопасности.
Что касается чтения много букв – это одна из самых сложных дизайнерских задач в этом проекте. Изначально +1 голос прибавлялся сразу при нажатии на кнопку. Потестировав немного я решил сделать промежуточную страницу с вариантами выбора. Многие нажимают на кнопку не потому что хотят сказать спасибо, а из интереса «а что там». Поэтому промежуточная страница уменьшает шум в результатах. Было бы здорово еще на кнопочке написать, что нажимая на нее вы говорите спасибо, но кнопочка слишком маленькая. В общем я пока не пришел к окончательному решению. Давать автору возможност выбора поведения кнопки (типа Advanced settings) я могу, но это означает, что я перекладываю решение проблемы на пользователя. Интересная задача и я с удовольствием ломаю над ней голову.
3) Да, была идея показывать страны, но пока что я не знаю простого и элегантного способа получать информацию о стране по IP в app engine. Использование сторонних сервисов очень некрасиво с точки зрения архитектуры кода, кроме того это существенно увеличит время генерации страницы, а это недопустимо в высоконагруженных приложениях. В общем – тоже хорошая задача на подумать.
Вопросы:
Ты можешь сам выбирать. Можешь сделать общий счетчик, можешь генерировать отдельный счетчик для каждого поста, для этого даже не надо заходить на мой сайт достаточно просто вставлять картинку с этим адресом: http://www.thanksbutton.net/btn/default/***, где звездочки – это адрес твоего поста или блога. В принципе там может быть любой цифро-буквенный идентификатор, не обязательно адрес. Просто адрес самый надеждный способ доказать и защитить принадлежность кнопки. Запись в БД создается при первом показе картинки. И соответственно такой же идентификатор надо использовать в ссылке.
Referer вообще не учитывается. Точнее учитывается но только для генерации ссылки «Верни меня обратно» в случае если у человека отключен джаваскрипт (в этом случае обратная ссылка подменяется на back()).
Да, нашел библиотечку и немного ее модифицировал: http://the.taoofmac.com/space/Projects/PNGCanvas
Вряд ли. Не потому что там есть секреты или «интеллектуальная собственность». Все 4 основные функции содержат по 15-20 строк кода, ничего интересного. Все остальное – просто оболочка django.
Надеюсь, у меня будет достаточно свободного времени, чтобы заниматься этим сайтом дальше
Понятно.
1) По поводу промежуточной страницы. А если сделать
ненажатая кнопка: [сказать спасибо]
кнопка после нажатия: [42 сказали спасибо] или [42 поблагодарили]
Тогда понятно, что нажатие на кнопку — голосование. Когда нажимаешь на [42 спасиба] можно ожидать чего угодно.
2) В noscript версии можно сделать страницу на thanksbutton.net с большим крупным объявлением «ваш голос учтён», и в течение секунды, например, редиректом обратно
3) Да, если будешь делать русскую версию, придётся подумать о падежах.
4) Жалко, что не придуман работающий автоматический механизм определения заметки, к которой относится кнопка, который бы работал во всех блогах.
5) На CanvasPNG посмотрю. Однако наверное придётся писать самому. Там CC Attribution-NonCommercial-NoDerivs. Возможно http://trac.browsershots.org/browser/trunk/pypng/lib/png.py попробую. А в PNG GAE вроде сама умеет конвертировать.
1) Хорошая идея. Но это значительное усложнение всего кода и придется куки пользователю устанавливать, что не очень хочется делать. И кнопку надо делать большего размера, чтобы такую длинную надпись вместить. Надо думать.
2,3) согласен, но голос можно учитывать только если из самой кнопки сразу ясно, что происходит
4) Не уверен, что это в принципе возможно.
5) Там все достаточно просто, можно самому написать такую библиотеку. PNG как выяснилось достаточно простой формат
1) http://tinyurl.com/thanks-png
4) у меня тоже нет идеи, как это можно в принципе сделать
5) да, Эрик Раймонд в The Art of Unix Programming тоже его хвалил за ясность спецификации; я недавно PNM из шел-скрипта генерировал, он вообще простой, но для веба не очень подходящий.
1)
Действительно, лучше тысячи слов!!! Хорошая идея.