«Яндекс» впервые рассказал, как выдавал данные россиян по запросам властей Больше всего государство интересуется пользователями «Яндекс.Почты» и «Яндекс.Такси»
Анатолий Жданов / Коммерсант
«Яндекс» впервые раскрыл статистику по количеству запросов на передачу информации о своих пользователях, которые он получил от российских госорганов. За первое полугодие 2020 года государственные структуры направили в компанию более 15 тысяч обращений, и 84% из них компания удовлетворила. По российскому законодательству ФСБ, МВД и другие силовики могут подать любой компании запрос на предоставление данных, если это необходимо для оперативно-розыскной работы. Однако рассказывать о количестве таких обращений и тем более их содержании не принято во всех индустриях, кроме интернет-бизнеса. Среди иностранных компаний первым такую статистику еще 10 лет назад опубликовал Google, его примеру последовали Twitter, Facebook и крупнейшие интернет-сервисы. Среди крупных российских интернет-компаний сегодняшняя публикация «Яндекса» — это первый пример transparency report.
В первой половине 2020 года «Яндекс» получил от российских органов государственной власти 15,3 тысячи запросов на раскрытие данных пользователей сервисов компании. По 12,9 тысячи запросов компания предоставила информацию властям, а в оставшихся 2,4 тысячи случаев отказалась это делать. Об этом говорится в первом transparency report, выпущенном «Яндексом». Почему компания решила начать выпускать такие отчеты именно сейчас, в «Яндексе» не уточняют.
Что хотят знать спецслужбы
Больше всего запросов на выдачу данных поступило в отношении пользователей сервисов «Яндекс.Паспорт» и «Яндекс.Почта»: за полгода компания получила 8,8 тысячи обращений от госорганов и по 7,7 тысячи из них передала информацию.
«Яндекс.Паспорт» — это ключевой сервис для управления аккаунтом в «Яндексе», в нем хранятся все основные регистрационные данные пользователя: имя и фамилия, номер телефона, сведения о привязанных банковских картах, история входов в аккаунт и сведения об устройствах, с которых их совершали, привязанные аккаунты в соцсетях и ряд других сведений.
«Очень часто запросы к тому или иному сервису сводятся к предоставлению данных из „Яндекс.Паспорта“. Например, это может быть запрос о пользователе, который использовал один из сервисов „Яндекса“ для мошенничества», — сообщили «Медузе» в компании.
Что касается «Яндекс.Почты», то доступ к переписке пользователя компания предоставляет только по судебному решению, ограничивающему право человека на тайну переписки, подчеркивают в компании. «Без соответствующего решения суда такие сведения не могут быть выданы», — утверждают в «Яндексе». По данным судебного департамента при Верховном суде России, за 2019 год в российские суды поступило 514,7 тысячи запросов от правоохранительных органов на ограничение тайны переписки и телефонных переговоров, из которых 514,1 тысячи были удовлетворены.
Согласно действующему российскому законодательству, правоохранительные органы в рамках оперативно-разыскной деятельности могут обратиться в любую компанию с запросом на предоставление информации — соответствующие положения есть в законах «О полиции» и «Об оперативно-розыскной деятельности».
Полномочия запрашивать данные есть, например, у Федеральной службы безопасности, Министерства внутренних дел, Следственного комитета, прокуратуры, Федеральной антимонопольной службы, Федеральной таможенной службы, судов. Однако информацию о том, какие ведомства направили большую часть запросов в «Яндекс», в компании раскрыть отказались.
«„Яндекс“ обязан отвечать на все запросы, оформленные в соответствии с требованиями действующего законодательства. Если запрос приходит на бумаге, он должен быть оформлен на официальном бланке ведомства, содержать контакты и собственноручную подпись уполномоченного лица, а в ряде случаев еще и должен быть заверен оригинальным оттиском печати. Запрос в электронной форме считается обязательным для предоставления ответа только в том случае, если он заверен усиленной квалифицированной электронной подписью», — пояснили в компании.
На втором месте по числу запросов от госорганов — сервис «Яндекс.Такси»: за полгода госорганы направили 5,2 тысячи обращений с просьбой о предоставлении данных из этого сервиса, и компания передала информацию по 4,1 тысячи из них.
«Самое важное — и это касается любых наших сервисов — мы всегда выдаем минимально необходимые данные. Это всегда индивидуальный случай для каждого запроса. По „Яндекс.Такси“ это может быть, например, номер автомобиля и данные водителя», — заявил глава пресс-службы «Яндекса» Илья Грабовский.
Ранее издание Baza сообщало, что полицейские из отдела по контролю за оборотом наркотиков УВД по Западному административному округу Москвы, которые сейчас проходят обвиняемыми по делу журналиста Ивана Голунова, получили информацию об адресе его проживания, запросив историю его поездок у «Яндекс.Такси». Представитель сервиса тогда утверждал, что компания получила от полицейских официальный запрос, оформленный на бланке, и по закону должна была передать им эти сведения.
«Русская служба Би-би-си» также утверждала, что благодаря сведениям о поездках, полученным у «Яндекс.Такси», правоохранительные органы смогли найти киллера следователя по особо важным делам Евгении Шишкиной — предполагаемым заказчиком ее убийства был хакер Ярослав Сумбаев, в отношении которого она вела расследование.
Илья Грабовский из «Яндекса» подтверждает, что иногда госорганы могут запросить информацию о передвижениях пользователя и «если запрос пришел по официальному каналу и соответствует всем требованиям — мы обязаны раскрыть [информацию]».
«Отмечу еще, что маршрут может быть нужен в случаях, когда произошла какая-то авария, а виновник покинул место [ДТП]. Или вообще понять, был ли таксист на заказе „Яндекс.Такси“ или нет в это время», — приводит он пример.
На все остальные сервисы компании пришлось 1,2 тысячи запросов от госорганов, из которых компания удовлетворила более тысячи. Илья Грабовский пообещал, что «Яндекс» отныне будет публиковать transparency report каждые полгода.
Некоторые сервисы «Яндекса» — в частности, «Яндекс.Почта» и «Яндекс.Диск» — входят в реестр организаторов распространения информации (ОРИ), который ведет Роскомнадзор, и это накладывает на них дополнительные требования по взаимодействию с силовиками. Согласно так называемому закону Яровой, с 20 июля 2016 года Центр оперативно-технических мероприятий ФСБ может потребовать от любого сервиса из реестра ОРИ передать ему «информацию, необходимую для декодирования принимаемых, передаваемых, доставляемых и (или) обрабатываемых электронных сообщений пользователей сети интернет».
По сути, это означает передачу ключей, которые используются для шифрования переписки пользователей.
К «Яндексу» такие требования от ФСБ поступали в 2019 году, и управляющий директор компании Тигран Худавердян тогда заявлял, что у компании «есть решение проблемы». «Ситуация очень простая: есть закон Яровой, и все его должны исполнять. Наша задача — сделать так, чтобы соблюдение закона не противоречило приватности пользовательских данных», — говорил он. Подробности о том, какое решение было найдено, так никогда и не были раскрыты — Худавердян отказывался делать это, мотивируя отказ законодательными ограничениями. В действующих нормативных актах действительно указано, что компания не имеет права раскрывать информацию о фактах взаимодействия со спецслужбой по этому вопросу.
Кто еще раскрывает статистику запросов от госорганов
Крупнейшие международные интернет-компании уже давно регулярно публикуют свои transparency report, но в России среди лидеров рынка никто на это не решался.
До «Яндекса» это сделал только «Хабр» — интернет-портал для общения IT-специалистов. Компания опубликовала свой первый отчет в сентябре 2018 года, а в феврале 2020 года выложила сводный отчет за все года по всем проектам. Из него следует, что за 2013–2018 годы «Хабр» удовлетворил 30 запросов властей, а еще девять отклонил. За 2019 год в компанию пришло 14 обращений, и все они были удовлетворены. В основном обращения поступали от Роскомнадзора и МВД.
Неудачную попытку опубликовать transparency report предпринимала соцсеть «ВКонтакте» — в ответ на скандал, разразившийся вокруг передачи данных правоохранительным органам в 2018 году. Тогда стало известно сразу о нескольких уголовных делах за экстремизм и оскорбление чувств верующих, которые были заведены на пользователей «ВКонтакте» после того, как администрация соцсети выдала информацию о них силовикам. Управляющий директор «ВКонтакте» Андрей Рогозов тогда пообещал, что компания опубликует transparency report, чтобы «сделать процесс более прозрачным».
Однако в опубликованном затем документе «Политика работы с госорганами» не содержалось никаких данных о количестве обращений от госорганов.
Крупные зарубежные интернет-компании свои transparency report публикуют давно и регулярно — первой в 2010 году стал Google. В своем последнем отчете, за второе полугодие 2019-го (более поздние данные еще не публиковались), компания сообщила, что к ней поступили 81,7 тысячи запросов от госорганов со всего мира на предоставление пользовательских данных, из которых были частично удовлетворены только 74%, то есть около 60,4 тысячи. Большая часть всех запросов, а именно 26,1 тысячи, поступили в Google от госорганов США. От российских властей в компанию за этот период поступило только 258 обращений.
Apple во второй половине 2019 года получила 10,1 тысячи запросов от властей США и выдала им информацию по 8,6 тысячи из них. От российских госорганов в компанию за этот период поступило 1019 обращений, и компания удовлетворила 833 из них.
Facebook за тот же период получил 140,8 тысячи обращений от госорганов со всего мира, из них 51,1 тысячи поступили из США, и компания удовлетворила 88% таких запросов.
Из России в компанию за это время поступило только восемь запросов, и все они были удовлетворены.
Мария Коломыченко
Получить статистику за любые даты. API Яндекс Директ. Версия 5
Python 2 или 3 с использованием XML с библиотеками Requests и PyXB
После установки библиотеки PyXB будет доступна утилита для создания классов pyxbgen. Выполнить
pyxbgen -u https://api.direct.yandex.com/v5/reports.xsd -m directapi5reports
В результате будет сформировано два файла: _general.py и directapi5reports.py. Импортируйте файл directapi5reports.py в сценарий, чтобы сгенерировать действительные коды запроса XML. Для получения дополнительной информации см. http://pyxb.sourceforge.net.
В этом примере показан запрос к службе отчетов, а также обработка и вывод результатов. Режим формирования отчета выбирается автоматически. Если отчет добавляется в очередь в автономном режиме, выполняются повторные запросы.
Отчет содержит статистику показов, кликов и расходов по всем кампаниям рекламодателя за любой указанный период с группировкой по дате, названию кампании и местоположению пользователя.
Чтобы использовать пример, укажите токен доступа OAuth во входных данных. Для запроса от имени агентства также укажите логин клиента. В теле сообщения запроса укажите дату начала и окончания отчетного периода, а также имя отчета, уникальное среди отчетов рекламодателя.
# --*- кодировка: utf-8 --*-
запросы на импорт
из запросов.исключения импортировать ConnectionError
из времени импортировать сон
импортировать отчеты directapi5reports
импортировать pyxb
# Метод правильного анализа строк в кодировке UTF-8 как для Python 3, так и для Python 2
импорт системы
если sys.version_info < (3,):
защита и(х):
пытаться:
вернуть x.encode ("utf8")
кроме UnicodeDecodeError:
вернуть х
еще:
защита и(х):
если тип (x) == тип (b''):
вернуть x.decode('utf8')
еще:
вернуть х
# --- Входные данные ---
# Адрес службы отчетов для отправки XML-запросов (с учетом регистра)
ReportsURL = 'https://api.direct.yandex.com/v5/reports'
# Токен OAuth пользователя, от имени которого будут выполняться запросы
токен = 'ТОКЕН'
# Логин клиента рекламного агентства
# Обязательный параметр, если запросы делаются от имени рекламного агентства
clientLogin = 'CLIENT_LOGIN'
# --- Подготовка запроса ---
# Создание заголовков HTTP-запроса
заголовки = {
# Токен OAuth.
Слово Bearer должно быть использовано
"Авторизация": "Предъявитель" + токен,
# Логин клиента рекламного агентства
«Клиент-Логин»: clientLogin,
# Язык ответных сообщений
"Accept-Language": "ru",
# Режим формирования отчета
"режим обработки": "авто"
# Формат денежных значений в отчете
# "returnMoneyInMicros": "false",
# Не включать строку с названием отчета и диапазоном дат в отчет
# "skipReportHeader": "true",
# Не включать строку с именами столбцов в отчет
# "skipColumnHeader": "true",
# Не включать строку с количеством строк статистики в отчет
# "skipReportSummary": "true"
}
# Создание тела сообщения запроса
requestData = directapi5reports.ReportDefinition ()
# Критерии выбора данных
requestData.SelectionCriteria = pyxb.BIND()
requestData.SelectionCriteria.DateFrom = pyxb. ПРИВЯЗАТЬ ("START_DATE")
requestData.SelectionCriteria.
DateTo = pyxb. ПРИВЯЗАТЬ ("END_DATE")
# Поля, которые нужно получить в запросе
requestData.FieldNames = ["Дата", "CampaignName", "LocationOfPresenceName", "Показы", "Клики", "Стоимость"]
# Сортировать по возрастанию даты
requestData.OrderBy = [pyxb.BIND ("Дата", "ПО ВОЗРАСЧЕНИЮ")]
# Имя отчета
requestData.ReportName = u("REPORT_NAME")
# Тип отчета: статистика кампании
requestData.ReportType = "CAMPAIGN_PERFORMANCE_REPORT"
# Отчетный период: даты, указанные в параметрах DateFrom и DateTo
requestData.DateRangeType = "CUSTOM_DATE"
# Формат отчета
requestData.Format = "TSV"
# Вернуть цену за клик без НДС
requestData.IncludeVAT = "НЕТ"
# Вернуть цену за клик без скидки клиента
requestData.IncludeDiscount = "НЕТ"
# Преобразование данных в XML для запроса
ЗапросДанные = ЗапросДанные.toxml()
# --- Запуск цикла выполнения запроса ---
# Если возвращается HTTP-код 200, выводим содержимое отчета
# Если возвращается HTTP-код 201 или 202, отправляем повторные запросы
пока верно:
пытаться:
req = request.
post (URL-адрес отчетов, requestData, заголовки = заголовки)
req.encoding = 'utf-8' # Обязательная обработка ответа в UTF-8
если требуется код_статуса == 400:
print("Неверные параметры запроса, либо очередь отчетов заполнена")
print("RequestId: {}".format(req.headers.get("RequestId",False)))
print("Код XML для запроса: {}".format(u(requestData)))
print("Код XML для ответа сервера: \n{}".format(u(req.text)))
сломать
Элиф Треб. код_статуса == 200:
print("Запрос успешно создан")
print("RequestId: {}".format(req.headers.get("RequestId", False)))
print("Результирующий файл отчета: \n{}".format(u(req.text)))
сломать
Элиф req.status_code == 201:
print("Отчет успешно добавлен в автономную очередь")
retryIn = int(req.headers.get("retryIn", 60))
print("Запрос будет отправлен повторно через {} секунд".format(retryIn))
print("RequestId: {}".
format(req.headers.get("RequestId", False)))
спать (повторить попытку)
Элиф req.status_code == 202:
print("Отчет создается в автономном режиме")
retryIn = int(req.headers.get("retryIn", 60))
print("Запрос будет отправлен повторно через {} секунд".format(retryIn))
print("RequestId: {}".format(req.headers.get("RequestId", False)))
спать (повторить попытку)
Элиф req.status_code == 500:
print("При создании отчета произошла ошибка. Повторите попытку позже.")
print("RequestId: {}".format(req.headers.get("RequestId",False)))
print("Код XML для ответа сервера: \n {}".format(u(req.text)))
сломать
Элиф Треб. код_статуса == 502:
print("Превышен лимит сервера на время создания отчета.")
print("Пожалуйста, попробуйте изменить параметры запроса: уменьшите период времени и объем запрашиваемых данных.")
print("Код XML для запроса: {}".
format(requestData))
print("RequestId: {}".format(req.headers.get("RequestId",False)))
print("Код XML для ответа сервера: \n {}".format(u(req.text)))
сломать
еще:
print("Непредвиденная ошибка")
print("RequestId: {}".format(req.headers.get("RequestId", False)))
print("Код XML для запроса: {}".format(requestData))
print("Код XML для ответа сервера: \n {}".format(u(req.text)))
сломать
# Обработка ошибок, если не было установлено соединение с API-сервером Яндекс Директ.
кроме ConnectionError:
# В этом случае мы рекомендуем повторить запрос позже
print("Ошибка подключения к серверу API Яндекс Директ")
# Принудительный выход из цикла
сломать
# Если произошла какая-либо другая ошибка
кроме:
# В этом случае следует проанализировать действия приложения
print("Непредвиденная ошибка")
# Принудительный выход из цикла
перерыв Была ли статья полезна?
Как получить обновленную статистику.
API Яндекс Директ. Версия 5- Использовать метод Changes.check
- Использовать DataRangeType: AUTO
Статистика Яндекс Директ иногда обновляется и дополняется. Обычно данные стабилизируются в течение трех дней.
В исключительных случаях старая статистика может быть скорректирована. Обычно статистику корректируют, когда кликрейт снизился, а баланс кампании вырос, или при наличии общего аккаунта.
Это означает, что вы можете увидеть расхождение между полученной ранее статистикой и реальными данными в Яндекс Директ. Для обновления статистики в базе данных можно использовать один из следующих способов:
- Использовать метод Changes.check
- Использовать DataRangeType: AUTO
Примечание. Поправки к статистике обычно связаны с фильтрацией ложных кликов. Изменение данных Яндекс Метрики при использовании моделей атрибуции LSC и FC не является исправлением статистики (см. описание моделей атрибуции, используемых для расчета данных по целям Яндекс Метрики (см.
Возможные значения:
- \n
FC — Первый щелчок.
\nLC — Последний клик.
\nLSC — Последний значимый (непрямой) клик.
\nLYDC — Последний клик от Яндекс.Директа.
\n
Значение по умолчанию — LYDC.
Если указано несколько моделей атрибуции, данные выводятся отдельно для каждой модели.
Внимание. \n
При использовании моделей атрибуции LSC и FC датой сеанса является не дата фактического посещения сайта, а дата клика, который был источником сеанса. Это означает, что сессия и ее данные (глубина страницы, конверсия, доход и т. д.) отражаются в отчете, если дата клика попадает в отчетный период.
\n
При повторном формировании отчета за тот же период с теми же параметрами данные Яндекс.
Метрики в отчете могут измениться, если с момента последнего создания отчета были сеансы по кликам, совершенным во время отчетный период.
\n
Обязательный
Нет
«}}»> параметр).
Запускайте метод Changes.check ежедневно (или по выбранному вами расписанию), чтобы проверить, была ли скорректирована статистика:
{ "метод": "проверить", "параметры": { "CampaignIds": [...], /* Кампании, по которым вы отслеживаете статистику */ "Timestamp": "...", /* Временная метка, полученная для предыдущего вызова метода */ "FieldNames": ["CampaignsStat"] } }Метод возвращает параметр BorderDate для каждой кампании со статистикой, скорректированной после указанного времени.
Если статистика не корректировалась, получить статистику за последние три дня: в запросе отчета указать \n
Период, за который формируется отчет.
См. Отчетный период.\n
Обязательно
Да
«}}»> параметр LAST_3_DAYS. Сохраните новую статистику (за вчерашний день) в своей базе данных и обновите существующую статистику (за предыдущие два дня).
Если статистика была скорректирована, получить статистику, начиная с даты в BorderDate до вчерашней даты. Сохраните новую статистику (за вчерашний день) в своей базе данных и обновите существующую статистику (за предыдущие дни, начиная с BorderDate).
Получать статистику ежедневно, задав \n
Период, за который создается отчет. См. Отчетный период.
\n
Обязательно
Да
«}}»> на АВТО. Период времени для отчета выбирается автоматически в зависимости от корректировки статистики.
Не скорректировано: отчет создан за последние три дня.



Слово Bearer должно быть использовано
"Авторизация": "Предъявитель" + токен,
# Логин клиента рекламного агентства
«Клиент-Логин»: clientLogin,
# Язык ответных сообщений
"Accept-Language": "ru",
# Режим формирования отчета
"режим обработки": "авто"
# Формат денежных значений в отчете
# "returnMoneyInMicros": "false",
# Не включать строку с названием отчета и диапазоном дат в отчет
# "skipReportHeader": "true",
# Не включать строку с именами столбцов в отчет
# "skipColumnHeader": "true",
# Не включать строку с количеством строк статистики в отчет
# "skipReportSummary": "true"
}
# Создание тела сообщения запроса
requestData = directapi5reports.ReportDefinition ()
# Критерии выбора данных
requestData.SelectionCriteria = pyxb.BIND()
requestData.SelectionCriteria.DateFrom = pyxb. ПРИВЯЗАТЬ ("START_DATE")
requestData.SelectionCriteria.
post (URL-адрес отчетов, requestData, заголовки = заголовки)
req.encoding = 'utf-8' # Обязательная обработка ответа в UTF-8
если требуется код_статуса == 400:
print("Неверные параметры запроса, либо очередь отчетов заполнена")
print("RequestId: {}".format(req.headers.get("RequestId",False)))
print("Код XML для запроса: {}".format(u(requestData)))
print("Код XML для ответа сервера: \n{}".format(u(req.text)))
сломать
Элиф Треб. код_статуса == 200:
print("Запрос успешно создан")
print("RequestId: {}".format(req.headers.get("RequestId", False)))
print("Результирующий файл отчета: \n{}".format(u(req.text)))
сломать
Элиф req.status_code == 201:
print("Отчет успешно добавлен в автономную очередь")
retryIn = int(req.headers.get("retryIn", 60))
print("Запрос будет отправлен повторно через {} секунд".format(retryIn))
print("RequestId: {}".
format(requestData))
print("RequestId: {}".format(req.headers.get("RequestId",False)))
print("Код XML для ответа сервера: \n {}".format(u(req.text)))
сломать
еще:
print("Непредвиденная ошибка")
print("RequestId: {}".format(req.headers.get("RequestId", False)))
print("Код XML для запроса: {}".format(requestData))
print("Код XML для ответа сервера: \n {}".format(u(req.text)))
сломать
# Обработка ошибок, если не было установлено соединение с API-сервером Яндекс Директ.
кроме ConnectionError:
# В этом случае мы рекомендуем повторить запрос позже
print("Ошибка подключения к серверу API Яндекс Директ")
# Принудительный выход из цикла
сломать
# Если произошла какая-либо другая ошибка
кроме:
# В этом случае следует проанализировать действия приложения
print("Непредвиденная ошибка")
# Принудительный выход из цикла
перерыв
См. Отчетный период.