Введение
Для начала расскажу, для чего я все буду делать. Глобальная задача стоит сделать дашборд для работы маркетолога или ssm специалиста. Свести в одно место метрики из разных систем — посещаемость сайтов, монетизация, активность в группах vk, telegram и т.д. Часть этого всего я уже сделал. Буду постепенно делиться на страницах сайта. Начать рассказ решил с самого сложного — работа с google api.
В целом, работа со всеми api примерно одинаковая и не представляет особой сложности. С goolge api возникают проблемы с доступом у тех, кто первый раз все это настраивает. Там слишком много всяких сущностей. Надо пройти определенный квест и регулярно его повторять, чтобы иметь доступ к google api. Сделано все это для безопасной работы больших и сложных систем. Ну а обычным юзерам, которые просто хотят дергать curl-ом какие-то метрики, это кажется не очень простым.
В общем, расскажу обо всем по порядку, чтобы было понятно даже новичку, который только начинает работу с api. Покажу на реальном примере моего сайта и кабинета adsense к нему.
Как добавить пользователей с помощью таблицы
Если для создания аккаунтов вы используете CSV-файл, пользователи не получат приветственное письмо с учетными данными автоматически – вам нужно будет выслать их самостоятельно.
Совет. Если вы потеряли пароль нового пользователя, сбросьте пароль и отправьте пользователю новый.
Шаг 1. Скачайте файл шаблона
-
Войдите в консоль администратора Google.
Используйте аккаунт администратора (он не заканчивается на @gmail.com).
- На главной странице консоли администратора выберите Пользователи.
- Вверху страницы нажмите Массовое обновление пользователей.
- Нажмите Скачать пустой шаблон CSV-файла, чтобы получить CSV-файл со значениями, разделенными запятыми.
- Откройте его в редакторе таблиц, например в Google Таблицах или Microsoft Excel.
Файл содержит столбцы для атрибутов, которые могут присутствовать в каждом профиле пользователя. Профили доступны в консоли администратора и Менеджере контактов пользователей.
Шаг 2. Введите информацию о пользователях
-
Для каждого пользователя укажите необходимую информацию в следующих столбцах таблицы:
- First Name (Имя).
- Last Name (Фамилия).
- Email Address (Адрес электронной почты). Укажите адрес в формате [email protected].
- Password (Пароль). Этот параметр должен содержать не менее 8 символов.
-
Org Unit Path (Путь к организационному подразделению). Чтобы указать, что пользователь относится к организационному подразделению верхнего уровня, используйте косую черту (). Это может потребоваться, если вы ещё не создали организационную иерархию в консоли администратора.
Описания столбцов и сведения об их форматировании .
Таблица должна выглядеть примерно следующим образом:
- Если нужно, чтобы пользователь сменил пароль при следующем входе в систему, укажите в столбце Change Password at Next Sign-In (Смена пароля при следующем входе в систему) значение TRUE. В противном случае оставьте столбец пустым.
- При необходимости в оставшихся столбцах вы можете указать дополнительную информацию (например, резервные адреса электронной почты, лицензии или домашние адреса).
Шаг 3. Сохраните файл
Когда вся информация будет внесена в таблицу, сохраните файл в формате CSV.
Примечания
- Размер CSV-файла не должен превышать 35 МБ.
- Количество записей в файле не должно превышать 150 000.
Если файл имеет слишком большой размер или содержит более 150 000 записей, откройте его, разделите таблицу на несколько файлов и сохраните каждый из них в формате CSV. Убедитесь, что во всех файлах CSV есть строка с заголовками столбцов.
- Чтобы загрузить на сервер имена пользователей в двухбайтовой кодировке или кодировке, отличной от ASCII, сначала сохраните CSV-файл в UTF-8 (с маркером BOM).
Шаг 4. Загрузите файл
- Вверху страницы Пользователи нажмите Массовое обновление пользователей.
- Нажмите Прикрепить CSV-файл.
- Выберите CSV-файл на компьютере и прикрепите его.
- Нажмите кнопку Загрузить. Если возникнет ошибка, добавьте в таблицу недостающую информацию и загрузите файл снова. Дополнительные сведения изложены далее в разделе .
Откроется список задач, в котором будет показан процесс обработки загруженных данных. После его завершения вы получите электронное письмо с отчетом.
Если при загрузке данных возникнет ошибка, скачайте файл журнала в списке задач. Дополнительные сведения приводятся далее в разделе .
Обратите внимание, что добавление новых пользователей в каталог и предоставление им доступа к сервисам Google может занять до 24 часов. Подробнее о каталоге…
Совместная работа над файлом при участии более 100 человек
В Google Документах, Таблицах и Презентациях просматривать, редактировать и комментировать файл могут до 100 человек одновременно. Если пользователей будет больше, изменять открытый файл смогут только его владелец и некоторые редакторы.
Если вы хотите привлечь к работе более 100 человек, можно сделать следующее.
Опубликуйте файл
- Чтобы множество пользователей могло просматривать файл одновременно, опубликуйте его и создайте ссылку для доступа. Вы можете предоставить права на редактирование пользователям, которым нужно изменять или комментировать контент. Подробнее о процедуре публикации…
- Учтите, что опубликованный файл виден всем в Интернете. Следите за тем, чтобы случайно не предоставить доступ к личной или конфиденциальной информации не тем людям. Если у вас рабочий или учебный аккаунт, ваш администратор может ограничить круг пользователей, которым разрешено просматривать опубликованные файлы. Если вы администратор, узнайте, .
- Чтобы удалить файл из Интернета, отмените его публикацию.
- Если вы хотите отменить доступ к файлу для соавторов, прочитайте о том, как изменить настройки совместного доступа.
Создайте сайт на платформе Google
- Создав сайт на платформе Google, вы сможете размещать на его страницах документы, таблицы и презентации. Этот вариант удобен, если вам нужно просто предоставить информацию большому количеству пользователей. Подробнее о том, как добавлять на сайт документы…
- Если вы опасаетесь, что ваш сайт может привлечь слишком большой трафик, советуем сначала опубликовать файл в Google Документах, Таблицах или Презентациях, а потом добавить его URL на свою страницу в Google Сайтах. Подробнее о процедуре публикации…
Пример проекта
Для целей тестирования платформы Identity мы будем использовать простой проект ASP.NET MVC с названием Users. Выберите пустой шаблон (Empty) на этапе создания нового проекта:
После создания проекта нам необходимо будет добавить ссылки и клиентские библиотеки для работы с проектом. Мы будем использовать библиотеку Bootstrap для стилизации приложения, поэтому введите следующую команду в окно Package Manager Console среды Visual Studio и нажмите клавишу Enter:
Install-Package -version 3.0.3 bootstrap
Теперь необходимо добавить в приложение контроллер Home, который в дальнейшем будет содержать код примеров. Определение контроллера приведено в примере ниже. Мы будем использовать этот контроллер для работы с учетными данными пользователей. Метод действия Index() возвращает представление для главной страницы приложения:
Далее создайте представление, щелкнув правой кнопкой мыши по названию метода Index() и выбрав в контекстном меню команду Add View. В появившемся модальном окне задайте имя представления Index и выберите пустой шаблон представления без модели (Template to Empty (without model)). Когда вы щелкните по кнопке Add, в приложение будет добавлено представление Index.cshtml (в папке ~/Views/Home), а также будет добавлен файл компоновки ~/Views/Shared/_Layout.cshtml. Мы будем использовать базовую компоновку для всех представлений. Ниже показано содержимое этого файла:
Ниже показана разметка представления Index.cshtml:
Чтобы проверить на данном этапе работоспособность приложения, щелкните по кнопке Start Debugging (F5) в среде Visual Studio и в открывшейся вкладке вашего браузера перейдите по адресу /Home/Index (если маршрутизация по умолчанию не редактировалась (файл ~/App_Start_RouteConfig.cs), то можно запустить эту же страницу по адресу /). Результат показан на рисунке ниже:
Объявления using
Один из способов уменьшить повторение ввода снова и снова – использовать инструкцию объявления . Объявление позволяет нам использовать неполное имя (без области видимости) в качестве псевдонима для полного имени.
Вот наша базовая программа Hello world, в которой используется объявление в строке 5:
Объявление с использованием ; сообщает компилятору, что мы собираемся использовать объект из пространства имен . Поэтому всякий раз, когда он видит , он предполагает, что мы имеем в виду . Если существует конфликт имен между и каким-либо другим использованием , предпочтительнее использовать . Поэтому в строке 6 мы можем ввести вместо .
В этом тривиальном примере это не сэкономит много усилий, но если вы много раз используете внутри функции, объявление может сделать ваш код более читабельным
Обратите внимание, что вам потребуется отдельное объявление для каждого имени (например, одно для , одно для и т.д.)
Хотя этот метод менее явный, чем использование префикса , он обычно считается безопасным и приемлемым (при использовании внутри функции).
Быстродействие SQLDataReader
Сравнительный тест быстродействия двух вариантов команд с включенным и отключенным пулингом соединений. В первом варианте выполняется команда запроса к одной таблице с повтором 100 раз. Во втором варианте выполняется команда запроса данных у 30 таблиц одновременно, также с повтором 100 раз.
Первое подключение к базе данных:
При первом соединении с базой данных одиночная команда с пулингом выполняется почти в 2 раза дольше, чем с отключёнными пулами. Сложные команды выполняются практически одинаковое время. Логично предположить, что дополнительное время затрачивается на создание пула.
Последующие запросы к базе данных:
Последующие запросы показывают эффективность «пуловой» оптимизации подключений технологии ADO.NET. Одиночные команды выполняются почти в 8 раз быстрее при использовании пулов подключений. В случае со сложными командами эффект использования оптимизации снижается, но всё равно без пулов запросы выполняются медленнее в 1,73 раза.
Проблемы с директивами using
Однако для современного кода C++ директивы дают немного выгоды (экономия на вводе текста) по сравнению с риском.
Поскольку директивы импортируют все имена из пространства имен (потенциально включая множество имен, которые вы никогда не будете использовать), вероятность возникновения конфликтов имен значительно возрастает (особенно, если вы импортируете пространство имен ).
Для наглядности рассмотрим пример, в котором директивы вызывают неоднозначность:
В приведенном выше примере компилятор не может определить, относится ли в к или . В этом случае код не будет скомпилирован из-за ошибки «ambiguous symbol» (неоднозначный символ). Мы могли бы решить эту проблему, удалив одну из инструкций , используя вместо нее объявление или определив с явным квалификатором области видимости ( или ).
Вот еще один более коварный пример:
В приведенном выше примере компилятор не может определить, наше использование означает или функцию , которую мы определили, и снова не сможет выполнить компиляцию из-за ошибки «неоднозначного символа». Хотя этот пример тривиален, если бы у нас был явный префикс , например:
или использовалось объявление вместо директивы :
тогда наша программа вообще не имела бы никаких проблем.
Даже если директивы не вызывают конфликтов имен сегодня, они делают код более уязвимым для будущих конфликтов. Например, если ваш код включает директиву для какой-либо библиотеки, которая затем обновляется, все новые имена, представленные в обновленной библиотеке, теперь являются кандидатами на конфликты имен с вашим существующим кодом.
Может возникнуть и более коварная проблема. В обновленной библиотеке может появиться функция, которая не только имеет то же имя, но и лучше подходит для некоторых вызовов функций. В таком случае компилятор может решить отдать предпочтение новой функции, и поведение вашей программы неожиданно изменится.
Рассмотрим следующую программу:
foolib.h:
main.cpp:
Эта программа запускается и печатает 1.
Теперь предположим, что мы обновляем библиотеку foolib, которая включает обновленный foolib.h. Наша программа теперь выглядит так:
foolib.h:
main.cpp:
Наш файл main.cpp вообще не изменился, но теперь эта программа запускается и выводит 2!
Когда компилятор встречает вызов функции, он должен определить, с каким определением функции он должен сопоставить этот вызов. При выборе функции из набора потенциально совпадающих функций он предпочтет ту функцию, которая не требует преобразования аргументов, а не ту, которая требует преобразования аргументов. Поскольку литерал 0 принадлежит целочисленному типу, C++ предпочтет сопоставить с недавно добавленной (без преобразований), а не с (требуется преобразование из int в double). Это вызывает неожиданное изменение результатов работы нашей программы.
Этого бы не произошло, если бы мы использовали объявление или явный квалификатор области видимости.
Отправка пакетных запросов индексирования
Чтобы уменьшить количество HTTP-соединений, которые должен выполнить ваш клиент, вы можете объединить до 100 запросов к Indexing API в один HTTP-запрос. Он состоит из нескольких частей и называется пакетом.
Пакетные запросы к Indexing API следует отправлять этой конечной точке:
https://indexing.googleapis.com/batch
Тело пакетного запроса состоит из нескольких частей. Каждая из них представляет собой полный HTTP-запрос с отдельным оператором, URL, заголовком и телом. Размер каждой части пакетного запроса не должен превышать 1 МБ.
Для более простой отправки пакетных запросов используйте клиентские библиотеки API Google. Чтобы узнать больше о создании пакетов с помощью библиотек для отдельных языков, перейдите по следующим ссылкам:
- Java
- Python
- JavaScript
- PHP
- .NET
Перед тем как использовать примеры с приведенных выше страниц, добавьте в код обязательные данные, указанные в статье Получение токена доступа.
В теле сообщения пакетного запроса, приведенного ниже, содержатся уведомления об обновлении и удалении:
POST /batch HTTP/1.1 Host: indexing.googleapis.com Content-Length: content_length Content-Type: multipart/mixed; boundary="===============7330845974216740156==" Authorization: Bearer oauth2_token --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+2> POST /v3/urlNotifications:publish Content-Type: application/json accept: application/json content-length: 58 { "url": "http://example.com/jobs/42", "type": "URL_UPDATED" } --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+1> POST /v3/urlNotifications:publish Content-Type: application/json accept: application/json content-length: 75 { "url": "http://example.com/widgets/1", "type": "URL_UPDATED" } --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+3> POST /v3/urlNotifications:publish Content-Type: application/json accept: application/json content-length: 58 { "url": "http://example.com/jobs/43", "type": "URL_DELETED" } --===============7330845974216740156==
Подробнее об отправке пакетных запросов…
Установка дополнения
Необходимо авторизироваться под учетной записью Gmail.com, которую вы используете для работы в Google Analytics и далее перейти по любой из следующих ссылок:
- sheet.new
- sheets.new
- spreadsheet.new
Отлично, у вас появилась новая таблица. Теперь потребуется поменять региональные настройки. Переходим в Файл — Настройки Таблицы и в списке региональные настройки меняем Россию на Соединенные штаты.
Процедура позволяет настроить правильное форматирование ячеек для чисел, дат и денежных величин при переносе данных из Google Analytics.
Нажимаем Сохранить настройки и переходим во вкладку Дополнения.
Здесь нам потребуется установить специальное дополнение для импорта данных из GA в Таблицу. Выбираем Установить дополнения и в появившемся списке находим Google Analytics.
В процессе установки дополнение запросит доступ к аккаунту Google. Обязательно принимаем запрос и подтверждаем. Готово!
Теперь во вкладке Дополнения вы увидите новое поле Google Analytics. При наведение курсора появляются команды:
- Create new report (Создать новый отчет);
- Run reports (Запустить отчет);
- Schedule reports (настройка автоматического обновления).
Выбираем Create new report, после чего по правому краю откроется окно с полями для заполнения. Здесь потребуется указать:
- Name Your Report — название будущего отчета.
- Select a view — нужный аккаунт GA — ресурс — представление (если ваш аккаунт общий, то данные подтянуться из GA автоматически);
- Choose configuration options — указываем необходимые для сбора параметры (dimensions) и показатели (metrics).
Важно! В одном отчете не может быть более 7 параметров и 10 показателей. Нажимаем Create Report и видим сформированную конфигурацию настроек нашего запроса
В соответствующих полях мы можем добавить дополнительные настройки сортировки или фильтры, указать временной интервал или лимит выгрузки данных
Нажимаем Create Report и видим сформированную конфигурацию настроек нашего запроса. В соответствующих полях мы можем добавить дополнительные настройки сортировки или фильтры, указать временной интервал или лимит выгрузки данных.
Давайте изменим настройки и зададим следующие параметры:
- 45daysAgo — Выгрузка данных за последние 45 дней в строке Start Date;
- -ga:users — В строке Order настраиваем сортировку пользователей по убыванию (сортировка по возрастанию настраивается параметром без знака минус ga:users);
- ga:users>5 — В строке Filters выводим города с которых было более пяти пользователей.
Подробнее почитать про настройки конфигурации можно .
Итоговая конфигурация будет выглядеть примерно так:
Переходим во вкладку Дополнения — Google Analytics — Run reports и получаем выгрузку данных с учетом указанным ранее параметров.
Теперь вы можете работать с выгруженными данными по своему усмотрению — редактировать, переносить в другие источники, строить на их базе графики и диаграммы.
Создание/обновление Google таблицы в Colab
- Создаем рабочую книгу с помощью метода объекта :
wb = gc.create('demo')
2. Как только она готова, можно ее посмотреть на sheets.google.com.
Загрузка таблиц из Colab в Google Tаблицы
3. Прежде всего, открываем рабочую книгу для записи в нее значений:
ws = gc.open('demo').sheet1
4. Затем выбираем ячейки для заполнения:
Обновление таблиц в Google Tаблицах в Colab (1)
5. Таким образом мы создаем список ячеек с индексами (R1C1) и значениями (на данный момент пустыми). Можно изменить отдельные ячейки, обновив их атрибут значения:
Обновление таблиц в Google Таблицах в Colab (2)
6. Для обновления этих ячеек в рабочей таблице применяем метод :
Обновление таблиц в Google Таблицах в Colab (3)
7. Все изменения отображаются в вашей Google таблице.
Просмотр изменений
Step 2: Choose who to share with & how they can use your file
Share with specific people
- Select the file you want to share.
- Click Share or Share .
- Under «Share with people and groups,» enter the email address you want to share with.
- To change what people can do to your doc, on the right, click the Down arrow Viewer, Commenter, or Editor.
- Choose to notify people.
- If you want to notify people that you shared a doc with them, check the box next to Notify people. If you notify people, each email address you enter will be included in the email.
- If you don’t want to notify people, uncheck the box.
- Click Share or Send.
Share a link to the file
- Select the file you want to share.
- Click Share or Share Get link.
- Under “Get Link”, click the Down arrow .
- Choose who to share the file with.
- To decide what people can do with your file when you share it, select Viewer, Commenter, or Editor
Learn more about how others view, comment, or edit files.
.
- Click Copy link Done.
- Copy and paste the link in an email or any place you want to share it.
Share a file publicly
- Select the file you want to share.
- Click Share or Share Get link.
- Under “Get Link,” click Change to anyone with link.
- To decide what people can do with your public link when you share it, select Viewer, Commenter, or Editor.
- Click Done.
- Copy and paste the link in an email or any place you want to share it.
People who aren’t signed in to a Google Account show up as anonymous animals in your file. Learn more about anonymous animals.
Полные и неполные имена
Имя может быть полным или неполным.
Полное имя – это имя, которое включает в себя связанную область видимости. Чаще всего имена дополняются пространством имен с помощью оператора разрешения области видимости (). Например:
Для продвинутых читателей
Имя также может быть уточнено именем класса с помощью оператора разрешения области () или объектом класса с помощью операторов выбора члена ( или ). Например:
Неполное имя – это имя, которое не включает в себя квалификатор области видимости. Например, и являются неполными именами, поскольку они не включают связанную область видимости.
Класс пользователя
Первый класс который мы создадим, описывает сущность пользователя приложения. Этот класс должен быть унаследован от класса IdentityUser, который определен в пространстве имен Microsoft.AspNet.Identity.EntityFramework. IdentityUser дает базовые представления о пользователе, которые могут быть расширены путем добавления свойств в производный класс. В таблице ниже описаны базовые свойства IdentityUser:
Свойство | Описание |
---|---|
Claims |
Возвращает данных с требованиями для пользователя |
Адрес электронной почты пользователя |
|
Id |
Уникальный идентификатор для пользователя |
Logins |
Коллекция логинов для пользователя |
PasswordHash |
Возвращает строку с хэшированным паролем пользователя |
Roles |
Список ролей, в которых находится пользователь |
PhoneNumber |
Номер телефона пользователя |
SecurityStamp |
Возвращает значение, которое обновляется когда были изменены любые данные пользователя (например, пароль) |
UserName |
Имя пользователя |
Классы, определенные в пространстве имен Microsoft.AspNet.Identity.EntityFramework являются конкретными реализациями интерфейсов из пространства имен Microsoft.AspNet.Identity. Например, класс IdentityUser реализует интерфейс IUser. Я использую конкретные классы, реализованные по умолчанию, т. к. работаю с Entity Framework в качестве основы работы с Identity. Вы можете встретить другие реализации интерфейсов из пространства имен Microsoft.AspNet.Identity, которые используют разные способы взаимодействия с источником данных (не обязательно с базой данных), а также можете создать собственные реализации этих интерфейсов.
Важно отметить, что класс IdentityUser предоставляет только базовые данные о пользователе: имя, логин, почта и т. д. Если вы захотите добавить какую-нибудь дополнительную информацию о пользователе, вам необходимо будет добавить дополнительные свойства в класс, унаследованный от IdentityUser
Я покажу как это сделать позже.
Чтобы создать пользовательский класс для приложения, добавьте файл AppUserModels.cs в папку Models. В этом файле создайте класс AppUser, как показано в примере ниже:
Это все, что нам нужно на данный момент, но мы вернемся к определению этого класса в одной из последующих статей, где я покажу вам, как нужно добавлять произвольные свойства для описания пользователей.
Как добавить сервисный аккаунт в качестве владельца сайта
Выполните следующие действия:
- При помощи Search Console подтвердите, что сайт принадлежит вам.
- Добавьте сервисный аккаунт, созданный на предыдущем этапе, в качестве владельца.
1. Подтвердите, что сайт принадлежит вам
Подтвердите, что вы являетесь владельцем сайта,
любым из способов, доступных в Search Console. Затем создайте доменный ресурс (example.com) или ресурс с префиксом в URL (https://example.com или https://example.com/some/path/).
Ресурсы представляют сайты в Search Console.
2. Предоставьте сервисному аккаунту статус владельца
Добавьте сервисный аккаунт в качестве владельца сайта. Вот как это сделать:
- Откройте Центр веб-мастеров.
- Выберите ресурс, право собственности на который вы подтвердили.
- В списке Подтвержденные владельцы нажмите Добавить владельца.
- Укажите адрес электронной почты, который связан с сервисным аккаунтом. Ему будут присвоены права делегированного владельца. Где можно найти этот адрес:
- в поле в закрытом ключе JSON, скачанном вами при ;
- в столбце Service account ID (Идентификатор сервисного аккаунта) раздела Service Accounts (Сервисные аккаунты) в Developers Console.
Адрес электронной почты должен иметь следующий формат:Пример: my-service-account@test-project-42.google.com.iam.gserviceaccount.com