X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

Открыть тему
Тема закрыта
> Красивые социальные кнопки для вашего сайта, На основе нестандартных скриптов
by_roXe
by_roXe
Topic Starter сообщение 14.1.2014, 14:01; Ответить: by_roXe
Сообщение #1


Завсегдатай
*****

Группа: Active User
Сообщений: 511
Регистрация: 1.6.2012
Поблагодарили: 100 раз
Репутация:   18  


Есть десятки различных сервисов по генерации социальных кнопок для своего сайта, это Share42, Pluso и т.д. Описывать их все нет смысла.

Поделюсь со всеми инструкциями по установке нестандартных симпатичных кнопок "Поделиться" на свой сайт. Скрипты эти не мои, я лишь "нашел" их в свое время... Технически я не особо владею информацией, но проверял работоспособность на своих проектах.

1. Кнопки на основе скрипта http://sapegin.github.io/social-likes/. По этой ссылке можно найти вот такие кнопочки (инструкции там прилагаются):



Я когда-то нашел более красивый вариант реализации кнопок на основе этого скрипта. Выглядят так:



Установка:

- Код html (его вставляете там, где ходите видеть кнопки):
Развернуть/Свернуть

CODE

<ul class="social-likes">
<li class="vkontakte" title="Опубликовать ссылку во Вконтакте">Нравится</li>
<li class="facebook" title="Опубликовать ссылку на Фейсбуке">Нравится</li>
<li class="twitter" title="Опубликовать ссылку в Твиттере">Твитнуть</li>
<li class="mailru" title="Опубликовать ссылку в Моём мире">Нравится</li>
<li class="odnoklassniki" title="Опубликовать ссылку в Одноклассниках">Класс!</li>
</ul>


- Код css (стили оформления кнопок, их необходимо подключить к вашему сайту, или добавить в существующий файл стилей .css)
Подключается такой строчкой между тегами head:
Развернуть/Свернуть
CODE
<link href="social.css" rel="stylesheet">

Сам код:
Развернуть/Свернуть

CODE

.social-likes {

}

.social-likes>li,
.social-likes__widget {
position: relative;
height:26px;
display: inline-block;
font-size: 11px;
margin: 0 15px 0 0;
}
.social-likes__widget:last-child {
margin-right: 0;
}
.social-likes__button {
display: inline-block;
height: 24px;
line-height: 25px;
padding: 0 5px 0 4px;
color: #fff;
border-radius: 3px;
border: 1px solid;
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), inset 0 1px 0 rgba(255,255,255,.4);
cursor: pointer;
}
.social-likes__button:hover {
box-shadow: 0 1px 3px rgba(0, 0, 0, .25), inset 0 1px 0 rgba(255,255,255,.4);
}
.social-likes__button_vkontakte {
border-color: #0d335c;
background: #6d8eb2;
background-image: -webkit-linear-gradient(top, #6d8eb2, #426995);
background-image: -o-linear-gradient(top, #6d8eb2, #426995);
background-image: -moz-linear-gradient(top, #6d8eb2, #426995);
background-image: -ms-linear-gradient(top, #6d8eb2, #426995);
background-image: linear-gradient(top, #6d8eb2, #426995);
}
.social-likes__button_vkontakte:hover {
background: #426995;
}
.social-likes__button_facebook {
border-color: #14367c;
background: #6c88c1;
background-image: -webkit-linear-gradient(top, #6c88c1, #3559a4);
background-image: -o-linear-gradient(top, #6c88c1, #3559a4);
background-image: -moz-linear-gradient(top, #6c88c1, #3559a4);
background-image: -ms-linear-gradient(top, #6c88c1, #3559a4);
background-image: linear-gradient(top, #6c88c1, #3559a4);
}
.social-likes__button_facebook:hover {
background: #3559a4;
}
.social-likes__button_twitter {
border-color: #013b51;
background: #09acec;
background-image: -webkit-linear-gradient(top, #09acec, #2f98c2);
background-image: -o-linear-gradient(top, #09acec, #2f98c2);
background-image: -moz-linear-gradient(top, #09acec, #2f98c2);
background-image: -ms-linear-gradient(top, #09acec, #2f98c2);
background-image: linear-gradient(top, #09acec, #2f98c2);
}
.social-likes__button_twitter:hover {
background: #2f98c2;
}
.social-likes__button_mailru {
border-color: #022c54;
background: #206bb3;
background-image: -webkit-linear-gradient(top, #206bb3, #073e72);
background-image: -o-linear-gradient(top, #206bb3, #073e72);
background-image: -moz-linear-gradient(top, #206bb3, #073e72);
background-image: -ms-linear-gradient(top, #206bb3, #073e72);
background-image: linear-gradient(top, #206bb3, #073e72);
}
.social-likes__button_mailru:hover {
background: #073e72;
}
.social-likes__button_odnoklassniki {
border-color: #502001;
background: #fc9946;
background-image: -webkit-linear-gradient(top, #fc9946, #f57a23);
background-image: -o-linear-gradient(top, #fc9946, #f57a23);
background-image: -moz-linear-gradient(top, #fc9946, #f57a23);
background-image: -ms-linear-gradient(top, #fc9946, #f57a23);
background-image: linear-gradient(top, #fc9946, #f57a23);
}
.social-likes__button_odnoklassniki:hover {
background: #f57a23;
}

.social-likes__icon {
display: inline-block;
vertical-align: middle;
margin: -1px 3px 0 0;
width: 18px;
height: 16px;
background: url(social-likes.png) no-repeat;
}
.social-likes__icon_facebook {
background-position: 0 -16px;
}
.social-likes__icon_twitter {
background-position: 0 -32px;
}
.social-likes__icon_mailru {
background-position: 0 -48px;
}
.social-likes__icon_odnoklassniki {
background-position: 0 -64px;
}

.social-likes__counter {
position:relative;
margin: 0 0 0 5px;
padding:0 5px;
display: inline-block;
height: 22px;
line-height: 23px;
font-weight:normal;
color:#262626;
background: #efefef;
border: 1px solid #000;
border-radius: 3px;
}
.social-likes__counter:before,
.social-likes__counter:after {
content:"";
position:absolute;
}
.social-likes__counter:before {
top:6px;
left:-5px;
border:5px inset transparent;
border-left:0;
border-right:5px solid;
border-right-color:inherit;
}
.social-likes__counter:after {
top:7px;
left:-4px;
border:4px inset transparent;
border-left:0;
border-right: 4px solid #efefef;
}


.m-social_likes-short {

}
.m-social_likes-short .social-likes > li,
.m-social_likes-short .social-likes__widget {
margin: 0 5px 0 0;
}
.m-social_likes-short .social-likes__widget:last-child {
margin-right: 0;
}
.m-social_likes-short .social-likes__icon {
margin: -2px -3px 0 0;
}

.m-social_likes-without_counter {

}
.m-social_likes-without_counter .social-likes__counter {
display: none;
}

.m-social_likes-light {

}
.m-social_likes-light .social-likes__button_vkontakte {
border-color: #0f6d91;
}
.m-social_likes-light .social-likes__button_facebook {
border-color: #264483;
}
.m-social_likes-light .social-likes__button_twitter {
border-color: #0f6d91;
}
.m-social_likes-light .social-likes__button_mailru {
border-color: #264483;
}
.m-social_likes-light .social-likes__button_odnoklassniki {
border-color: #d45400;
}

.m-social_likes-light .social-likes__counter {
background: #fff;
border-color: #afafaf;
}

.m-social_likes-light .social-likes__counter:after {
border-right-color: #fff;
}

.m-social_likes-vertical {

}

.m-social_likes-vertical > li,
.m-social_likes-vertical .social-likes__widget {
display: block;
margin: 0 0 10px 0;
}


- Скрипт js (его необходимо подключить к вашему сайту, или добавить в существующий файл .js)
Подключается такой строчкой (вставляется после открывающего тега body):
Развернуть/Свернуть
CODE
<script type="text/javascript" src="social.js"></script>

Сам код:
Развернуть/Свернуть

CODE

/**
* Social Likes
* http://sapegin.github.com/social-likes
*
* Sharing buttons for Russian and worldwide social networks.
*
* @requires jQuery
* @author Artem Sapegin
* @copyright 2012 Artem Sapegin (sapegin.me)
* @license MIT
*/

/*global define:false, socialLikesButtons:false */

(function (factory) { // Try to register as an anonymous AMD module
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else {
factory(jQuery);
}
}(function ($) { 'use strict';

var prefix = 'social-likes__',
fadeSpeed = 'fast';


/**
* Buttons
*/
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;
},
popupUrl: 'http://www.facebook.com/sharer/sharer.php?u={url}',
popupWidth: 600,
popupHeight: 500
},
twitter: {
counterUrl: 'http://urls.api.twitter.com/1/urls/count.json?url={url}&callback=?',
convertNumber: function(data) {
return data.count;
},
popupUrl: 'http://twitter.com/intent/tweet?url={url}&text={title}',
popupWidth: 600,
popupHeight: 450,
click: function() {
// Add colon to improve readability
if (!/[\.:\-–—]\s*$/.test(this.options.pageTitle)) this.options.pageTitle += ':';
return true;
}
},
mailru: {
counterUrl: 'http://connect.mail.ru/share_count?url_list={url}&callback=1&func=?',
convertNumber: function(data) {
for (var url in data) if (data.hasOwnProperty(url)) {
return data.shares;
}
},
popupUrl: 'http://connect.mail.ru/share?share_url={url}&title={title}',
popupWidth: 550,
popupHeight: 360
},
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'
});
},
popupUrl: 'http://vk.com/share.php?url={url}&title={title}',
popupWidth: 550,
popupHeight: 330
},
odnoklassniki: {
counterUrl: 'http://www.odnoklassniki.ru/dk?st.cmd=extLike&ref={url}&uid={index}',
counter: function(jsonUrl, deferred) {
var options = services.odnoklassniki;
if (!options._) {
options._ = [];
if (!window.ODKL) window.ODKL = {};
window.ODKL.updateCount = function(idx, number) {
options._[idx].resolve(number);
};
}

var index = options._.length;
options._.push(deferred);
$.ajax({
url: makeUrl(jsonUrl, {index: index}),
dataType: 'jsonp'
});
},
popupUrl: 'http://www.odnoklassniki.ru/dk?st.cmd=addShare&st._surl={url}',
popupWidth: 550,
popupHeight: 360
},
plusone: {
popupUrl: 'https://plus.google.com/share?url={url}',
popupWidth: 700,
popupHeight: 500
}
};


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

if (servicePromises[url]) {
return servicePromises[url];
}
else {
var options = $.extend({}, services[service], extraOptions),
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];
}
}
};


/**
* jQuery plugin
*/
$.fn.socialLikes = function() {
return this.each(function() {
new SocialLikes($(this));
});
};


function SocialLikes(container) {
this.container = container;
this.init();
}

SocialLikes.prototype = {
optionsMap: {
pageUrl: {
attr: 'url',
defaultValue: function() { return window.location.href.replace(window.location.hash, ''); }
},
pageTitle: {
attr: 'title',
defaultValue: function() { return document.title; }
},
pageHtml: {
attr: 'html',
defaultValue: function() { return '<a href="' + this.options.pageUrl + '">' + this.options.pageTitle + '</a>'; }
},
pageCounters: {
attr: 'counters',
defaultValue: 'yes',
convert: function(value) { return value === 'yes'; }
}
},
init: function() {
this.readOptions();
this.single = this.container.hasClass('social-likes_single');

this.initUserButtons();

if (this.single) {
this.makeSingleButton();
this.container.on('counter.social-likes', $.proxy(this.updateCounter, this));
}

var options = this.options;
this.container.find('li').each(function() {
new Button($(this), options);
});
},
readOptions: function() {
this.options = {};
for (var key in this.optionsMap) {
var option = this.optionsMap[key];
this.options[key] = this.container.data(option.attr) ||
($.isFunction(option.defaultValue) ? $.proxy(option.defaultValue, this)() : option.defaultValue);
if ($.isFunction(option.convert))
this.options[key] = option.convert(this.options[key]);
}
},
initUserButtons: function() {
if (!this.userButtonInited && window.socialLikesButtons) {
$.extend(services, socialLikesButtons);
}
this.userButtonInited = true;
},
makeSingleButton: function() {
var container = this.container;
container.addClass('social-likes_vertical');
container.wrap($('<div>', {'class': 'social-likes_single-w'}));
var wrapper = container.parent();

var defaultLeft = parseInt(container.css('left'), 10),
defaultTop = parseInt(container.css('top'), 10);

container.hide();

var button = $('<div>', {
'class': getElementClassNames('button', 'single'),
'text': container.data('single-title') || 'Share'
});
button.prepend($('<span>', {'class': getElementClassNames('icon', 'single')}));
wrapper.append(button);

var close = $('<li>', {
'class': prefix + 'close',
'html': '&times;'
});
container.append(close);

this.number = 0;

button.click(function() {
container.css({ left: defaultLeft, top: defaultTop });
showInViewport(container, 20);
closeOnClick(container);

return false;
});
close.click(function() {
container.fadeOut(fadeSpeed);
});

this.wrapper = wrapper;
},
updateCounter: function(e, number) {
if (!number) return;

this.number += number;
this.getCounterElem().text(this.number);
},
getCounterElem: function() {
var counterElem = this.wrapper.find('.' + prefix + 'counter_single');
if (!counterElem.length) {
counterElem = $('<span>', {
'class': getElementClassNames('counter', 'single')
});
this.wrapper.append(counterElem);
}
return counterElem;
}
};


function Button(widget, options) {
this.widget = widget;
this.options = $.extend({}, options);
this.detectService();
if (this.service) {
this.init();
}
}

Button.prototype = {
init: function() {
this.detectParams();
this.initHtml();

if (this.options.pageCounters) {
if (this.options.counterNumber) {
this.updateCounter(this.options.counterNumber);
}
else {
var extraOptions = this.options.counterUrl ? { counterUrl: this.options.counterUrl } : {};
counters.fetch(this.service, this.options.pageUrl, extraOptions)
.done($.proxy(this.updateCounter, this));
}
}
},

detectService: function() {
var classes = this.widget[0].classList || this.widget[0].className.split(' ');
for (var classIdx = 0; classIdx < classes.length; classIdx++) {
var cls = classes[classIdx];
if (services[cls]) {
this.service = cls;
$.extend(this.options, services[cls]);
return;
}
}
},

detectParams: function() {
// Custom page counter URL or number
var counter = this.widget.data('counter');
if (counter) {
var number = parseInt(counter, 10);
if (isNaN(number))
this.options.counterUrl = counter;
else
this.options.counterNumber = number;
}

var customTitle = this.widget.data('title');
if (customTitle)
this.options.pageTitle = customTitle;

var customUrl = this.widget.data('url');
if (customUrl)
this.options.pageUrl = customUrl;
},

initHtml: function() {
var options = this.options,
widget = this.widget;
var isLink = !!options.clickUrl;

widget.removeClass(this.service);
widget.addClass(this.getElementClassNames('widget'));

// Old initialization HTML
var a = widget.find('a');
if (a.length) {
this.cloneDataAttrs(a, widget);
}

// Button
var button = $(isLink ? '<a>' : '<span>', {
'class': this.getElementClassNames('button'),
'text': widget.text()
});
if (isLink) {
var url = makeUrl(options.clickUrl, {
url: options.pageUrl,
title: options.pageTitle
});
button.attr('href', url);
}
else {
button.click($.proxy(this.click, this));
}

// Icon
button.prepend($('<span>', {'class': this.getElementClassNames('icon')}));

widget.empty().append(button);
this.button = button;
},

cloneDataAttrs: function(source, destination) {
var data = source.data();
for (var key in data) if (data.hasOwnProperty(key)) {
destination.data(key, data[key]);
}
},

getElementClassNames: function(elem) {
return getElementClassNames(elem, this.service);
},

updateCounter: function(number) {
number = parseInt(number, 10);
if (!number) return;

var counterElem = $('<span>', {
'class': this.getElementClassNames('counter'),
'text': number
});
this.widget.append(counterElem);

this.widget.trigger('counter.social-likes', number);
},

click: function(e) {
var options = this.options,
process = true;
if ($.isFunction(options.click)) {
process = options.click.call(this, e);
}
if (process) {
var url = makeUrl(options.popupUrl, {
url: options.pageUrl,
title: options.pageTitle
});
url = this.addAdditionalParamsToUrl(url);
this.openPopup(url, {
width: options.popupWidth,
height: options.popupHeight
});
}
return false;
},

addAdditionalParamsToUrl: function(url) {
var params = $.param(this.widget.data());
if (!params) return url;
var glue = url.indexOf('?') === -1 ? '?' : '&';
return url + glue + params;
},

openPopup: function(url, params) {
var left = Math.round(screen.width/2 - params.width/2),
top = 0;
if (screen.height > params.height) {
top = Math.round(screen.height/3 - params.height/2);
}

var win = window.open(url, 'sl_' + this.service, 'left=' + left + ',top=' + top + ',' +
'width=' + params.width + ',height=' + params.height + ',personalbar=0,toolbar=0,scrollbars=1,resizable=1');
if (win) {
win.focus();
} else {
location.href = url;
}
}
};


/**
* Helpers
*/

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;
});
}

function getElementClassNames(elem, mod) {
var cls = prefix + elem;
return cls + ' ' + cls + '_' + mod;
}

function closeOnClick(elem) {
function handler(e) {
if ((e.type === 'keydown' && e.which !== 27) || $(e.target).closest(elem).length) return;
elem.fadeOut(fadeSpeed);
doc.off(events, handler);
}
var doc = $(document),
events = 'click touchstart keydown';
doc.on(events, handler);
}

function showInViewport(elem, offset) {
if (document.documentElement.getBoundingClientRect) {
var left = parseInt(elem.css('left'), 10),
top = parseInt(elem.css('top'), 10);
elem.css('visibility', 'hidden').show();

var rect = elem[0].getBoundingClientRect();
if (rect.left < offset)
elem.css('left', offset - rect.left + left);
else if (rect.right > window.innerWidth - offset)
elem.css('left', window.innerWidth - rect.right - offset + left);

if (rect.top < offset)
elem.css('top', offset - rect.top + top);
else if (rect.bottom > window.innerHeight - offset)
elem.css('top', window.innerHeight - rect.bottom - offset + top);

elem.hide().css('visibility', 'visible');
}
elem.fadeIn(fadeSpeed);
}


/**
* Auto initialization
*/
$(function() {
$('.social-likes').socialLikes();
});

}));


- Картинка для кнопок (ее нужно будет переименовать в social-likes.png)

- Также необходимо подключить к сайту следующий файл jquery (если не подключен, вставляется между тегами head):
Развернуть/Свернуть
CODE
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>


Для этих кнопок все. Не забывайте проверить пути подключения файлов. Также прилагаю рабочую сборку html странички с этими кнопками со всеми подключенными файлами: [url="http://yadi.sk/d/JOtdpnxjG2qUo"]http://yadi.sk/d/JOtdpnxjG2qUo

478.gif Продолжение следует...
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
iodjin
iodjin
сообщение 14.1.2014, 14:37; Ответить: iodjin
Сообщение #2


Завсегдатай
*****

Группа: Active User
Сообщений: 694
Регистрация: 19.8.2012
Поблагодарили: 202 раза
Репутация:   27  


Полезно, благодарю, но чем вас, все-таки, тот же Share42 не устроил?
Как по мне, так там есть все, что нужно + установка лично у меня занимает полторы минуты.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
by_roXe
by_roXe
Topic Starter сообщение 14.1.2014, 15:13; Ответить: by_roXe
Сообщение #3


Завсегдатай
*****

Группа: Active User
Сообщений: 511
Регистрация: 1.6.2012
Поблагодарили: 100 раз
Репутация:   18  


iodjin, Наличие счетчика на кнопках для меня приоритет + share42 уже везде где только можно)

2. Итак... теперь расскажу как установить еще более красивые и динамичные кнопки "Поделиться"...



Оценить всю "офигенность" этих кнопок можно тут: http://roxe.by/social2/index.html

При наведении на кнопку она плавно "разворачивается", там указано кол-во поделившихся.

Коды всех файлов очень объемные, поэтому просто качаем их по ссылке ниже...

Собранная html страничка с подключенными кнопками и всеми файлами:
http://yadi.sk/d/sJofpZ8GG2wKi

478.gif Продолжение следует...

3. Тоже очень красивые кнопки от Яндекса (но не те стандартные....). Также это одни из самых простых в установке кнопочки..

Выглядят так:



Используются на Яндекс.Островах внизу http://beta.yandex.ru/promo

- Код html (тут вписаны данные Яндекса, вы можете подставить свои или удалить их если код будет выводится на разных страницах)
Развернуть/Свернуть
CODE
<div class="beach__likes" onmouseup="window.reachGoal("share")">
<div class="likes yashare-auto-init" data-yashareL10n="ru" data-yashareLink="http://beta.yandex.ru" data-yashareTitle="Острова Яндекса" data-yashareDescription="Новая поисковая платформа появится в июле. Подробности и запись на предпремьеру — за кликом." data-yashareImage="//yandex.st/search_islands_www/0.2.19/i/islands.png" data-yashareQuickServices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yashareTheme="counter" data-yashareType="big">
</div>
</div>


- Подключаем js (стили css вроде там же зашиты)
Развернуть/Свернуть
CODE
<script type="text/javascript" src="cnt.share.js"></script>


Все файлы + необходимые картинки качаем тут: http://yadi.sk/d/4ZPReTU-G39aG

Сообщение отредактировал by_roXe - 14.1.2014, 14:42
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Чем сжимать картинки для сайта без потери качества
1st-finstep.ru - Заработок в сети и методы продвижения сайта
16 komarik_vlad 1689 Вчера, 20:11
автор: komarik_vlad
Горячая тема (нет новых ответов) Leongram - бесплатная программа для продвижения в Instagram
91 DeOne 18373 Вчера, 19:27
автор: DeOne
Горячая тема (нет новых ответов) ВНИМАНИЕ: Тема имеет прикрепленные файлыПишу тексты для всех и каждого. Цены не кусаются, качество не хромает.
Единственное правило: клиент всегда доволен.
121 Hellnar 50339 Вчера, 15:57
автор: Hellnar
Открытая тема (нет новых ответов) Бот для комплексной автоматической рассылки Whatsapp
Бот для комплексной автоматической рассылки Whatsapp
3 danger22 601 Вчера, 8:30
автор: danger22
Открытая тема (нет новых ответов) Нужен шаблон сайта. Джумла. игры
1 pix87 506 16.12.2017, 20:54
автор: Yepperoni


 



RSS Текстовая версия Сейчас: 18.12.2017, 7:58
Дизайн