Приветствую тебя, дорогой читатель! В статье описан процесс создания простейшего WindowsForms приложения, которое будет работать с API социальной сети «ВКонтакте».
Задачи приложения:
- Получить User Token и выполнять все дальнейшие запросы с помощью него.
- Получить на вход ID пользователя.
- Вывести информацию о пользователе с введённым ID.
Для удобства я буду использовать две библиотеки:
- xNet — для произведения GET-запросов.
- JSON.Net — для считывания ответов на эти запросы.
Можно приступать к созданию приложения, заходим в VisualStudio и создаём новое WindowsForms приложение.
Подключаем библиотеки
Библиотека JSON.Net подключается с помощью консоли диспетчера пакетов, достаточно ввести команду:
Install-Package Newtonsoft.Json
Для подключения библиотеки xNet нам потребуется зайти сюда, скачать xNet.dll и добавить его в проект с помощью менеджера ссылок.
После подключения библиотек создаём две формы: MainForm (Можно использовать стандартную Form1) и AuthorizationForm. Формы выглядят так:
Автопостинг ВК | Получение access token, выполнение запроса, извлечение шуток
MainForm
AuthorizationForm
Эта форма состоит из элемента WebBrowser с параметром Name = GetToken.
Создадим ещё один файл класса. Назовём его VkAPI.
Приступаем к написанию кода.
Для начала реализуем получение токена. Для этого в MainForm создадим обработчик нажатия на кнопку Button_GetToken:
private void Button_GetToken_Click(object sender, EventArgs e)
using System; using System.Windows.Forms; using System.IO; namespace VkAPITutorial < public partial class AuthorizationForm : Form < public AuthorizationForm() < InitializeComponent(); >private void AuthorizationForm_Load(object sender, EventArgs e) < GetToken.DocumentCompleted += GetToken_DocumentCompleted; GetToken.Navigate(«https://oauth.vk.com/authorize?client_id=»+ VkAPI.__APPID +»redirect_uri=https://oauth.vk.com/blank.htmlresponse_type=token); >private void GetToken_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) < if (GetToken.Url.ToString().IndexOf(«access_token=») != -1) < GetUserToken(); >> private void GetUserToken() < char[] Symbols = < ‘=’, ‘; string[] URL = GetToken.Url.ToString().Split(Symbols); File.WriteAllText(«UserInf.txt», URL[1] + «n»); File.AppendAllText(«UserInf.txt», URL[5]); this.Visible = false; > private void GetToken_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)<> > >
Теперь разберём всё по порядку:
При нажатии на кнопку открывается AuthorizationForm с Web-браузером, в браузере открывается ссылка:
https://oauth.vk.com/authorize?client_id=ApplicationIDredirect_uri=https://oauth.vk.com/blank.htmlresponse_type=token using xNet; using Newtonsoft.Json; namespace VkAPITutorial < class VkAPI < public const string __APPID = «APPLICATION_ID»; //ID приложения private const string __VKAPIURL = «https://api.vk.com/method/»; //Ссылка для запросов private string _Token; //Токен, использующийся при запросах public VkAPI(string AccessToken) < _Token = AccessToken; >public Dictionary GetInformation(string UserId, string[] Fields) //Получение заданной информации о пользователе с заданным ID < HttpRequest GetInformation = new HttpRequest(); GetInformation.AddUrlParam(«user_ids», UserId); GetInformation.AddUrlParam(«access_token», _Token); GetInformation.AddUrlParam(«v», «5.52»); string Params = «»; foreach (string i in Fields) < Params += i + «,»; >Params = Params.Remove(Params.Length — 1); GetInformation.AddUrlParam(«fields», Params); string Result = GetInformation.Get(__VKAPIURL + «users.get»).ToString(); Result = Result.Substring(13, Result.Length — 15); Dictionary Dict = JsonConvert.DeserializeObject(Result); return Dict; > public string GetCityById(string CityId) //Перевод ID города в название < HttpRequest GetCityById = new HttpRequest(); GetCityById.AddUrlParam(«city_ids», CityId); GetCityById.AddUrlParam(«access_token», _Token); GetCityById.AddUrlParam(«v», «5.52»); string Result = GetCityById.Get(__VKAPIURL + «database.getCitiesById»).ToString(); Result = Result.Substring(13, Result.Length — 15); DictionaryDict = JsonConvert.DeserializeObject(Result); return Dict[«name»]; > public string GetCountryById(string CountryId) //Перевод ID страны в название < HttpRequest GetCountryById = new HttpRequest(); GetCountryById.AddUrlParam(«country_ids», CountryId); GetCountryById.AddUrlParam(«access_token», _Token); GetCountryById.AddUrlParam(«v», «5.52»); string Result = GetCountryById.Get(__VKAPIURL + «database.getCountriesById»).ToString(); Result = Result.Substring(13, Result.Length — 15); DictionaryDict = JsonConvert.DeserializeObject(Result); return Dict[«name»]; > > >
using System; using System.Windows.Forms; using System.Collections.Generic; using System.IO; namespace VkAPITutorial < public partial class MainForm : Form < VkAPI _ApiRequest; private string _Token; //Токен, использующийся при запросах private string _UserId; //ID пользователя private Dictionary_Response; //Ответ на запросы public MainForm() < InitializeComponent(); >private void Button_GetToken_Click_1(object sender, EventArgs e) < AuthorizationForm GetToken = new AuthorizationForm(); GetToken.ShowDialog(); >private void MainForm_Load(object sender, EventArgs e) < try < StreamReader ControlInf = new StreamReader(«UserInf.txt»); _Token = ControlInf.ReadLine(); _UserId = ControlInf.ReadLine(); ControlInf.Close(); if (_Token != null) < _ApiRequest = new VkAPI(_Token); string[] Params = < «city», «country», «photo_max» >; _Response = _ApiRequest.GetInformation(_UserId, Params); if (_Response != null) < User_ID.Text = _UserId; User_Photo.ImageLocation = _Response[«photo_max»]; User_Name.Text = _Response[«first_name»]; User_Surname.Text = _Response[«last_name»]; User_Country.Text = _ApiRequest.GetCountryById(_Response[«country»]); User_City.Text = _ApiRequest.GetCityById(_Response[«city»]); Button_GetToken.Visible = false; >> > catch < >> private void Button_GetInformation_Click_1(object sender, EventArgs e) < try < StreamReader ControlInf = new StreamReader(«UserInf.txt»); _Token = ControlInf.ReadLine(); ControlInf.Close(); _ApiRequest = new VkAPI(_Token); _UserId = User_ID.Text; string[] Params = < «city», «country», «photo_max» >; _Response = _ApiRequest.GetInformation(_UserId, Params); if (_Response != null) < User_ID.Text = _UserId; User_Photo.ImageLocation = _Response[«photo_max»]; User_Name.Text = _Response[«first_name»]; User_Surname.Text = _Response[«last_name»]; User_Country.Text = _ApiRequest.GetCountryById(_Response[«country»]); User_City.Text = _ApiRequest.GetCityById(_Response[«city»]); Button_GetToken.Visible = false; >> catch < >> > >
При запуске приложение пытается считать токен и ID пользователя:
Получение токена пользователя в VK вконтакте для работы с API
StreamReader ControlInf = new StreamReader(«UserInf.txt»); _Token = ControlInf.ReadLine(); _UserId = ControlInf.ReadLine(); ControlInf.Close();
Если считывание прошло успешно, то приложение пытается произвести запрос информации о пользователе (Проверка токена на валидность):
_ApiRequest = new VkAPI(_Token); string[] Params = < «city», «country», «photo_max» >; _Response = _ApiRequest.GetInformation(_UserId, Params);
Если запрос успешен, то все поля в форме заполняются и кнопка GetToken становится неактивной:
User_ID.Text = _UserId; User_Photo.ImageLocation = _Response[«photo_max»]; User_Name.Text = _Response[«first_name»]; User_Surname.Text = _Response[«last_name»]; User_Country.Text = _ApiRequest.GetCountryById(_Response[«country»]); User_City.Text = _ApiRequest.GetCityById(_Response[«city»]); Button_GetToken.Visible = false;
Иначе кнопка GetToken активна, и при нажатии на неё срабатывает функция:
private void Button_GetInformation_Click(object sender, EventArgs e) < try < StreamReader ControlInf = new StreamReader(«UserInf.txt»); _Token = ControlInf.ReadLine(); ControlInf.Close(); _ApiRequest = new VkAPI(_Token); _UserId = User_ID.Text; string[] Params = < «city», «country», «photo_max» >; _Response = _ApiRequest.GetInformation(_UserId, Params); if (_Response != null) < User_ID.Text = _UserId; User_Photo.ImageLocation = _Response[«photo_max»]; User_Name.Text = _Response[«first_name»]; User_Surname.Text = _Response[«last_name»]; User_Country.Text = _ApiRequest.GetCountryById(_Response[«country»]); User_City.Text = _ApiRequest.GetCityById(_Response[«city»]); Button_GetToken.Visible = false; >> catch < >>
Теперь разберёмся как происходит GET-запрос. Сначала создаётся переменная:
HttpRequest GetInformation = new HttpRequest();
Далее в неё заносятся параметры:
GetInformation.AddUrlParam(«user_ids», UserId); GetInformation.AddUrlParam(«access_token», _Token); GetInformation.AddUrlParam(«v», «5.52»); string Params = «»; foreach (string i in Fields) < Params += i + «,»; >Params = Params.Remove(Params.Length — 1); GetInformation.AddUrlParam(«fields», Params);
И производится GET-запрос:
string Result = GetInformation.Get(__VKAPIURL + «users.get»).ToString();
Результат обрезается до строки, которую можно конвертировать:
Result = Result.Substring(13, Result.Length — 15);
Происходит конвертация json в словарь:
Dictionary Dict = JsonConvert.DeserializeObject(Result);
Источник: habr.com
Как получить токен вконтакте
Что такое токен ВКонтакте и почему все хотят его получить?
Токен ВКонтакте — это специальный ключ ВКонтакте, позволяющий тем или иным лицам получать доступ к приложениям, получать доступ к фотографиям, сообщениям, переписке. Токен известен только владельцу страницы. То есть после получения токена с определенными правами мы практически получаем доступ к странице.
Давно писал статью о том, как читать чужую переписку ВКонтакте с помощью токена, а вот о получении своего или чужого токена написал очень мало. Поэтому сегодня я немного расширю эту тему.
Получите токен для ВК
Здесь все кажется простым, но каждый день мне пишут 5 человек с просьбой дать им токен, чего я не делаю, потому что у меня свои дела. Поэтому вкратце расскажу, как это делается, и приложу один из способов.
Для этого, как всегда, нам понадобится сайт vkserv.ru, который мы использовали в прошлый раз. В нем есть специальная вкладка «Получить токен ВКонтакте«.
Переходим в эту вкладку, авторизуемся на сайте. Мы не боимся за свои данные, потому что никуда не отправляем свой токен!
Далее видим единственную кнопку с названием «Перейти получить токен», нажимаем на нее (правда, других здесь нет).
Далее мы попадаем на страницу с множеством непонятных кнопок. Нам это интересно, потому что нижняя часть, которую я зачеркнул, нужна продвинутым пользователям (если интересно, я тоже об этом напишу).
Затем нажмите кнопку с надписью «Клевер», позже я объясню, почему именно эта кнопка.
После катапультирования на страницу подтверждения скопируйте адрес из строки и отправьте его жертве (если вы получите чужой токен). Если вы хотите получить свой, просто нажмите кнопку «Разрешить».
После того, как жертва нажмет кнопку «Разрешить», она будет перенаправлена на страницу с токеном ВКонтакте. Это выглядит так страшно.
В адресной строке будет находиться наш токен ВКонтакте. А чуть ниже просто страшная надпись «Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Поэтому вы можете потерять доступ к своей учетной записи.»
Нам просто нужно убедиться, что жертва отправляет нам ссылку из адресной строки браузера, которую он открыл. Здесь в игру вступает ваше воображение.
Почему я рекомендовал вам использовать приложение Clover? А как получить чужой токен ВКонтакте.
это просто, здесь вы можете сказать своей жертве, что хотите увеличить достижения в игре и поделиться с вами одним способом, но вам нужно как минимум два человека и жетон каждого из них.
Также для правдоподобия спросите перед тем, как зайти в группу Clover ВКонтакте и зарегистрироваться, и только потом отпускать ссылку для получения токена.
После этого вы получаете токен, через некоторое время говорите спасибо, что все заработало и спасибо за помощь.
И мы сами сразу идем читать переписку нашей жертвы, ничего ей не говоря.
Вы уже знаете, что делать с токеном, это прочитать совпадение ВКонтакте с токеном или перейти на страницу ВК по этому же токену. О втором способе я опубликую чуть позже.
Если хотите, я опубликую на сайте больше способов получить чужой токен, которые будут работать в 90% случаев. Пишите в комментариях и подписывайтесь на телеграм-канал, если будет достаточно людей обязательно напишу!
Источник: faq-vk.ru
Собираем данные по рекламным кампаниям ВКонтакте
В пятничном лонгриде проделаем большую работу: возьмём информацию по рекламным кампаниям ВКонтакте и сопоставим их с данными Google Analytics в Redash. Чтобы снова не поднимать сервер, будем передавать данные через Google Docs, используя Spreadsheet API.
Получение access token
Для получение пользовательского ключа ВКонтакте нужно создать приложение. Идём в раздел «Разработчики» по https://vk.com/apps?act=manage, жмём на кнопку «Создать приложение». В поле «Тип приложения» выбираем «Standalone-приложение» и даём любое название. После этого в меню слева идём в настройки и сохраняем себе ID приложения.
Актуальную информацию о ключах можно посмотреть в статье «Получение ключа доступа»
Теперь копируем себе эту ссылку:
https://oauth.vk.com/authorize?client_id=YourClientIDresponse_type=token
Но вместо YourClientID вставляем ID своего созданного приложения. В scope у этой ссылки только ads, так что с этим ключом можно будет получать только информацию о рекламном кабинете. Вставляем её в браузер и нас скидывает на другую страницу — в адресе этой странице будет указан ваш сгенерированный access token.
Срок жизни токена — 86400 секунд: ровно сутки. Чтобы получить токен без временных ограничений можно добавить в scope параметр offline. Если токен понадобилось отозвать — смените пароль от страницы или в настройках безопасности завершите активные сессии.
Ещё для запросов к API нам пригодится ID рекламного кабинета — проходим по https://vk.com/ads?act=settings и копируем «номер кабинета».
Сбор данных через запросы к API
Напишем скрипт, который обращается к серверу ВКонтакте с нашим access token и номером рекламного кабинета и берёт информацию о всех кампаниях пользователя: количество просмотров на рекламах, кликов и затрат. Затем скрипт будет формировать из него DataFrame и отправлять в Google Docs.
from oauth2client.service_account import ServiceAccountCredentials from pandas import DataFrame import requests import gspread import time
Зададим несколько константных значений: access token, ID рекламного кабинета и версию API ВКонтакте, которую будем использовать. Актуальной является версия 5.103.
token = ‘fa258683fd418fafcab1fb1d41da4ec6cc62f60e152a63140c130a730829b1e0bc’ version = 5.103 id_rk = 123456789
За получение статистики по рекламе отвечает метод ads.getStatistics , но один из обязательных параметров при его вызове — ’ids’, ID рекламного объявления, статистику по которому мы хотим получить. Так как ID у нас пока нет, придётся сначала воспользоваться методов ads.getAds , который возвращает ID объявлений и кампаний.
Подробнее со всеми методами ВКонтакте API можно ознакомиться в документации
Библиотекой requests отправляем запрос к серверу и передаём свои параметры. Полученный ответ сразу переведём в формат json
campaign_ids = [] ads_ids = [] r = requests.get(‘https://api.vk.com/method/ads.getAds’, params=< ‘access_token’: token, ‘v’: version, ‘account_id’: id_rk >) data = r.json()[‘response’]
Вот, как выглядит объект data : нам вернулся обычный список словарей, с которым мы уже имели дело в материале “Передаём и анализируем собранные данные по рекламным капманиям в Redash”.
Заполняем словарь ad_campaign_dict . Ключом будет ID объявления, а значением — ID кампании, к которой принадлежит объявление. Так будет удобнее присваивать к объявлению ID кампании, к которой оно принадлежало.
ad_campaign_dict = <> for i in range(len(data)): ad_campaign_dict[data[i][‘id’]] = data[i][‘campaign_id’]
Теперь, имея ID каждого нужного объявления, можно обратиться к методу ads.getStatistics . Мы будем собирать количество просмотров, кликов, затрат и даты начала и конца объявления, поэтому заблаговременно заведём пустые списки.
ads_campaign_list = [] ads_id_list = [] ads_impressions_list = [] ads_clicks_list = [] ads_spent_list = [] ads_day_start_list = [] ads_day_end_list = []
Вызывать getStatistics нужно отдельно для каждого объявления — будем делать это в итераторе по ad_campaign_dict . Отправляем запрос, передавая в ‘period’ значение ‘overall’ — берём данные за всё время. У некоторых объявлений могут отсутствовать данные по полю «Просмотры» или «Клики» если они не были запущены, и, потребовав их, мы словим KeyError — во избежание этого добавим обработчик try — except , который заставит скрипт не обращать внимания на эту ошибку.
for ad_id in ad_campaign_dict: r = requests.get(‘https://api.vk.com/method/ads.getStatistics’, params=< ‘access_token’: token, ‘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
Теперь сформируем из списков DataFrame и выведем первые 5 элементов:
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())
Экспорт данных в Google Docs
Для экспорта DataFrame в таблицу Google Sheets необходим ключ доступа Google API. Пройдём по https://console.developers.google.com и создадим новый проект. Даём ему любое имя и в Dashboard жмём на кнопку “Подключить API и сервисы”. Нужно включить два API — Google Drive API и Google Sheets API. Ищем первый в поиске, нажимаем на “Включить API”, затем ищем второй и проделываем то же самое.
После включения нас отправят на панель управления API. Жмём на «Создать учётные данные» — по ним будем проводить авторизацию в скрипте. Отмечаем, что используем Google Sheets API из веб-сервера и обращаемся к данным пользователя. Нажимаем на «Выбрать тип учётных данных» и создаем сервисный аккаунт. В поле «Роль» выбираем Проект — Редактор, а тип ключа оставим JSON.
После этого нам отправят файл в формате JSON с нашими учетными данными — назовём его «credentials.json» — и перенаправят на страницу с сервисными аккаунтами. Ниже будет поле с почтой — копируем её себе.
Переходим по https://docs.google.com/spreadsheets и создаем пустой файл с названием data , в который будут отправляться данные из DataFrame. В настройках доступа даём доступ по почте, скопированной ранее из сервисных аккаунтов — от неё будут приходить данные из скрипта.
Закинем файл credentials.json в директорию со скриптом и продолжим писать код. Перечисляем область видимости в виде ссылок:
scope = [‘https://spreadsheets.google.com/feeds’, ‘https://www.googleapis.com/auth/drive’]
И при помощи библиотек oauth2client и gspread проводим авторизацию методами ServiceAccountCredentials.from_json_keyfile_name и gspread.authorize , указывая в параметрах первого наш файл и переменную scope. Через переменную sheet будем обращаться к нашему файлу в Google Docs.
creds = ServiceAccountCredentials.from_json_keyfile_name(‘credentials.json’, scope) client = gspread.authorize(creds) sheet = client.open(‘data’).sheet1
Для ввода значений в ячейку таблички есть метод update_cell . Важно: нумерация индексов ячеек при обращении начинается не с нуля, а с единицы. Первым циклом пройдём по первой строке и перенесем туда заголовки нашего DataFrame.
Во втором будем идти по каждой ячейке и вставлять соответствующие значения DataFrame. По умолчанию стоит ограничение — 100 запросов в 100 секунд. Это ограничение может остановить наш скрипт на полпути: чтобы избежать ошибки пропишем time.sleep , чтобы после каждой вставки скрипт секунду выжидал.
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)
Если всё сделаем правильно — получим таблицу такого вида:
Экспорт данных в Redash
Подключение Google Analytics к Redash описано в статье «Как подключить Google Analytics как Redash?».
Имея в Redash таблицу с Google Analytics и рекламным кампаниям ВКонтакте, можем сопоставить их друг другу. Напишем такой запрос:
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 — источник, с которого человек пришел на сайт. Всё, что похоже на vk оператором CASE объединяем в столбец «vk.com». Оператором JOIN добавляем таблицу с данными из ВКонтакте, объединяя по полю даты. Отсеиваем данные — возьмём день последней рекламной кампании и посмотрим на несколько дней после него. На выходе получим таблицу такого вида:
Итоги
Получилась таблица, сообщающая, сколько всего было затрачено на объявления в этот день, сколько человек его посмотрели, зашли к нам на сайт и стали нашими новыми пользователями.
Источник: leftjoin.ru