Как посчитать сумму лайков?

В общем есть один сайт, на котором размещено много кнопок «мне нравится» «Like» и так далее(фейсбук, вконтакте, гугл+, мой мир, одноклассники, twitter).

Нужно в автоматически считать сумму выставленных лайков и твитов.

Как это сделать, если такое возможно?

И что делать, кроме как вешаться, если не возможно? :D
  • Вопрос задан
  • 20507 просмотров
Пригласить эксперта
Ответы на вопрос 8
@wrongangel Автор вопроса
Интересно, если разберусь, стоит об этом статью писать?
Ответ написан
Комментировать


var services = {
	facebook: {
		counterUrl: 'http://graph.facebook.com/fql?q=SELECT+total_count+FROM+link_stat+WHERE+url%3D%22{url}%22&callback=?',
		convertNumber: function(data) {
			return data.data[0].total_count;
		}
	},
	twitter: {
		counterUrl: 'http://urls.api.twitter.com/1/urls/count.json?url={url}&callback=?',
		convertNumber: function(data) {
			return data.count;
		}
	},
	vkontakte: {
		counterUrl: 'http://vkontakte.ru/share.php?act=count&url={url}&index={index}',
		counter: function(jsonUrl, deferred) {
			var options = services.vkontakte;
			if (!options._) {
				options._ = [];
				if (!window.VK) window.VK = {};
				window.VK.Share = {
					count: function(idx, number) {
						options._[idx].resolve(number);
					}
				};
			}

			var index = options._.length;
			options._.push(deferred);
			$.ajax({
				url: makeUrl(jsonUrl, {index: index}),
				dataType: 'jsonp'
			});
		}
	}
};

/**
 * Counters manager
 */
var counters = {
	promises: {},
	fetch: function(service, url) {
		if (!counters.promises[service]) counters.promises[service] = {};
		var servicePromises = counters.promises[service];

		if (servicePromises[url]) {
			return servicePromises[url];
		}
		else {
			var options = services[service],
				deferred = $.Deferred(),
				jsonUrl = options.counterUrl && makeUrl(options.counterUrl, {url: url});

			if ($.isFunction(options.counter)) {
				options.counter(jsonUrl, deferred);
			}
			else if (options.counterUrl) {
				$.getJSON(jsonUrl)
					.done(function(data) {
						try {
							var number = data;
							if ($.isFunction(options.convertNumber)) {
								number = options.convertNumber(data);
							}
							deferred.resolve(number);
						}
						catch (e) {
							deferred.reject(e);
						}
					});
			}

			servicePromises[url] = deferred.promise();
			return servicePromises[url];
		}
	}
};

function makeUrl(url, context) {
	return template(url, context, encodeURIComponent);
}

function template(tmpl, context, filter) {
	return tmpl.replace(/\{([^\}]+)\}/g, function(m, key) {
		// If key don't exists in the context we should keep template tag as is
		return key in context ? (filter ? filter(context[key]) : context[key]) : m;
	});
}
Запуск:

var url = 'http://habrahabr.ru';
$.each(services, function(service) {
	counters.fetch(service, url).done(function(number) {
		number = parseInt(number, 10);
		if (!number) number = 0;
		console.log(number);
	});
});

Ответ написан
Комментировать
Melanitsky
@Melanitsky
Я реализовал это 2 способами:
1) Это демон на node.js который постоянно дергал API контакта фейсбука твитера и гугл+ и тянул количество лайков. Минусов несколько:
— считает примерно 50-70 итемов в минуту. Что довольно медленно
— вконтакте есть ограничение на количество реквестов к апи с одного айпи. И каждые несколько минут демон падает в ступор. Ограничение идет на количество реквестов в 5 минут.

2) Второй вариант — это считать их на клиенте. Если страница регулярно просматривается, то можно собирать количество клиентом (да, именно в браузере собрать количество лаков, у всех есть callback), и отправлять результат на сервак.
Минусы:
— работает только в том случае если страницы регулярно просматриваются
— можно легко запостить любую дрянь на сервак =(
Ответ написан
getnaked
@getnaked
Был Share Count JS. Официальный сайт прикрыли, но копию все еще можно найти. Умел считать Digg, Twitter, Facebook и Delicious.

image
Ответ написан
Комментировать
platon_fedorovich
@platon_fedorovich
Люблю общение на IT-тематику
Обратите внимание на этот проект (выложен на гитхабе, код открытый): https://github.com/enjoyiacm/goodshare.js. Берёт все показатели счётчиков из самих соц. сетей (через API), поэтому данные всегда актуальные. Если хорошо знаете jQuery, то без труда сможете дописать к нему функцию, которая будет суммировать показатели из счётчиков нужных вам соц. сетей и выводить общий каунтер.

Лично я — всё время их использую из-за того, что многие сервисы (типа AddThis или pluso) не позволяют сделать уникальный дизайн для каждой кнопки и долго грузятся (иногда с ошибками). Ну и никакого трекинга и рекламных ссылок, естественно, нет у goodshare.js.
Ответ написан
Комментировать
vermilion1
@vermilion1
Каждый сервис по отдельности должен отдавать количество лайков. иначе никак из-за кросдомена.
Facebook, например — stackoverflow.com/questions/4877919/get-facebook-like-count-for-every-page-on-my-domain
Ответ написан
fear86
@fear86
Developer
Ну или отправить бота по всем страницам, пусть считает :)
Ответ написан
buxley
@buxley
Как вариант можно использовать www.addthis.com/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы