<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Воронин: заметки с тегом curl</title>
<link>https://voronin.one/tags/curl/</link>
<description>воронин, voronin, it</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>воронин, voronin, it</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>2 часть, «анализ, получение исходных данных»</title>
<guid isPermaLink="false">2</guid>
<link>https://voronin.one/all/analiz-poluchenie-ishodnyh-dannyh/</link>
<pubDate>Fri, 24 Sep 2021 12:30:50 +0300</pubDate>
<author></author>
<comments>https://voronin.one/all/analiz-poluchenie-ishodnyh-dannyh/</comments>
<description>
&lt;p&gt;&lt;a href="https://voronin.one/all/kak-nelzya-otnositsya-k-korporativnym-klientam/"&gt;1 часть, «как нельзя относиться к корпоративным клиентам»&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Всегда начинайте со сбора информации, это важно! Исходные данные определят направление и общую схему работы вашего решения.&lt;/p&gt;
&lt;p&gt;Любая задача решается по принципу «от общего к частному».&lt;/p&gt;
&lt;p&gt;давайте рассмотрим алгоритм действия администратора:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;регистрация пользователя на сайте graphisoft.com&lt;/li&gt;
&lt;li&gt;подтверждение регистрации в посте пользователя&lt;/li&gt;
&lt;li&gt;авторизация на сайте graphisoft.com под административной учетной записью&lt;/li&gt;
&lt;li&gt;отправка приглашения пользователю&lt;/li&gt;
&lt;li&gt;авторизация  на сайте graphisoft.com под пользовательской учетной записью&lt;/li&gt;
&lt;li&gt;подтверждение приглашения&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://voronin.one/pictures/izobrazhenie_2021-09-24_111857.png" width="300" height="179" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Вроде, не сложно...  да и в процессе тестовой регистрации я не заметил использования captcha. Это очень важно, иначе полная автоматизация была бы невозможна.&lt;/p&gt;
&lt;p&gt;Какие данные нам нужны, чтобы проделать весь вышеописанный алгоритм?&lt;br /&gt;
данные пользователя:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;имя&lt;/li&gt;
&lt;li&gt;фамилия&lt;/li&gt;
&lt;li&gt;e-mail&lt;/li&gt;
&lt;li&gt;пароль (пароль будем генерировать с учетом требований безопасности graphisoft)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;данные администратора:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;e-mail&lt;/li&gt;
&lt;li&gt;пароль&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://voronin.one/pictures/izobrazhenie_2021-09-24_112041.png" width="300" height="236" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Осталось выбрать инструмент для реализации задуманного, я решил остановиться на php, т. к. у нас уже есть некий фундамент автоматизации рутинных процессов, который имеет web интерфейс и уже написан на php. В качестве хранилища информации выступит база MariaDB 10.&lt;/p&gt;
&lt;p&gt;Использовать будем curl, это «наше всё» для работы с web серверами.&lt;/p&gt;
&lt;p&gt;Начнем аккуратно, тут спешка не нужна, будем максимально повторять действия пользователя:&lt;br /&gt;
для начала откроем главную страницу и сохраним все cookies. Они будут, при первом открытии сайта вам сразу предложат принять cookie.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://voronin.one/pictures/izobrazhenie_2021-09-24_120651.png" width="677" height="142" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;файл для хранения cookie так и назовём «cookie.txt»&lt;/p&gt;
&lt;p&gt;очень удобно в браузере копировать все необходимые ключи для curl сразу в буфер обмена&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://voronin.one/pictures/izobrazhenie_2021-09-24_121005.png" width="767" height="557" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;curl &amp;#039;https://graphisoftid.graphisoft.com/&amp;#039; \
  -H &amp;#039;Connection: keep-alive&amp;#039; \
  -H &amp;#039;sec-ch-ua: &amp;quot; Not;A Brand&amp;quot;;v=&amp;quot;99&amp;quot;, &amp;quot;Opera&amp;quot;;v=&amp;quot;79&amp;quot;, &amp;quot;Chromium&amp;quot;;v=&amp;quot;93&amp;quot;&amp;#039; \
  -H &amp;#039;sec-ch-ua-mobile: ?0&amp;#039; \
  -H &amp;#039;sec-ch-ua-platform: &amp;quot;Windows&amp;quot;&amp;#039; \
  -H &amp;#039;DNT: 1&amp;#039; \
  -H &amp;#039;Upgrade-Insecure-Requests: 1&amp;#039; \
  -H &amp;#039;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&amp;#039; \
  -H &amp;#039;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&amp;#039; \
  -H &amp;#039;Sec-Fetch-Site: none&amp;#039; \
  -H &amp;#039;Sec-Fetch-Mode: navigate&amp;#039; \
  -H &amp;#039;Sec-Fetch-User: ?1&amp;#039; \
  -H &amp;#039;Sec-Fetch-Dest: document&amp;#039; \
  -H &amp;#039;Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7&amp;#039; \
  --compressed&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;для ленивых предлагаю воспользоваться online сервисом &lt;a href="https://incarnate.github.io/curl-to-php/"&gt;https://incarnate.github.io/curl-to-php/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Сконвертируем ключи командной строки curl в код php и получим следующее:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, &amp;#039;https://graphisoftid.graphisoft.com/&amp;#039;);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;#039;GET&amp;#039;);

curl_setopt($ch, CURLOPT_ENCODING, &amp;#039;gzip, deflate&amp;#039;);

$headers = array();
$headers[] = &amp;#039;Connection: keep-alive&amp;#039;;
$headers[] = &amp;#039;Sec-Ch-Ua: \&amp;quot; Not;A Brand\&amp;quot;;v=\&amp;quot;99\&amp;quot;, \&amp;quot;Opera\&amp;quot;;v=\&amp;quot;79\&amp;quot;, \&amp;quot;Chromium\&amp;quot;;v=\&amp;quot;93\&amp;quot;&amp;#039;;
$headers[] = &amp;#039;Sec-Ch-Ua-Mobile: ?0&amp;#039;;
$headers[] = &amp;#039;Sec-Ch-Ua-Platform: \&amp;quot;Windows\&amp;quot;&amp;#039;;
$headers[] = &amp;#039;Dnt: 1&amp;#039;;
$headers[] = &amp;#039;Upgrade-Insecure-Requests: 1&amp;#039;;
$headers[] = &amp;#039;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&amp;#039;;
$headers[] = &amp;#039;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&amp;#039;;
$headers[] = &amp;#039;Sec-Fetch-Site: none&amp;#039;;
$headers[] = &amp;#039;Sec-Fetch-Mode: navigate&amp;#039;;
$headers[] = &amp;#039;Sec-Fetch-User: ?1&amp;#039;;
$headers[] = &amp;#039;Sec-Fetch-Dest: document&amp;#039;;
$headers[] = &amp;#039;Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7&amp;#039;;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo &amp;#039;Error:&amp;#039; . curl_error($ch);
}
curl_close($ch);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;осталось рассмотреть механизм php работы с почтовым ящиком, нам нужен по сути только механизм IMAP, не буду вас сильно грузить, оставлю готовый скрипт, который открывает почтовый ящик пользователя в режиме readonly и находит последнее письмо (если их несколько) от «register-noreply@graphisoft.com», расшифровывает тело письма и вытаскивает код подтверждения. Результатом работы скрипта будет ссылка на подтверждение регистрации или ничего, если письма не было.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php

$auth_mail = &amp;#039;username@mail.com&amp;#039;;
$auth_pass = &amp;#039;P@$$woRd&amp;#039;;

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

$imap   = imap_open(&amp;#039;{imap.mail.com:993/imap/ssl}INBOX&amp;#039;, $auth_mail, $auth_pass, OP_READONLY);
if ($imap) {
$some = imap_search($imap, &amp;#039;FROM &amp;quot;register-noreply@graphisoft.com&amp;quot;&amp;#039;, SE_UID);
if (count($some)&amp;gt;0) {
$mail_body = base64_decode(imap_body($imap, $some[0]));
$key = get_string_between($mail_body,&amp;#039;&amp;lt;span style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;&amp;#039;,&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;);
echo &amp;#039;https://graphisoftid.graphisoft.com/#/verification/&amp;#039;.$key.&amp;quot;\n&amp;quot;;
}
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вроде, все попробовали, ко всему готовы... В процессе реализации обязательно что-то всплывёт... но, в целом мы готовы!&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://voronin.one/pictures/izobrazhenie_2021-09-24_122739.png" width="300" height="230" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://voronin.one/all/kropotlivaya-rabota-i-dolgozhdanny-uspeh/"&gt;3 часть, «кропотливая работа и долгожданный успех»&lt;/a&gt;&lt;/p&gt;
</description>
</item>


</channel>
</rss>