Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Wolfdp
846 / 763 / 194
Регистрация: 15.06.2012
Сообщений: 2,974
Записей в блоге: 1
Завершенные тесты: 1
1

Проблемы с get запросом

17.08.2013, 17:09. Просмотров 737. Ответов 0
Метки нет (Все метки)

Суть задачи: делаю автор-авторизацию учетной записи для использования API сервиса dropbox. Уже более-менее разобрался с работой get/post запросов, но "воз и ныне там". Заголовки запросов и передаваемые данные смотрел через браузер Chrome. Весь код привел ниже. Проблема при повторном вызове метода GetRequest (82 строчка).

C#
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
using System.IO;
using DropNet;
using System.Reflection;
using System.Web;
 
namespace TestPostBack
{
    class Program
    {
        #region Const
 
        private const string API_KEY = "sqvwogpm2mbyier";
        private const string API_SECRET = "mblnb528uji8nm0";
        private const string LOGIN = "oleksandp01@gmail.com";
        private const string PASSWORD = "DarkenThanBlack";
 
        #endregion
 
        static void Main(string[] args)
        {
            try
            {
                DropboxTools s = new DropboxTools(API_KEY, API_SECRET, LOGIN, PASSWORD);
                Console.WriteLine("Nya!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.GetType().ToString());
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.ReadKey();
            }
        }
    }
}
C#
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
using System;
using System.Net;
using System.Web;
using System.IO;
using System.Text;
using DropNet;
 
 
namespace TestPostBack
{
    /// <summary>
    /// Инструмент для работы с сервисом dropbox.
    /// </summary>
    public class DropboxTools
    {
        /// <summary>
        /// API class.
        /// </summary>
        private DropNetClient _dropbox;
        /// <summary>
        /// ключ для API.
        /// </summary>
        private string _token;
        /// <summary>
        /// 
        /// </summary>
        private CookieContainer _cookie = new CookieContainer();
        /// <summary>
        /// Логин учетной записи dropbox.
        /// </summary>
        private string _login;
        /// <summary>
        /// Пароль учетной записи dropbox.
        /// </summary>
        private string _password;
 
        /// <summary>
        /// Конструктор класса. Инициализирует соединение сервиса с указанным аккаунтом.
        /// </summary>
        /// <param name="apiKey">Ключ приложения.</param>
        /// <param name="apiSecret">Пароль приложения.</param>
        /// <param name="login">Логин учетной записи dropbox.</param>
        /// <param name="password">Пароль учетной записи dropbox.</param>
        public DropboxTools(string apiKey, string apiSecret, string login, string password)
        {
            this._dropbox = new DropNetClient(apiKey, apiSecret);
            this._token = this._dropbox.GetToken().Token;
            this._login = HttpUtility.UrlEncode(login);
            this._password = HttpUtility.UrlEncode(password);
            this.Init();
            var nya = this._dropbox.GetAccessToken();
        }
 
        /// <summary>
        /// Метод инициализации API для конкретного пользователя.
        /// </summary>
        private void Init()
        {
            // Запрашиваем страницу авторизации (входа)
            string url = "https://www.dropbox.com/login?cont=https%3A//www.dropbox.com/1/oauth/authorize%3Foauth_token%3D"
                    + this._token
                    + "&signup_tag=oauth&signup_data=386513";
            string request_id = this.GetRequest(url, this.SetGetLogin);
 
            // отсылаем тайминг
            string timeUrl = "&url=https%3A%2F%2Fwww.dropbox.com%2Flogin%3Fcont%3Dhttps%253A%2F%2Fwww.dropbox.com%2F1%2Foauth%2Fauthorize%253Foauth_token%253D"
                + HttpUtility.UrlEncode(this._token) + "%26signup_tag%3Doauth%26signup_data%3D386513";
            string data = this.ParsingTimeLogin(request_id, timeUrl);
            this.Post("https://www.dropbox.com/web_timing_log", data, SetTime);
 
            // отсылаем логин-пароль
            data = this.ParsingLogin();
            this.Post("https://www.dropbox.com/login", data, SetLogin);
 
            // запрашиваем страничку авторизации API
 
            url = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + this._token;
 
            // проблема в этом методе
            // поток возвращает всего 6МБ, хотя сама страница должна быть на 20МБ (именно текстовая часть).
            // плюс если закинуть вывод в файл, то выводит неизвестную кодировку.
            request_id = this.GetRequest(url, this.SetGetApi);
 
            // что-то отправляем
            data = this.ParsingRetrieve();
            this.Post("https://www.dropbox.com/web/notifications/user/retrieve", data, SetRetrieve);
 
            // отправляем тайминг
            timeUrl = "&url=https%3A%2F%2Fwww.dropbox.com%2F1%2Foauth%2Fauthorize%3Foauth_token%3D"
                + HttpUtility.UrlEncode(this._token);
            data = this.ParsingTimeLogin(request_id, timeUrl);
            this.Post("https://www.dropbox.com/web_timing_log", data, SetTime);
 
            // ещё что-то отправляем
            data = this.ParsingInbox(request_id);
            this.Post("https://www.dropbox.com/inbox_count", data, SetInbox);
 
            // отправляем подтверждение авторизации API
            data = this.ParsingAuthorize();
            this.Post("https://www.dropbox.com/1/oauth/authorize", data, SetAPI);
            /////////////////////////////////
        }
 
        /// <summary>
        /// Метод запроса страницы с dropbox.
        /// </summary>
        /// <returns>возвращает индификатор отправленной страницы.</returns>
        private string GetRequest(string url, Action<HttpWebRequest> setRequest)
        {
            string id = string.Empty;
            var request = (HttpWebRequest)WebRequest.Create(url);
            setRequest(request);
            request.CookieContainer = this._cookie;
            using (var response = request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
            {
                id = GetId(reader);
                this.ReadToEnd(stream);
            }
            return id;
        }
 
        /// <summary>
        /// Отправка POST запроса с предварительной настройкой данных отправки.
        /// </summary>
        /// <param name="url">Адресс.</param>
        /// <param name="data">Данные для отправки.</param>
        /// <param name="setRequest">Метод предварительной настройки заголовка.</param>
        private void Post(string url, string data, Action<HttpWebRequest> setRequest)
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
 
            request.KeepAlive = false;
            request.CookieContainer = this._cookie;
            request.Host = "www.dropbox.com";
            request.Method = "POST";
            request.Timeout = 90000;
            request.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
            request.Headers.Add("Origin", "https://www.dropbox.com");
            request.Headers.Add("scheme", "https");
            request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36";
            request.Headers.Add("Cache-Control", "max-age=0");
            setRequest(request);
            byte[] sentData = Encoding.UTF8.GetBytes(data);
            request.ContentLength = sentData.Length;
 
            using (var sendStream = request.GetRequestStream())
            {
                sendStream.Write(sentData, 0, sentData.Length);
                using (var response = request.GetResponse())
                using (var stream = response.GetResponseStream())
                    this.ReadToEnd(stream);
            }
        }
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private long ReadToEnd(TextReader reader)
        {
            char[] buff = new char[1024];
            int count;
            long size = 0;
            while ((count = reader.Read(buff, 0, buff.Length)) > 0)
            {
                size += count;
            }
            return size;
        }
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        private long ReadToEnd(Stream stream)
        {
            byte[] buff = new byte[1024];
            int count;
            long size = 0;
            while ((count = stream.Read(buff, 0, buff.Length)) > 0)
            {
                size += count;
            }
            return size;
        }
 
        /// <summary>
        /// Метод получения индификатора страницы из потока загрузки.
        /// </summary>
        /// <param name="reader">Поток считывания полученой страницы из сервера.</param>
        /// <returns>Индификатор страницы в строковом представлении.</returns>
        private string GetId(StreamReader reader)
        {
            char[] buff = new char[1024];
            int count = 0;
            const string marker = "REQUEST_ID: \"";
            int i, j = 0;
            bool findId = false;
 
            while (findId == false && (count = reader.Read(buff, 0, buff.Length)) > 0)
            {
                for (i = 0; i < count; i++)
                {
                    if (buff[i] == marker[j])
                        j++;
                    else
                        j = 0;
                    if (j == marker.Length)
                    {
                        j = i + 1;
                        findId = true;
                        break;
                    }
                }
            }
 
            if (findId)
            {
                StringBuilder result = new StringBuilder();
                do
                {
                    for (i = j; i < count; i++)
                    {
                        if (buff[i] != '"')
                        {
                            result.Append(buff[i]);
                            j++;
                        }
                        else
                        {
                            findId = false;
                            break;
                        }
                    }
                    j = 0;
                }
                while (findId && (count = reader.Read(buff, 0, buff.Length)) > 0);
                return result.ToString();
            }
            else
                throw new Exception("No find REQUEST_ID in response page.");
        }
 
        #region parsing data
 
        /// <summary>
        /// Формирует данные тайминга для отправки на dropbox.
        /// </summary>
        /// <param name="request_id">Индификатор страницы.</param>
        /// <param name="url">Url страницы.</param>
        /// <returns>Возвращает данные для отправки в строковом представлении.</returns>
        private string ParsingTimeLogin(string request_id, string url)
        {
            var c = this._cookie.GetCookies(new Uri("https://dropbox.com"));
            string t = c["t"].Value;
            //string url = "&url=https%3A%2F%2Fwww.dropbox.com%2Flogin%3Fcont%3Dhttps%253A%2F%2Fwww.dropbox.com%2F1%2Foauth%2Fauthorize%253Foauth_token%253D"
            //    + HttpUtility.UrlEncode(this._token) + "%26signup_tag%3Doauth%26signup_data%3D386513";
 
            return "navigation_type=navigate" +
            "&redirect_time=3512" +
            "&connect_time=3515" +
            "&time_to_first_byte=4331" +
            "&dom_load_time=4685" +
            "&page_load_time=5355" +
            "&extra_columns=%7B%22is_spdy%22%3Atrue%7D" +
            url +
            "&request_id=" + request_id +
            "&source_type=web&t=" +
            t +
            "&is_xhr=true" +
            "&parent_request_id=" + request_id;
        }
 
        /// <summary>
        /// Формирует данные логирования для отправки на сервер.
        /// </summary>
        /// <param name="input"></param>
        /// <param name="token_aut"></param>
        /// <returns></returns>
        public string ParsingLogin()
        {
            string result = string.Empty;
 
            var c = this._cookie.GetCookies(new Uri("https://dropbox.com"));
            string t = c["t"].Value;
 
            // вытягиваю строку перенаправления
            string url = "&cont=https%3A%2F%2Fwww.dropbox.com%2F1%2Foauth%2Fauthorize%3Foauth_token%3D" + HttpUtility.UrlEncode(this._token);
            // складываю в dataString, который потом отправляется на сервер.
            return "t=" + t +
                "&lhs_type=default"
                + url +
                "&signup_tag=oauth" +
                "&signup_data=386513" +
                "&display=desktop" +
                "&login_email=" + _login +
                "&login_password=" + _password +
                "&login_submit=1" +
                "&login_submit_dummy=%D0%92%D0%BE%D0%B9%D1%82%D0%B8";
        }
 
        /// <summary>
        /// ФОрмирует данные для отправки запросса retrieve на dropbox.
        /// </summary>
        /// <returns>Данные для отправки в строковом представлении.</returns>
        private string ParsingRetrieve()
        {
            var c = this._cookie.GetCookies(new Uri("https://dropbox.com"));
            string t = c["t"].Value;
            return "count=100&t=" + t + "&is_xhr=true";
        }
 
        /// <summary>
        /// Формирует данные для отправки на запрос inbox на сервер dropbox
        /// </summary>
        /// <param name="request_id">Индификатор страницы.</param>
        /// <returns>Данные для отправки в строковом представлении.</returns>
        private string ParsingInbox(string request_id)
        {
            var c = this._cookie.GetCookies(new Uri("https://dropbox.com"));
            string t = c["t"].Value;
            return "t = " + t + "&is_xhr = true&parent_request_id=" + request_id;
        }
 
        /// <summary>
        /// Формирует данные для отправки команды подтверждения использования API.
        /// </summary>
        /// <returns>Данные для отправки в строковом представлении.</returns>
        private string ParsingAuthorize()
        {
            var c = this._cookie.GetCookies(new Uri("https://dropbox.com"));
            string t = c["t"].Value;
            return "t=" + t + "&allow_access=%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE&oauth_token=" + this._token;
        }
 
        #endregion
 
        #region set request
 
        /// <summary>
        /// Настройка отправки запроса тайминга.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetTime(HttpWebRequest request)
        {
            request.Referer = "https://www.dropbox.com/login?cont=https%3A//www.dropbox.com/1/oauth/authorize%3Foauth_token%3D"
                + HttpUtility.UrlEncode(this._token) + "&signup_tag=oauth&signup_data=386513";
            request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
            request.Headers.Add("url", "/web_timing_log");
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        }
 
        /// <summary>
        /// Настройка параметров отправки запроса логирования.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetLogin(HttpWebRequest request)
        {
            request.Referer = "https://www.dropbox.com/login?cont=https%3A//www.dropbox.com/1/oauth/authorize%3Foauth_token%3D" +
                this._token +
                "&signup_tag=oauth&signup_data=386513";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.Headers.Add("url", "/login");
            request.ContentType = "application/x-www-form-urlencoded";
        }
 
        /// <summary>
        /// Настройка параметров отправки retrieve.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetRetrieve(HttpWebRequest request)
        {
            request.Referer = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + this._token;
            request.Accept = "application/json, text/javascript, */*; q=0.01";
            request.Headers.Add("url", "/web/notifications/user/retrieve");
            request.Headers.Add("x-requested-with", "XMLHttpRequest");
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        }
 
        /// <summary>
        /// Настройка отправки inbox.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetInbox(HttpWebRequest request)
        {
            request.Referer = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + this._token;
            request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
            request.Headers.Add("url", "/inbox_count");
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        }
 
        /// <summary>
        /// Настройка отправки подтверждения API.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetAPI(HttpWebRequest request)
        {
            request.Referer = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + this._token;
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.Headers.Add("url", "/1/oauth/authorize");
            request.ContentType = "application/x-www-form-urlencoded";
        }
 
        /// <summary>
        /// Настройка... а, нифига он не далает XD
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetGetLogin(HttpWebRequest request)
        {
 
        }
 
        /// <summary>
        /// Настройка получения страницы с регистрацией API.
        /// </summary>
        /// <param name="request">Объект, который подлежит настройки.</param>
        private void SetGetApi(HttpWebRequest request)
        {
            request.Host = "www.dropbox.com";
            request.Method = "GET";
            request.Timeout = 90000;
            request.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
            request.Headers.Add("Origin", "https://www.dropbox.com");
            request.Headers.Add("scheme", "https");
            request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36";
            request.Headers.Add("Cache-Control", "max-age=0");
            request.Referer = "https://www.dropbox.com/login";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.Headers.Add("url", "/1/oauth/authorize?oauth_token=" + this._token);
            request.ContentType = "application/x-www-form-urlencoded";
        }
 
        #endregion
    }
}
0
Вложения
Тип файла: zip PostBackDropbox.zip (731.4 Кб, 2 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 17:09
Ответы с готовыми решениями:

Проблемы с POST запросом к сайту
Недавно меня заинтересовала возможность post запросов к сайтам. Кокретный сайт...

Проблема с запросом
Возникла проблемма не могу написать запрос чтобы в 3м поле при вводе номера...

Проблема с POST - запросом
Вообщем есть 10 потоков, задача каждого потока - послать пост запрос, тойсть в...

Медленно загружаются картинки GET запросом
public struct Partofpicture { public string ID; ...

Не получается отправить картинку запросом POST
Привет, замаялся уже - ну что я делаю не так? Отправляю я это вконтакте апи....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 17:09

Хочу разобраться с запросом к Базе Данных
Как при нажатии на кнопку, прибавлять очки к счету в бд? Как должен...

Проблема с Пост запросом отправка AMF
Дорогие пользователи форума... это моя первая тема сильно не судите:) У меня...

Есть ли возможность одним запросом увеличить значение поля на 1 ?
est li vozmozhnost odnim zaprosom uvelichit znachenie field(integer) na 1. ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru