Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 849

Http запросы. easyhttp

18.05.2018, 13:00. Показов 1347. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане!
Я делаю программу для автоматизации действий на сайте. Использую язык C#, библиотеку easyhttp. Easyhttp- просто оболочка на C#, помогающая строить пакеты.
Я хотел бы сделать приложение максимально быстрым, поэтому решил использовать пакеты GET POST. До этого я пытался всё это сделать через встроенный в моё приложение браузер cefcharp и запросы с помощью командной строки через Java к нему. Это оказалось слишком сложно, поэтому я отказался от этой идеи, хотя я уже научился открывать все нужные мне вкладки.

Я делал много манипуляций и нашёл базовое окно авторизации:
https://avanpost.ca.local/PkiClient/Auth .

Когда я делаю запрос к этому сайту в своей программе, то он возвращает следующий заголовок ответа:

Pragma : no-cache
X-Content-Type-Options : nosniff
X-Frame-Options : SAMEORIGIN
Content-Security-Policy : default-src 'self'; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src *; report-uri https://avanpost.ca.local/oauthjwt/csp/report
X-Content-Security-Policy : default-src 'self'; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src *; report-uri https://avanpost.ca.local/oauthjwt/csp/report
Content-Length : 4859
Cache-Control : no-store, no-cache, max-age=0, private
Content-Type : text/html; charset=utf-8
Date : Thu, 17 May 2018 08:28:19 GMT
Set-Cookie : idsrv.xsrf=x40YjHQfDliC … dNGIrhm405oAfFbr5zXVoqU; path=/oauthjwt; secure; HttpOnly
Server : Microsoft-IIS/8.5
X-AspNet-Version : 4.0.30319
X-Powered-By : ASP.NET

Также присылается в теле ответа форма для авторизации. В ней нет ничего интересного кроме скрипта:

HTML5
1
2
<script id='modelJson' type='application/json'>{&quot;loginUrl&quot;:&quot;/oauthjwt/login?signin=6523632f1c9e7fb6316694aaa447fa48&quot;,&quot;antiForgery&quot;:{&quot;name&quot;:&quot;idsrv.xsrf&quot;,&quot;value&quot;:&quot;3U0i7sLDrcI6NqqQNcYHTJkXXQsl9fZpvzfK5SUYuSCVXjiMRnA603WVhpjI8sydbiXI6IwBF9XqVwdgRM_d7JFkTAXMo0vvqmuzuHnnO9w&quot;},&quot;allowRememberMe&quot;:false,&quot;rememberMe&quot;:false,&quot;username&quot;:null,&quot;externalProviders&quot;:[],&quot;additionalLinks&quot;:null,&quot;clientName&quot;:&quot;pki&quot;,&quot;clientUrl&quot;:null,&quot;clientLogoUrl&quot;:null,&quot;errorMessage&quot;:null,&quot;requestId&quot;:&quot;feba94e6-bd7e-4d6c-b8a4-d5f457ae5e1b&quot;,&quot;siteUrl&quot;:&quot;https://avanpost.ca.local/oauthjwt/&quot;,&quot;siteName&quot;:&quot;Avanpost Identity Servise&quot;,&quot;currentUser&quot;:null,&quot;logoutUrl&quot;:&quot;https://avanpost.ca.local/oauthjwt/logout&quot;,&quot;custom&quot;:null}</script>
    <script src="/oauthjwt/assets/scripts.2.0.0.js"></script>
В ней есть интересная строка: ;/oauthjwt/login?signin=6523632f1c9e7fb6316694aaa44 7fa48 .
Дальше в программе я не могу пройти!

Что происходит в браузере. В браузере идёт автоперебрасывание какое-то. См прин 1. На нём идёт первый запрос HTML, затем какой-то лютый запрос на непонятно чём и затем опять HTML.
При этом в лютом запросе уже есть все нужные куки!
Есть параметры:
client_id pki
redirect_uri https://avanpost.ca.local/pkiclient/auth
response_type code
scope admin
state

Запрос:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate, br
Accept-Language ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Connection keep-alive
Host avanpost.ca.local
User-Agent Mozilla/5.0 (Windows NT 6.1; rv:46.0) Gecko/20100101 Firefox/46.0

Ответ:
Content-Length 0
Date Thu, 17 May 2018 09:48:37 GMT
Location https://avanpost.ca.local/oaut... 87b5794a89
Server Microsoft-IIS/8.5
Set-Cookie SignInMessage.6fa0e29651fc73cd4e24ae87b5 794a89=1w6tMri6JUdsZbh-M6Jv13UHFZJdW2ru67cf9xK_R52lBFyvuT8LsFQY pOQVQLY-l9yney7kNP9Z9M6a3pKYnt2_tE7oLKeg2X3iW5qN 5kFbW9Fa3_5BB86tR1aZxKAampToY3a5z3BQ23qo Ja3Bg-ixtG6kokrjFU1UQ0dQnnfpLKgQfpCpiy3TO4_y53 5qKsHrG4zyzHXu0Iru-D-zMRZTftnY32CVhuOx8jaaLXx_AVlMvVAsgw-olFMs3FHJEVVn1b1Lz9CON0Q86DqXZe3yKzPoIuT 1Ojdt-uNAlhkzFUlOXMQVTaxjI6t284PYEs6cxWvFB9bIS UQWnEOWaSiQctr73rdr-oV0p5pV6HKk6quz411dPhO3D_ruyRllHo0rrwLJ2 JJfLYcESJltKA; path=/oauthjwt; secure; HttpOnly
X-Powered-By ASP.NET



Далее в браузере я вижу как меня перекидывает по адресу: https://avanpost.ca.local/PkiC... aaa447fa48
И там уже есть куки эти?!??!?!?!?
Как мне получить вот эти куки не понятные. Это скорее всего исполняется скрипт. А мне как его выполнить?

Добавлено через 6 часов 23 минуты

Не по теме:



Ну как обычно. Всё смотрят и ничего не пишут. Почему??????????????????



Добавлено через 16 часов 28 минут
Цитата Сообщение от dan24 Посмотреть сообщение
Pragma : no-cache
X-Content-Type-Options : nosniff
X-Frame-Options : SAMEORIGIN
Только сейчас обратил внимание, что что-то в самом ответе не так. Он пишет: "nosniff". Т.е. мне кажеться, что сервак палит то, что я захожу с программы.

Добавлено через 15 секунд
Цитата Сообщение от dan24 Посмотреть сообщение
Pragma : no-cache
X-Content-Type-Options : nosniff
X-Frame-Options : SAMEORIGIN
Только сейчас обратил внимание, что что-то в самом ответе не так. Он пишет: "nosniff". Т.е. мне кажеться, что сервак палит то, что я захожу с программы.

Добавлено через 6 минут
А нет. Это просто защита. Но не от меня.
В общем так понимаю, что я должен что-то сделать с тем сертификатом, который пришёл ко мне с помощью того скрипта, что пришёл в форме.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2018, 13:00
Ответы с готовыми решениями:

Как получить http запросы?
Можно ли получит Http запросы, которые передаются с компа с помощью события. На пример, когда я открою браузер и захожу на...

www-http сниффер. Как отследить HTTP запросы?
Посмотрел я вот эту статью: http://www.cyberguru.ru/cpp-sources/network/primer-prostejshego-sniffera-dlya-windows-2000/xp.html ...

HTTP-запросы
Есть такой код отправки GET запроса на api.vk.com (взял лишь для примера): #include &lt;winsock2.h&gt; #include &lt;string&gt; #include...

8
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
18.05.2018, 16:19
Цитата Сообщение от dan24 Посмотреть сообщение
Ну как обычно. Всё смотрят и ничего не пишут. Почему??????????????????
Вероятно, дело в библиотеке, которую Вы используете... На вопросы, в которых используются какие то специфические библиотеки получить ответ (по крайней мере вразумительный, а не догадку) значительно сложнее. Ведь человек должен быть знаком с данной библиотекой и иметь опыт работы с ней. А разбираться с чем-либо ради того, чтобы написать ответ на форуме, думаю, мало кто решится...

А по теме... Проделайте, для начала, все необходимые действия в обычном браузере (желательно, предварительно удалить все данные об этом сайте или использовать приватный просмотр в Firefox) и смотрите, что происходит в каком-либо Http сниффере. Затем уже пытайтесь повторить все действия в программе. Вариантов почему сервер не отвечает так как надо - море. Дело может быть в заголовках, куках, редиректах, типах запросов и прочем... Тут можно только гадать...
0
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 849
18.05.2018, 17:33  [ТС]
Цитата Сообщение от Shogun31337 Посмотреть сообщение
А по теме... Проделайте, для начала, все необходимые действия в обычном браузере (желательно, предварительно удалить все данные об этом сайте или использовать приватный просмотр в Firefox) и смотрите, что происходит в каком-либо Http сниффере. Затем уже пытайтесь повторить все действия в программе. Вариантов почему сервер не отвечает так как надо - море. Дело может быть в заголовках, куках, редиректах, типах запросов и прочем... Тут можно только гадать...
Ну тут я уже начинаю понимать в чём дело. Тут очень хитрая авторизация. Сначала кидает на сайт с авторизацией, передаётся сертификат. Потом идёт какой-то запрос параметризированный. При этом до запроса в форме авторизации мы видим ссылку на какую-то джава функцию. Эта функция имеет просто не читаемый вид. Там явно обустификатор ( как это слово вообще правильно писать? ) постарался. И вот уже появляется огромный куки. И нас перекидывает на страничку с одноразовым идентификатором, страничка становится HTTPS.
В общем я скоро прины все выложу. Пока копаю в сторону исполнения этого джаваскрипта.


Не по теме:

Да я похоже не там тему разместил. Надо было её в разделе "джава и сети" размещать. Тут дело даже не в библиотеке на C#, а именно в запросах. А в запросах много кто шарить должен по идеи.

0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
18.05.2018, 18:18
Цитата Сообщение от dan24 Посмотреть сообщение
При этом до запроса в форме авторизации мы видим ссылку на какую-то джава функцию.
Не факт, что эта функция имеет значение. Во многих случаях js (я думаю, что там именно js, а не java) используется для создания интерфейса. Хотя, может быть и для получения каких-либо данных. Сложно сказать однозначно. В любом случае, ее стоит рассматривать только если в запросах появляются какие-либо параметры, возникающие неизвестно откуда.

Цитата Сообщение от dan24 Посмотреть сообщение
обустификатор ( как это слово вообще правильно писать? )
обфускатор

Цитата Сообщение от dan24 Посмотреть сообщение
Пока копаю в сторону исполнения этого джаваскрипта
Сначала просмотрите параметры, которые передаются в запросах. Откуда они берутся. Возможно, что получится обойтись и без анализа этой функции. У меня, к примеру, была похожая ситуация и все параметры брались из тела Html, так что в js копаться не пришлось...

Добавлено через 1 минуту
Цитата Сообщение от dan24 Посмотреть сообщение
А в запросах много кто шарить должен по идеи.
Так сформировать запрос то - не проблема! Главное знать что откуда берется!
0
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 849
18.05.2018, 19:21  [ТС]
Вот сессия из браузера.
Там есть 2-ой запрос параметризированный. Вот он пока загадка для меня. Я научился добывать спец страницу, но не огромные куки.
Вот страница сайта:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<!DOCTYPE html>
<html ng-app="app" ng-csp ng-controller="LayoutCtrl">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Avanpost Identity Servise</title>
    <link href='/oauthjwt/assets/styles.min.css' rel='stylesheet'>
 
</head>
<body lang="en" class="main">
    <nav class="navbar navbar-inverse navbar-fixed-top" ng-show="model.currentUser">
        <div class="navbar-header">
            <a href="/oauthjwt/">
                <span class="navbar-brand">Avanpost Identity Servise</span>
            </a>
        </div>
        <ul class="nav navbar-nav" ng-show="model.currentUser" ng-cloak>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{model.currentUser}} <b class="caret"></b></a>
                <ul class="dropdown-menu">
                    <li><a href="{{model.logoutUrl}}">Logout</a></li>
                    <li class="divider" ng-show="model.loginWithDifferentAccountUrl"></li>
                    <li><a href="{{model.loginWithDifferentAccountUrl}}" ng-show="model.loginWithDifferentAccountUrl">Login With Different Account</a></li>
                </ul>
            </li>
        </ul>
    </nav>
 
    <div class='container page-login' ng-cloak>
        <div class="row" ng-show="model.errorMessage">
    <div class="col-md-12 col-sm-12">
        <div class="alert alert-danger">
            <strong>Ошибка:</strong>
            {{model.errorMessage}}
        </div>
    </div>
</div>
 
<div class="col-md-offset-4 col-md-4 col-sm-4 col-sm-offset-4 col-xs-offset-4 col-xs-4" ng-show="model.loginUrl">
 
    
            
    <form name="form" method="post" action="{{model.loginUrl}}" class="form-login">
        <img src="/oauthjwt/content/i/avanpost_logo.png" class="center" alt="">
        <anti-forgery-token token="model.antiForgery"></anti-forgery-token>
 
        <input required name="username" autofocus id="username" type="text" class="form-control" placeholder="Логин" ng-model="model.username">
 
        <input required id="password" name="password" type="password" class="form-control" placeholder="Пароль" ng-model="model.password"autocomplete="off" focus-if="model.username">
 
        <!--<div class="input-group frmFlInput frmWidth5 frmInd15 login-remember" ng-show="model.allowRememberMe">
            <label for="rememberMe">
                <input type="checkbox" id="rememberMe" name="rememberMe" ng-model="model.rememberMe" value="true">
                <strong>Remember My Login</strong>
            </label>
        </div>-->
 
        <button type="submit" class="btn btn-lg btn-primary btn-block">
            Войти
        </button>
        <a class="btn btn-default btn-block" href="https://n5201-pwd.ca.local/RDWeb/Pages/ru-RU/password.aspx">Сменить пароль</a>
 
    </form>
            
        
    <ul class="list-unstyled">
        <li ng-repeat="link in model.additionalLinks"><a ng-href="{{link.href}}">{{link.text}}</a></li>
    </ul>
 
    
 
    <div class="col-md-6 col-sm-6 external-providers" ng-show="model.externalProviders.length">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">External Login</h3>
            </div>
            <div class="panel-body">
                <ul class="list-inline">
                    <li ng-repeat="provider in model.externalProviders">
                        <a class="btn btn-default" href="{{provider.href}}">{{provider.text}}</a>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</div>
 
    </div>
 
    <script id='modelJson' type='application/json'>{&quot;loginUrl&quot;:&quot;/oauthjwt/login?signin=6523632f1c9e7fb6316694aaa447fa48&quot;,&quot;antiForgery&quot;:{&quot;name&quot;:&quot;idsrv.xsrf&quot;,&quot;value&quot;:&quot;3U0i7sLDrcI6NqqQNcYHTJkXXQsl9fZpvzfK5SUYuSCVXjiMRnA603WVhpjI8sydbiXI6IwBF9XqVwdgRM_d7JFkTAXMo0vvqmuzuHnnO9w&quot;},&quot;allowRememberMe&quot;:false,&quot;rememberMe&quot;:false,&quot;username&quot;:null,&quot;externalProviders&quot;:[],&quot;additionalLinks&quot;:null,&quot;clientName&quot;:&quot;pki&quot;,&quot;clientUrl&quot;:null,&quot;clientLogoUrl&quot;:null,&quot;errorMessage&quot;:null,&quot;requestId&quot;:&quot;feba94e6-bd7e-4d6c-b8a4-d5f457ae5e1b&quot;,&quot;siteUrl&quot;:&quot;https://avanpost.ca.local/oauthjwt/&quot;,&quot;siteName&quot;:&quot;Avanpost Identity Servise&quot;,&quot;currentUser&quot;:null,&quot;logoutUrl&quot;:&quot;https://avanpost.ca.local/oauthjwt/logout&quot;,&quot;custom&quot;:null}</script>
    <script src="/oauthjwt/assets/scripts.2.0.0.js"></script>
    
    
</body>
</html>
 
************************************************************
Миниатюры
Http запросы. easyhttp   Http запросы. easyhttp   Http запросы. easyhttp  

Http запросы. easyhttp   Http запросы. easyhttp   Http запросы. easyhttp  

Http запросы. easyhttp  
Вложения
Тип файла: doc страничка.html.doc (4.8 Кб, 2 просмотров)
0
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 849
18.05.2018, 19:28  [ТС]
2-ая миниатюра е верна немного. В запросе также передаётся куки! Большой такой, который от сервака не приходил.
Тут его нет т.к. есть параметр восстановление сессии: keep-alive. Немного не так короче сделал(.
Скрипт огромен и явно делает что-то важное. Я не могу его вставить т.к. он занимает 250к символов.

Вот его начало:
JavaScript
1
2
3
///#source 1 1 libs/jquery/jquery-1.11.0.min.js
/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=f.....
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
18.05.2018, 19:38
Цитата Сообщение от dan24 Посмотреть сообщение
Там есть 2-ой запрос параметризированный. Вот он пока загадка для меня.
И в чем его загадочность?

Цитата Сообщение от dan24 Посмотреть сообщение
но не огромные куки.
А какая разница огромные они или нет? Или куки Вы в принципе не можете получить?

Добавлено через 4 минуты
Цитата Сообщение от dan24 Посмотреть сообщение
который от сервака не приходил
куки также могут устанавливаться скриптами, а не только приходить от сервера.

Цитата Сообщение от dan24 Посмотреть сообщение
явно делает что-то важное
Так это, насколько я понимаю, библиотека jQuery!
0
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 849
18.05.2018, 20:23  [ТС]
Цитата Сообщение от Shogun31337 Посмотреть сообщение
Так это, насколько я понимаю, библиотека jQuery!
Да и что это значит?
Мне надо передать в функцию логин и пароль да?

В ответ я пока получаю только какой-то сертификат.

Добавлено через 1 минуту
Set-Cookie : idsrv.xsrf=x40YjHQfDliC … dNGIrhm405oAfFbr5zXVoqU; path=/oauthjwt; secure; HttpOnly
вот что я получаю
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
18.05.2018, 21:50
Цитата Сообщение от dan24 Посмотреть сообщение
Да и что это значит?
Это значит, что это просто библиотека! Сама по себе она ничего не делает! В ней заложены функции для работы с сайтом, но все они вызываются в другом месте. Ковыряние в ней ничего не даст. Кроме того, можно и в более удобочитаемом виде исходники посмотреть, если есть желание с ней ознакомиться.

Цитата Сообщение от dan24 Посмотреть сообщение
вот что я получаю
И при чем тут сертификат? Это просто куки...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2018, 21:50
Помогаю со студенческими работами здесь

PHP http запросы
r = s.get(&quot;http://admin:tykerb99z@control.charles/session/export-json&quot;, proxies={'http': 'http://127.0.0.1:8899'}) ...

Angular js http запросы
Здравствуйте помогите пожалуйста backend написан на Spring MVC ответ сервера нужно обработать на ангуляре помогите написать запрос curl...

Не уходят HTTP запросы
Ребят, такая проблема: написал прогу давно уже, работает с HTTP (Post), так же в запросе используется JSon. Проблема в следующем: после...

Http post и get запросы
Доброго дня. Начал осваивать для себя кардинально новый раздел. Хочу делать из VB6 http post и get запросы. Есть у кого-нить...

POST запросы и http заголовки
Подскажите пожалуйста, как послать POST запросом заголовки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru