Vk client id список

We have a lot to share in today’s longread: we’ll retrieve data on ad campaigns from Vkontakte (widely popular social network in Russia and CIS countries) and compare them to Google Analytics data in Redash. This time we don’t need to create a server, as our data will be transferred to Google Docs via Google Sheets API.

Getting an Access Token
We need to create an app to receive our access token. Follow this link https://vk.com/apps?act=manage and click “Create app” on the developer’s page. Choose a name for your app and check it as a “Standalone app”. Then, click Settings in the left menu and save your app ID.

More details on access tokens can be found here: “Getting an access token”

https://oauth.vk.com/authorize?client_id=YourClientIDresponse_type=token

And change YourClientID to your app ID, this will allow you to get information about your advertising account. Open this link in your browser and you will be redirected to another page, which URL address holds your generated access token.

Настройка Client ID и API

You will also need your advertising account ID to make API requests. It can be found via this link, just copy it: https://vk.com/ads?act=settings

Access token expires in 86400 seconds or 24 hours. If you want to generate a token with an unlimited lifetime period, just pass scope to the offline parameter. In case if you need to generate a new token — change your password account or terminate all active sessions in security settings.

Using APIs to collect data
Let’s write a script that would allow us to retrieve information on all user’s ad campaigns: number of impressions, сlicks and costs. The script will pass this data to a DataFrame and send it to Google Docs.

from oauth2client.service_account import ServiceAccountCredentials from pandas import DataFrame
import requests
import gspread
import time

We have several constant variables: access token, advertising account ID and Vkontakte API Version. Here we are using the most recent API version, which is 5.103.

token = ‘fa258683fd418fafcab1fb1d41da4ec6cc62f60e152a63140c130a730829b1e0bc’ version = 5.103
id_rk = 123456789

To get advertising stats you need to use the ads.getStatistics method and pass your ad campaign ID to it. Since we don’t run any advertisements yet, we’ll use the ads.getAds method that returns IDs of ads and campaigns.

Use the requests library to send a request and convert the response to JSON.

Learn more about the API methods available for Vkontakte here

campaign_ids = []
ads_ids = []
r = requests.get(‘https://api.vk.com/method/ads.getAds’,
params= ‘v’: version,
‘account_id’: id_rk
>)
data = r.json()[‘response’]

We have a familiar list of dictionaries returned, similar to the one we have reviewed in the previous article, “Analysing data on Facebook Ad Campaigns with Redash”.

Fill in the ad_campaign_dict dictionary as follows: specify ad ID as a key, and campaign ID as a value, where this ad belongs to.

SwiftUI + VK api. Авторизация и список друзей ВК


ad_campaign_dict = <>
for i in range(len(data)):
ad_campaign_dict[data[i][‘id’]] = data[i][‘campaign_id’]

Having ID for every ad needed we can invoke the ads.getStatistics method to collect data on the number of impressions, clicks, costs, and dates for a particular ad, so create several empty lists in advance.

ads_campaign_list = []
ads_id_list = []
ads_impressions_list = []
ads_clicks_list = []
ads_spent_list = []
ads_day_start_list = []
ads_day_end_list = []

We need to invoke the getStatistics method for each ad separately, let’s refer to the ad_campaign_dict and iterate our requests. Retrieve all-time data by calling the ‘period’ method with the ‘overall’ value. Some ads may not have impression or clicks if they haven’t been launched yet, this may cause a KeyError. Let’s recall to the try — except approach to handle this error.

for ad_id in ad_campaign_dict:
r = requests.get(‘https://api.vk.com/method/ads.getStatistics’,
params= ‘v’: version,
‘account_id’: id_rk,
‘ids_type’: ‘ad’,
‘ids’: ad_id,
‘period’: ‘overall’,
‘date_from’: ‘0’,
‘date_to’: ‘0’
>)
try:
data_stats = r.json()[‘response’]
for i in range(len(data_stats)):
for j in range(len(data_stats[i][‘stats’])):
ads_impressions_list.append(data_stats[i][‘stats’][j][‘impressions’])
ads_clicks_list.append(data_stats[i][‘stats’][j][‘clicks’])
ads_spent_list.append(data_stats[i][‘stats’][j][‘spent’])
ads_day_start_list.append(data_stats[i][‘stats’][j][‘day_from’])
ads_day_end_list.append(data_stats[i][‘stats’][j][‘day_to’])
ads_id_list.append(data_stats[i][‘id’])
ads_campaign_list.append(ad_campaign_dict
[ad_id])
except KeyError:
continue

Now, create a DataFrame and print out the first 5 data points

df = DataFrame()
df[‘campaign_id’] = ads_campaign_list
df[‘ad_id’] = ads_id_list
df[‘impressions’] = ads_impressions_list
df[‘clicks’] = ads_clicks_list
df[‘spent’] = ads_spent_list
df[‘day_start’] = ads_day_start_list
df[‘day_end’] = ads_day_end_list
print(df.head())

Exporting Data to Google Docs
We’ll need a Google API access token, navigate to https://console.developers.google.com and create one. Choose any name you like, then go to your Dashboard and click “Enable APIs and Services”. Choose Google Drive API from the list, enable it and do exactly the same for Google Sheets API.

After activation you will be redirected to the API control panel. Click Credentials — Create Credentials, click choose data type and create an account. Choosing a role is optional, just proceed and specify JSON as a key type.

Еще по теме:  Как с телефона пригласить в группу ВК

After these steps you can download a JSON file with your credentials, we’ll rename it to «credentials.json». On the main page you’ll find the email field — copy your email address.

Go to https://docs.google.com/spreadsheets and create a new file named data, we’ll pass data from our DataFrame to it. Put the credentials.json file in one directory with the script and continue coding. Add these links to the scope list:

scope = [‘https://spreadsheets.google.com/feeds’,
‘https://www.googleapis.com/auth/drive’]

We will use the ServiceAccountCredentials.from_json_keyfile_name and gspread.authorize methods available in the oauth2client and gspread libraries for authenticaion process. Specify your file name and the scope variable in the ServiceAccountCredentials.from_json_keyfile_name method. The sheet variable will allow us to send requests to our file in Google Docs.

creds = ServiceAccountCredentials.from_json_keyfile_name(‘credentials.json’, scope)
client = gspread.authorize(creds)
sheet = client.open(‘data’).sheet1

Apply the update_cell method to enter new value in a table cell. It’s worth mentioning that the indexing starts at 0, not 1. With the first loop we’ll move the column names of our DataFrame. And with the following loops we’ll move the rest of our data points. The default limits allow us to make 100 loops for 100 seconds. These restrictions may cause errors and stop our script, that’s why we need to use time.sleep and make the script sleep for 1 second after each loop.

count_of_rows = len(df)
count_of_columns = len(df.columns)
for i in range(count_of_columns):
sheet.update_cell(1, i + 1, list(df.columns)[i])
for i in range(1, count_of_rows + 1):
for j in range(count_of_columns):
sheet.update_cell(i + 1, j + 1, str(df.iloc[i, j]))
time.sleep(1)

In case of success, you’ll get the same table:

Exporting data to Redash

See how you can connect Google Analytics to Redash in this article «How to connect Google Analytics to Redash?».

Having a table with Google Analytics and ad campaigns from Vkontakte exported we can compare them by writing the following query:

SELECT
query_50.day_start,
CASE WHEN ga_source LIKE ‘%vk%’ THEN ‘vk.com’ END AS source,
query_50.spent,
query_50.impressions,
query_50.clicks,
SUM(query_49.ga_sessions) AS sessions,
SUM(query_49.ga_newUsers) AS users
FROM query_49
JOIN query_50
ON query_49.ga_date = query_50.day_start
WHERE query_49.ga_source LIKE ‘%vk%’ AND DATE(query_49.ga_date) BETWEEN ‘2020–05–16’ AND ‘2020–05–20’
GROUP BY query_49.ga_date, source

ga_source — the traffic source, from which a user was redirected. Use the CASE method to combine everything that contains “vk” in one column called «vk.com». With the help of JOIN operator we can add the table with the data on ad campaigns, merging by date. Let’s take the day of the last ad campaign and a couple of days after, this will result in the following output:

Takeaways
Now we have a table that reflects how much were spent in ad costs on a certain day, the number of users who viewed this ad, were engaged and redirected to our website, and then completed the sign-up process.

Liked this article? Don’t forget to and follow 🙂

Join us on other platforms:

Источник: medium.com

OAuth2.0 авторизация в Vk средствами Qt5.8 и выше

Qt5.8 принёс нам QNetworkAuthorization — модуль авторизации на сторонних сервисах. Пока что поддерживаются только протоколы OAuth и OAuth2.0, но обещали позже подвезти и OpenID.

В стандартной документации лежат два примера: для реддита и твиттера, также нашёлся пример работы с гуглом. Но т.к. Vk нам всем ближе, было решено запилить статью и для него.

OAuth2.0

Я не стану вдаваться в подробности протокола, за меня это уже неплохо сделали здесь, здесь и вот здесь.

В своей статье я лишь кратко расставлю по местам действующие лица, которые понадобятся при написании кода:

  • Client — программа, которую вы пишете, и которой очень нужно получить данные пользователя или действовать от его имени.
  • Resource owner — он же user, т.е. владелец прав, аккаунтов и т.д.
  • Authorization server — сущность, которая, после успешной авторизации, выдаст client-у токен, позволяющий ему в течение некоторого времени работать от имени user-а.
  • Resource server — сервер с защищёнными данными (собственно, сервер Vk, на который будут отправляться запросы).

Установка QNetworkAuthorization

  1. Включаем vpn (без него сейчас Qt никак не пошевелить), я использую Windscribe или Tunnelbear.
  2. Устанавливаем модуль. Я использую Qt6.4.0-beta.
  3. Также советую установить OpenSsl (в самом низу списка), чтобы потом не ставить его отдельно для libcryptho.dll. Если у вас в системе уже где-то есть OpenSsl, то эту галочку можно не прожимать.

Создание приложения Vk (client-а)

Чтобы Client мог обращаться к authorization server-у, ему нужны client_id и client_secret.

  • client_id — это уникальный публичный идентификатор клиента.
  • client_secret — ключ, который должен быть полностью секьюрен. Позволяет подтвердить, что под этим client_id не скрывается некто иной, например, фишинговый сайт мошенника.

Можно рассматривать client_id как логин вашего приложения на сервере авторизации, а client_secret — как пароль.

Для начала нужно перейти на страницу менеджмента приложений и авторизоваться на ней.

Нажимаем кнопку “Создать”.

Выбираем Standalone-приложение и вводим название:

Тыкаем «Подключить приложение», вводим код из смс и переходим на вкладку «Настройки».

Для начала нужно запомнить два поля: «ID приложения» (client_id), и «Защищённый ключ» (client_secret). Нажимаем на иконку глаза справа от звёздочек, вводим код и перезагружаем страницу. Также нужно сменить настройку «Состояние» на «Приложение включено и видно всем».

Еще по теме:  Как сделать фишинг ссылку для ВК через termux

Теперь нужно настроить параметры OAuth. Для этого включаем Open API, это позволит использовать Authorization Code Flow.

Если у вас есть один или несколько IP, через который будет проводиться авторизация пользователей, то эти IP необходимо ввети во вкладку “Базовый домен”, но т.к. это чисто тестовое приложение, то авторизовываться мы в нём буду сразу с клиента, поэтому в “Базовый домен будет“127.0.0.1”. То же самое введу в поле “Адрес сайта” в качестве затычки.

Жмём “Сохранить изменения”, перезагружаем страницу и в появившемся поле “Доверенный redirect uri” вводим адрес, на который будет отправляться запрос с кодом, по которому позже можно будет взять токен у authorization server. В этом приложении весь путь авторизации идёт на клиенте, а потому вводим “http://127.0.0.1:6543/”. Сохраняем ещё раз, и можно закрывать страницу.

Собственно, код

Запускаем IDE, создаём “Приложение Qt Widgets”. На Qt5 лучше брать связку из MinGW + qmake. Для Qt6 лучше подходит msvc + CMake.

Добавляем в CMakeList.txt:
find_package(Qt6 REQUIRED COMPONENTS NetworkAuth)
target_link_libraries(VkOAuth2Project PRIVATE Qt6::NetworkAuth)

Если у вас qmake, достаточно написать в pro-файле
QT += networkauth

Далее возьмём из документации Vk некоторые ссылки и значения:

const QUrl authUrl< «https://oauth.vk.com/authorize» >; const QUrl tokenUrl< «https://oauth.vk.com/access_token» >; const QString clientSecret< «d4rZuR8zHiYHgntXC1kp» >; const QString clientId< «51400815» >; constexpr quint32 scopeMask = 2;//https://dev.vk.com/reference/access-rights

Этап 1. Начальная настройка

Для начала нужно создать объекты QOAuth2AuthorizationCodeFlow и QOAuthHttpServerReplyHandler. Первый отвечает за весь цикл авторизации и последующие запросы, второй нужен, чтобы принять code и token от authorization server-a и создать redirect_uri.

auto oauth = new QOAuth2AuthorizationCodeFlow( auto replyHandler = new QOAuthHttpServerReplyHandler(6543,

Обращаю внимание, что порт у replyHandler такой же, как в настройках приложения на сайте Vk. Это важно, т.к. этот объект вернёт redirect_uri формата http://127.0.0.1:/. Это поведение можно изменить, переопределив в потомке QOAuthHttpServerReplyHandler виртуальный метод callback.

Далее заполняем oauth настройками:

oauth->setReplyHandler(replyHandler); oauth->setAccessTokenUrl(tokenUrl); oauth->setAuthorizationUrl(authUrl); oauth->setClientIdentifier(clientId); oauth->setClientIdentifierSharedKey(clientSecret); oauth->setScope(QString::number(scopeMask));

Этап 2. Подтверждение доверия клиенту от пользователя

Resource owner должен подтвердить доверие client-у, после чего authorization server даст client-у одноразовый code. Для этого есть два пути.

QObject::connect(oauth, QDesktopServices::openUrl);

После подтверждения доверия, пользователя перебросит на страницу с текстом, генерируемым по-умолчанию:

Текст можно переопределить с помощью метода QOAuthHttpServerReplyHandler::setCallbackText. Можно даже без проблем возвращать html-страницу.

Второй, более сложный вариант, заключается в использовании QWebEngineView для отображения этой страницы прямо в приложении. Этот вариант приемлем, если у вас есть много ссылок, который вы и без того открываете в своём приложении (например, deeplink-и), и вам не хочется выбрасывать пользователя в браузер ради авторизации.

При этом стоит учитывать, что модуль QWebEngine не работает с компилятором mingw (по крайней мере, так было, когда я тестил), да и сам модуль довольно тяжёлый, так что тянуть его ради одной только авторизации может быть неразумно.

Этап 3. Получение token из одноразового code

Здесь нам ничего делать не нужно, Qt сам обратится по адресу, переданному ему в tokenUrl за токеном, и уведомит нас об окончании процесса авторизации.

Что можно сделать после авторизации

После авторизации client полностью вправе действовать от лица пользователя в рамках установленного scope (набора прав). Мы установили scope = 2, что по документации означает «доступ к списку друзей». Поэтому мы может запросить у сервера Vk список друзей какого-либо пользователя.

//Сигнал granted излучается при успешной авторизации QObject::connect(oauth, const QUrl getFriends< «https://api.vk.com/method/friends.get» >; //Vk требует указывать версию API в параметрах запроса. Укажем 5.131 auto network_reply = oauth->post(getFriends, < < «v», 5.131 >>); QObject::connect(network_reply, //Ответ будет удалён позже, когда отработают все связанные //с ним сигнально-слотовые соединения, //поэтому такое удаление безопасно network_reply->deleteLater(); QJsonDocument response = QJsonDocument::fromJson(network_reply->readAll()); qDebug() ); >);

Запустим процесс авторизации:

oauth->grant();

После авторизации в браузере, в консоли можно будет наблюдать список всех друзей пользователя:

Заключение

Развитие модуля на этом не заканчивается. Разработчики пока так и не завезли OpenID, а чтобы авторизовываться через сторонний сервер, вам придётся написать свою реализацию QAbstractOAuthReplyHandler, хотя со введением в Qt6.3 модуля QtHttpServer из QtLabs эта задача значительно облегчается.

Полный код доступен на GitHub

Источник: temofeev.ru

Таргетинг ВКонтакте на аудиторию чужих сайтов

Сайты без авторизации, регистрации с помощью социальных сетей это уже не современно. Бренды подключают авторизацию через социальные сети для удобства пользователей. Lamoda, Wildberries, 220 Вольт, Юлмарт, М.Видео уже используют авторизацию через социальные сети. Среди прочих, у них есть авторизация через ВКонтакте. Это удобно, но есть другая сторона.

Так сайты отдают доступ к своей аудитории. Не просто аудитории, а к тем, кто авторизовался в личном кабинете с помощью ВКонтакте.

Авторизацию через ВКонтакте подключают популярные магазины, форумы, СМИ и веб-приложения. Чтобы показывать рекламу ВКонтакте на аудиторию этих сайтов сделайте 3 действия: выберите сайт где есть авторизация через ВК, скопировать client_id, запустить рекламу.

Как настроить рекламу на аудиторию чужих сайтов

Зайти на сайт интересующей вас тематики, найти там заветную кнопку авторизация через ВКонтакте, и нажать на нее. Если вы уже авторизовались ранее, то вас перекинет в личный кабинет или куда там ведет ссылка после авторизации. Разлогиньтесь из ВК, чтобы получить окно авторизации, которое нам нужно. А если вы впервые авторизуетесь на этом сайте, то приложение попросит доступ к вашей информации. Разные сайты просят разный доступ, но дальше этого окна нам идти не нужно.

Еще по теме:  Vk подготовка к школе

Скопировать client_id приложения. На скрине изображено что нам нужно. В каждом приложени есть свой, так называемый параметр client_id. Его можно найти в адресной строке в окне авторизации с сайтом. Просто найдите в адресной строке client_id=КАКИЕ-ТО_ЦИФРЫ.

Вот эти цифры нам и нужны. Скопируйте их себе, их можно использовать в рекламе.

Таргетинг ВКонтакте на аудиторию чужих сайтов

Настроить рекламу на аудиторию этого сайта. Следует примерно представлять кто посетители этого сайта, прежде чем настраивать. Создаем объявление и в графе интересы вставляем эти цифры в поле «Приложения и сайты». Та-дам.

Таргетинг ВКонтакте на аудиторию чужих сайтов

Теперь мы можем донастроить таргетинг по возрасту, полу, географии. Нужны пользователи авито из Санкт-Петербурга в возрасте от 22 до 35 лет? Пфф.

Таргетинг ВКонтакте на аудиторию чужих сайтов

Мы проанализировали 50 популярных сайтов интернет-магазинов, СМИ и SaaS проектов и собрали client_id для рекламы. Можете пользоваться этими табличками.

Популярные СМИ

Ссылка Client_id для рекламы ВКонтакте Описание сайта
https://vc.ru 4310642 Крупнейшая в рунете площадка для предпринимателей нового поколения. Пишут о стартапах, растущих бизнесах, новых моделях заработка, неординарных героях со всего мира и технологиях роста.
https://life.ru/ 5298736 Cобытия и новости 24 часа в сутки
https://ria.ru 1990932 Новостная лента о политике, спорте, науке, культуре и др. Фото- и видеоматериалы, инфографика, комментарии экспертов.
http://prophotos.ru 4693210 Журнал о фототехнике и фотографии №1
https://lenta.ru 1990932 Самые важные и интересные новости
https://sports.ru 4119369 Ведущий российский спортивный сайт
http://echo.msk.ru 2432279 Главное СМИ о политике

SaaS сервисы, обучающие проекты и рекламные инструменты

Ссылка Client_id для рекламы ВКонтакте Описание сайта
https://htmlacademy.ru 3075478 Курсы для каждого, кто хочет окунуться в мир вёрстки и программирования. Интерактивные задания помогут освоить веб-технологии и создать сайт, а интенсивные курсы подготовят к старту карьеры в IT.
https://cityads.com 5131196 Высокотехнологичная международная партнерская система интернет-рекламы по модели CPA!
https://kma.biz 5079100 Приятная CPA сеть
https://www.avito.ru 5091356 Avito — один из крупнейших сайтов объявлений в стране.
https://smmplanner.com 4751354 «Отложенная публикация в социальные сети»
mts.ru 2709487 Услуги в области сотовой связи и доступа в интернет.
https://www.bitrix24.ru 4366625 Полный комплект инструментов для организации работы
https://kontur.ru/ 3988827 Сервисы для ведения бизнеса. Бухгалтерия, документооборот, проверка контрагентов.
https://dadata.ru 3459846 Сервис автоматически исправляет ошибки в адресах, ФИО, телефонах и компаниях.
https://www.webasyst.ru/ 3859663 Веб-платформа, объединяющая систему управления сайтом (CMS) и интернет-магазином с корпоративным интранетом, CRM, системой управления проектами и задачами. Единая система для управления компанией через интернет.
http://церебро.рф 4661537 Сервис для сбора баз потенциальных клиентов в ВК
http://price.ru 3210582 Сервис поиска товаров и цен
http://lpgenerator.ru 2256162 Платформа создания и оптимизации посадочных страниц

Социальные сети, форумы, тематические порталы

Ссылка Client_id для рекламы ВКонтакте Описание сайта
http://mama.ru 3252434 Подборка полезной информации о детях: статьи, советы и рекомендации.
http://www.whrussia.ru 3123767 Все для девушек. комплексы упражнений для похудения, программы фитнес-тренировок. Рекомендации по правильному питанию, рецепты, безопасные диеты. Статьи о красоте и женском здоровье, моде, любви и отношениях.
https://auto.ru 4383229 Объявления о продаже и покупке легковых и грузовых автомобилей, мотоциклов, а также запчастей. Форумы для автолюбителей. Отзывы автовладельцев.
https://habrahabr.ru/ 3110645 Публикации в коллективном и персональном блогах, дискуссии в группах, подкасты на тему интернета, разработки программ, «железа», телекоммуникаций и т.д. Поиск материалов по тегам.
https://www.kinopoisk.ru 2324725 Самый популярный киносайт Рунета
http://www.drom.ru 5741732 Всероссийский автомобильный портал №1
https://loveplanet.ru 4552413 Сервис знакомств
https://hh.ru 3295164 Ведущий сервис для поиска работы и кадров.
http://www.combats.com 4728728 Браузерная игра «Бойцовский Клуб»
http://damochka.ru 5672929 Знакомства в Москве
https://www.zarplata.ru 3319237 Простой и удобный сайт по трудоустройству
https://babyblog.ru 3222940 Клуб современных мам и тех, кто планирует ими стать
http://pikabu.ru 4963690 Творческое объединение. Пользовательский контент.
https://fotostrana.ru/ 2263836 Социальная сеть знакомств

Интернет-магазины

Ссылка Client_id для рекламы ВКонтакте Описание сайта
http://www.lamoda.ru 5744874 Крупнейший в России интернет-магазин одежды, обуви и аксессуаров, косметики и парфюмерии!
https://www.wildberries.ru 4249343 Модный интернет-магазин одежды, обуви и аксессуаров!
http://www.220-volt.ru 5071749 Онлайн-продажа ручного и электроинструмента, садовой техники, станков, строительного и силового оборудования, автотоваров и пр.
https://www.ulmart.ru 3361795 Группа компаний Юлмарт — интернет-холдинг, специализирующийся на электронной коммерции. Имеет широкую сеть дистрибьюторов
http://www.mvideo.ru 4755220 Крупный сетевой магазин по продаже электроники и бытовой техники в России
http://www.svyaznoy.ru 2828677 Продажа мобильных телефонов, ноутбуков, фотокамер, аудио и видео, др.
http://exist.ru 3798730 Интернет-магазин автозапчастей и аксессуаров для европейских, японских и корейских автомобилей и мототехники.
http://www.eldorado.ru 5090445 Интернет-магазин электроники, компьютеров, бытовой техники, косметики и парфюмерии, товаров для детей, дома, дачи, пр.
https://www.utkonos.ru 3307347 Интернет-гипермаркет. Продажа продуктов питания, доставка на дом.
http://www.labirint.ru 2237467 Интернет-магазин. Вы можете купить книги, игры и игрушки, подарочные издания, аудио, видео, компьютерные игры, софт, товары для детей
http://www.sportmaster.ru 5573878 Продажа спортивных тренажеров, одежды и обуви, снаряжения для туризма и активного отдыха.
https://www.vseinstrumenti.ru 2852745 Магазин инструментов.
https://www.fotosklad.ru 2474625 Интернет магазин фототехники. Продажа фотоаппаратов, фототоваров, оптики, цифровой техники
http://e96.ru 5086255 Крупнейший интернет-магазин бытовой техники и электроники в Екатеринбурге
http://www.vsemayki.ru/ 4733148 Прикольные футболки с принтами и рисунками
http://4tochki.ru 4733148 Интернет магазин шин (автошин), продажа покрышек и колес

Источник: conversion.im

Рейтинг
( Пока оценок нет )
Загрузка ...