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
- Включаем vpn (без него сейчас Qt никак не пошевелить), я использую Windscribe или Tunnelbear.
- Устанавливаем модуль. Я использую Qt6.4.0-beta.
- Также советую установить 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). Нажимаем на иконку глаза справа от звёздочек, вводим код и перезагружаем страницу. Также нужно сменить настройку «Состояние» на «Приложение включено и видно всем».
Теперь нужно настроить параметры 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, запустить рекламу.
Как настроить рекламу на аудиторию чужих сайтов
Зайти на сайт интересующей вас тематики, найти там заветную кнопку авторизация через ВКонтакте, и нажать на нее. Если вы уже авторизовались ранее, то вас перекинет в личный кабинет или куда там ведет ссылка после авторизации. Разлогиньтесь из ВК, чтобы получить окно авторизации, которое нам нужно. А если вы впервые авторизуетесь на этом сайте, то приложение попросит доступ к вашей информации. Разные сайты просят разный доступ, но дальше этого окна нам идти не нужно.
Скопировать client_id приложения. На скрине изображено что нам нужно. В каждом приложени есть свой, так называемый параметр client_id. Его можно найти в адресной строке в окне авторизации с сайтом. Просто найдите в адресной строке client_id=КАКИЕ-ТО_ЦИФРЫ.
Вот эти цифры нам и нужны. Скопируйте их себе, их можно использовать в рекламе.
Настроить рекламу на аудиторию этого сайта. Следует примерно представлять кто посетители этого сайта, прежде чем настраивать. Создаем объявление и в графе интересы вставляем эти цифры в поле «Приложения и сайты». Та-дам.
Теперь мы можем донастроить таргетинг по возрасту, полу, географии. Нужны пользователи авито из Санкт-Петербурга в возрасте от 22 до 35 лет? Пфф.
Мы проанализировали 50 популярных сайтов интернет-магазинов, СМИ и SaaS проектов и собрали 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 сервисы, обучающие проекты и рекламные инструменты
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 | Платформа создания и оптимизации посадочных страниц |
Социальные сети, форумы, тематические порталы
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 | Социальная сеть знакомств |
Интернет-магазины
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