{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Воронин: заметки с тегом curl",
    "_rss_description": "воронин, voronin, it",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/voronin.one\/tags\/curl\/",
    "feed_url": "https:\/\/voronin.one\/tags\/curl\/json\/",
    "icon": "https:\/\/voronin.one\/pictures\/userpic\/userpic@2x.jpg?1658757233",
    "authors": [
        {
            "name": "Алексей Воронин",
            "url": "https:\/\/voronin.one\/",
            "avatar": "https:\/\/voronin.one\/pictures\/userpic\/userpic@2x.jpg?1658757233"
        }
    ],
    "items": [
        {
            "id": "2",
            "url": "https:\/\/voronin.one\/all\/analiz-poluchenie-ishodnyh-dannyh\/",
            "title": "2 часть, «анализ, получение исходных данных»",
            "content_html": "<p><a href=\"https:\/\/voronin.one\/all\/kak-nelzya-otnositsya-k-korporativnym-klientam\/\">1 часть, «как нельзя относиться к корпоративным клиентам»<\/a><\/p>\n<p>Всегда начинайте со сбора информации, это важно! Исходные данные определят направление и общую схему работы вашего решения.<\/p>\n<p>Любая задача решается по принципу «от общего к частному».<\/p>\n<p>давайте рассмотрим алгоритм действия администратора:<\/p>\n<ol start=\"1\">\n<li>регистрация пользователя на сайте graphisoft.com<\/li>\n<li>подтверждение регистрации в посте пользователя<\/li>\n<li>авторизация на сайте graphisoft.com под административной учетной записью<\/li>\n<li>отправка приглашения пользователю<\/li>\n<li>авторизация  на сайте graphisoft.com под пользовательской учетной записью<\/li>\n<li>подтверждение приглашения<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_111857.png\" width=\"300\" height=\"179\" alt=\"\" \/>\n<\/div>\n<p>Вроде, не сложно...  да и в процессе тестовой регистрации я не заметил использования captcha. Это очень важно, иначе полная автоматизация была бы невозможна.<\/p>\n<p>Какие данные нам нужны, чтобы проделать весь вышеописанный алгоритм?<br \/>\nданные пользователя:<\/p>\n<ul>\n<li>имя<\/li>\n<li>фамилия<\/li>\n<li>e-mail<\/li>\n<li>пароль (пароль будем генерировать с учетом требований безопасности graphisoft)<\/li>\n<\/ul>\n<p>данные администратора:<\/p>\n<ul>\n<li>e-mail<\/li>\n<li>пароль<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_112041.png\" width=\"300\" height=\"236\" alt=\"\" \/>\n<\/div>\n<p>Осталось выбрать инструмент для реализации задуманного, я решил остановиться на php, т. к. у нас уже есть некий фундамент автоматизации рутинных процессов, который имеет web интерфейс и уже написан на php. В качестве хранилища информации выступит база MariaDB 10.<\/p>\n<p>Использовать будем curl, это «наше всё» для работы с web серверами.<\/p>\n<p>Начнем аккуратно, тут спешка не нужна, будем максимально повторять действия пользователя:<br \/>\nдля начала откроем главную страницу и сохраним все cookies. Они будут, при первом открытии сайта вам сразу предложат принять cookie.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_120651.png\" width=\"677\" height=\"142\" alt=\"\" \/>\n<\/div>\n<p>файл для хранения cookie так и назовём «cookie.txt»<\/p>\n<p>очень удобно в браузере копировать все необходимые ключи для curl сразу в буфер обмена<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_121005.png\" width=\"767\" height=\"557\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">curl &#039;https:\/\/graphisoftid.graphisoft.com\/&#039; \\\n  -H &#039;Connection: keep-alive&#039; \\\n  -H &#039;sec-ch-ua: &quot; Not;A Brand&quot;;v=&quot;99&quot;, &quot;Opera&quot;;v=&quot;79&quot;, &quot;Chromium&quot;;v=&quot;93&quot;&#039; \\\n  -H &#039;sec-ch-ua-mobile: ?0&#039; \\\n  -H &#039;sec-ch-ua-platform: &quot;Windows&quot;&#039; \\\n  -H &#039;DNT: 1&#039; \\\n  -H &#039;Upgrade-Insecure-Requests: 1&#039; \\\n  -H &#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&#039; \\\n  -H &#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&#039; \\\n  -H &#039;Sec-Fetch-Site: none&#039; \\\n  -H &#039;Sec-Fetch-Mode: navigate&#039; \\\n  -H &#039;Sec-Fetch-User: ?1&#039; \\\n  -H &#039;Sec-Fetch-Dest: document&#039; \\\n  -H &#039;Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7&#039; \\\n  --compressed<\/code><\/pre><p>для ленивых предлагаю воспользоваться online сервисом <a href=\"https:\/\/incarnate.github.io\/curl-to-php\/\">https:\/\/incarnate.github.io\/curl-to-php\/<\/a><\/p>\n<p>Сконвертируем ключи командной строки curl в код php и получим следующее:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ Generated by curl-to-PHP: http:\/\/incarnate.github.io\/curl-to-php\/\n$ch = curl_init();\n\ncurl_setopt($ch, CURLOPT_URL, &#039;https:\/\/graphisoftid.graphisoft.com\/&#039;);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;GET&#039;);\n\ncurl_setopt($ch, CURLOPT_ENCODING, &#039;gzip, deflate&#039;);\n\n$headers = array();\n$headers[] = &#039;Connection: keep-alive&#039;;\n$headers[] = &#039;Sec-Ch-Ua: \\&quot; Not;A Brand\\&quot;;v=\\&quot;99\\&quot;, \\&quot;Opera\\&quot;;v=\\&quot;79\\&quot;, \\&quot;Chromium\\&quot;;v=\\&quot;93\\&quot;&#039;;\n$headers[] = &#039;Sec-Ch-Ua-Mobile: ?0&#039;;\n$headers[] = &#039;Sec-Ch-Ua-Platform: \\&quot;Windows\\&quot;&#039;;\n$headers[] = &#039;Dnt: 1&#039;;\n$headers[] = &#039;Upgrade-Insecure-Requests: 1&#039;;\n$headers[] = &#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&#039;;\n$headers[] = &#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&#039;;\n$headers[] = &#039;Sec-Fetch-Site: none&#039;;\n$headers[] = &#039;Sec-Fetch-Mode: navigate&#039;;\n$headers[] = &#039;Sec-Fetch-User: ?1&#039;;\n$headers[] = &#039;Sec-Fetch-Dest: document&#039;;\n$headers[] = &#039;Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7&#039;;\ncurl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n\n$result = curl_exec($ch);\nif (curl_errno($ch)) {\n    echo &#039;Error:&#039; . curl_error($ch);\n}\ncurl_close($ch);<\/code><\/pre><p>осталось рассмотреть механизм php работы с почтовым ящиком, нам нужен по сути только механизм IMAP, не буду вас сильно грузить, оставлю готовый скрипт, который открывает почтовый ящик пользователя в режиме readonly и находит последнее письмо (если их несколько) от «register-noreply@graphisoft.com», расшифровывает тело письма и вытаскивает код подтверждения. Результатом работы скрипта будет ссылка на подтверждение регистрации или ничего, если письма не было.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;?php\n\n$auth_mail = &#039;username@mail.com&#039;;\n$auth_pass = &#039;P@$$woRd&#039;;\n\nfunction get_string_between($string, $start, $end){\n    $string = &#039; &#039; . $string;\n    $ini = strpos($string, $start);\n    if ($ini == 0) return &#039;&#039;;\n    $ini += strlen($start);\n    $len = strpos($string, $end, $ini) - $ini;\n    return substr($string, $ini, $len);\n}\n\n$imap   = imap_open(&#039;{imap.mail.com:993\/imap\/ssl}INBOX&#039;, $auth_mail, $auth_pass, OP_READONLY);\nif ($imap) {\n\t$some = imap_search($imap, &#039;FROM &quot;register-noreply@graphisoft.com&quot;&#039;, SE_UID);\n\tif (count($some)&gt;0) {\n\t\t$mail_body = base64_decode(imap_body($imap, $some[0]));\n\t\t$key = get_string_between($mail_body,&#039;&lt;span style=&quot;font-weight:bold;&quot;&gt;&#039;,&#039;&lt;\/span&gt;&#039;);\n\t\techo &#039;https:\/\/graphisoftid.graphisoft.com\/#\/verification\/&#039;.$key.&quot;\\n&quot;;\n\t}\n}\n?&gt;<\/code><\/pre><p>Вроде, все попробовали, ко всему готовы... В процессе реализации обязательно что-то всплывёт... но, в целом мы готовы!<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_122739.png\" width=\"300\" height=\"230\" alt=\"\" \/>\n<\/div>\n<p><a href=\"https:\/\/voronin.one\/all\/kropotlivaya-rabota-i-dolgozhdanny-uspeh\/\">3 часть, «кропотливая работа и долгожданный успех»<\/a><\/p>\n",
            "date_published": "2021-09-24T12:30:50+03:00",
            "date_modified": "2021-09-24T17:46:11+03:00",
            "tags": [
                "curl",
                "Graphisoft",
                "id",
                "imap",
                "php",
                "автоматизация"
            ],
            "image": "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_111857.png",
            "_date_published_rfc2822": "Fri, 24 Sep 2021 12:30:50 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_111857.png",
                    "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_112041.png",
                    "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_120651.png",
                    "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_121005.png",
                    "https:\/\/voronin.one\/pictures\/izobrazhenie_2021-09-24_122739.png"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}