Позднее Ctrl + ↑

2 часть, «анализ, получение исходных данных»

1 часть, «как нельзя относиться к корпоративным клиентам»

Всегда начинайте со сбора информации, это важно! Исходные данные определят направление и общую схему работы вашего решения.

Любая задача решается по принципу «от общего к частному».

давайте рассмотрим алгоритм действия администратора:

  1. регистрация пользователя на сайте graphisoft.com
  2. подтверждение регистрации в посте пользователя
  3. авторизация на сайте graphisoft.com под административной учетной записью
  4. отправка приглашения пользователю
  5. авторизация на сайте graphisoft.com под пользовательской учетной записью
  6. подтверждение приглашения

Вроде, не сложно... да и в процессе тестовой регистрации я не заметил использования captcha. Это очень важно, иначе полная автоматизация была бы невозможна.

Какие данные нам нужны, чтобы проделать весь вышеописанный алгоритм?
данные пользователя:

  • имя
  • фамилия
  • e-mail
  • пароль (пароль будем генерировать с учетом требований безопасности graphisoft)

данные администратора:

  • e-mail
  • пароль

Осталось выбрать инструмент для реализации задуманного, я решил остановиться на php, т. к. у нас уже есть некий фундамент автоматизации рутинных процессов, который имеет web интерфейс и уже написан на php. В качестве хранилища информации выступит база MariaDB 10.

Использовать будем curl, это «наше всё» для работы с web серверами.

Начнем аккуратно, тут спешка не нужна, будем максимально повторять действия пользователя:
для начала откроем главную страницу и сохраним все cookies. Они будут, при первом открытии сайта вам сразу предложат принять cookie.

файл для хранения cookie так и назовём «cookie.txt»

очень удобно в браузере копировать все необходимые ключи для curl сразу в буфер обмена

curl 'https://graphisoftid.graphisoft.com/' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not;A Brand";v="99", "Opera";v="79", "Chromium";v="93"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'DNT: 1' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 OPR/79.0.4143.50' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Sec-Fetch-Site: none' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' \
  --compressed

для ленивых предлагаю воспользоваться online сервисом https://incarnate.github.io/curl-to-php/

Сконвертируем ключи командной строки curl в код php и получим следующее:

// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://graphisoftid.graphisoft.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');

$headers = array();
$headers[] = 'Connection: keep-alive';
$headers[] = 'Sec-Ch-Ua: \" Not;A Brand\";v=\"99\", \"Opera\";v=\"79\", \"Chromium\";v=\"93\"';
$headers[] = 'Sec-Ch-Ua-Mobile: ?0';
$headers[] = 'Sec-Ch-Ua-Platform: \"Windows\"';
$headers[] = 'Dnt: 1';
$headers[] = 'Upgrade-Insecure-Requests: 1';
$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 OPR/79.0.4143.50';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9';
$headers[] = 'Sec-Fetch-Site: none';
$headers[] = 'Sec-Fetch-Mode: navigate';
$headers[] = 'Sec-Fetch-User: ?1';
$headers[] = 'Sec-Fetch-Dest: document';
$headers[] = 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

осталось рассмотреть механизм php работы с почтовым ящиком, нам нужен по сути только механизм IMAP, не буду вас сильно грузить, оставлю готовый скрипт, который открывает почтовый ящик пользователя в режиме readonly и находит последнее письмо (если их несколько) от «register-noreply@graphisoft.com», расшифровывает тело письма и вытаскивает код подтверждения. Результатом работы скрипта будет ссылка на подтверждение регистрации или ничего, если письма не было.

<?php

$auth_mail = 'username@mail.com';
$auth_pass = 'P@$$woRd';

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}

$imap   = imap_open('{imap.mail.com:993/imap/ssl}INBOX', $auth_mail, $auth_pass, OP_READONLY);
if ($imap) {
	$some = imap_search($imap, 'FROM "register-noreply@graphisoft.com"', SE_UID);
	if (count($some)>0) {
		$mail_body = base64_decode(imap_body($imap, $some[0]));
		$key = get_string_between($mail_body,'<span style="font-weight:bold;">','</span>');
		echo 'https://graphisoftid.graphisoft.com/#/verification/'.$key."\n";
	}
}
?>

Вроде, все попробовали, ко всему готовы... В процессе реализации обязательно что-то всплывёт... но, в целом мы готовы!

3 часть, «кропотливая работа и долгожданный успех»

1 часть, «как нельзя относиться к корпоративным клиентам»

Да, сегодня будет кинут камень в огород Graphisoft.

Небольшая предыстория из прошлого, как все начиналось...

Являясь руководителем IT отдела крупного архитектурного бюро столкнулся с неприятной ситуацией. Начиная с 25 версии ArchiCAD для работы сотруднику необходимо логинется под своим Graphisoft id.

— Ну, что же такого? спросите вы, многие вендоры просят авторизовываться в своих программных комплексах, вспомним Adobe или Autodesk. Но! Хотелось бы иметь какой-то адекватный механизм для массового создания учетных записей сотрудников, их как-никак около 150 человек.

Это, как вы себе представляете? Разослать инструкцию с картинками, чтобы каждый сотрудник сам, повторюсь, сам зашёл на сайт Graphisoft, заполнил форму, потом перешёл в свою почту и кликнув по ссылке из письма подтвердил регистрацию. Это утопия...
Даже половина не справится, кто-то скажет «не царское это дело», кто-то по скудоумию не осилит. Но, если даже 30% преодолеют — считайте успех. На самом деле — провал. ☹️

А в IT отделе нет таких ресурсов, чтобы каждого регистрировать вручную.

Беда...

Звонок другу? На разумный вопрос поддержка отвечает годным лайфхаком, годным с их точки зрения: «Сделайте один Graphisoft id на всю компанию и всех сотрудников под ним залогинте».

— извините, а что делать когда сотрудник уволится? менять пароль, и всем заново логинется в программе? Честно говоря, сомнительное предложение, с учётом сегодняшней текучки кадров. Я даже представил:

начало рабочего дня, массовая рассылка: — Внимание! Вчера уволился Пётр Архигад, перед началом работы в программе ArchiCAD всем перелогинеться!

И смешно и грустно, как мем, только наоборот.

Проблема есть, проблему надо решать...

Вызов принят, напоминаю, автоматизация — наше всё!

2 часть, «анализ, получение исходных данных»