Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2010, 17:04   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Twitter OAuth

Добрый день.
Суть вопроса в том, что никак не могу пройти авторизацию, а именно request_token. Т.е. самый первый шаг.
Прошу помощи и взгляда из стороны, так сказать.

Модуль для формирования запроса OAuth тянул здесь а формирую так (constumer key & secret они вбиты, и взяты из моего приложения на твиттере)

Код:
public enum Method { GET, POST };
        public string OAuthWebRequest(Method method, string url, string postData)
        {
            var timestamp = OAuthBase.CreateTimestamp().ToString(); // тут все ок, фомируется
            var nonce = OAuthBase.CreateNonce(); // аналогично
            var oauthParameters = new NameValueCollection
            {
                {"oauth_timestamp", timestamp},
                {"oauth_nonce", nonce},
                {"oauth_version", "1.0"},
                {"oauth_signature_method", "HMAC-SHA1"},
                {"oauth_consumer_key", ConsumerKey}
            };

            url = OAuthBase.NormalizeUrl(url);
            var parameters = OAuthBase.NormalizeRequestParameters(oauthParameters);
            var signatureBase = OAuthBase.ConcatenateRequestElements(method.ToString(), url, parameters);

            var signature = OAuthBase.CreateSignature(signatureBase, ConsumerSecret, TokenSecret); // разумеется сейчас TokenSecret = string.emty, но это так и должно быть.
            oauthParameters.Add("oauth_signature", signature);

            var header = new StringBuilder();
            header.Append("OAuth realm=\"\", ");
            for (var i = 0; i < oauthParameters.Count; i++)
            {
                var key = oauthParameters.GetKey(i);
                var pair = key + "=\"" + oauthParameters[key] + "\"";
                header.Append(pair);
                if (i < oauthParameters.Count - 1)
                {
                    header.Append(", ");
                }
            }

            System.Net.ServicePointManager.Expect100Continue = false;
            var request = (HttpWebRequest)WebRequest.Create(url); // просто перенаправил вбитый url
            request.Headers["Authorization"] = header.ToString(); // ну вроде бы, с виду, все идеально
            request.Method = method.ToString();
            if (method == Method.POST) // можно не рассматривать, мы шлем GET запрос
            {
                request.ContentType = "application/x-www-form-urlencoded";
                StreamWriter requestWriter = new StreamWriter(request.GetRequestStream());
                try { requestWriter.Write(postData); }
                catch { throw; }
                finally
                {
                    requestWriter.Close();
                    requestWriter = null;
                }
            }

            WebResponse response = request.GetResponse();
            /* тут забираем нашу ошибку:
                   Удаленный сервер возвратил ошибку: (401) Несанкционированный.
                   В дополнение возвращает - Failed to validate oauth signature and token
            */
            StreamReader responseReader = new StreamReader(response.GetResponseStream());
            var responseData = responseReader.ReadToEnd();
            response.Close();
            responseReader.Close();
            responseReader = null;
            request = null;
            return responseData;
        }

        public void SignIn()
        {
           string response = OAuthWebRequest(Method.GET, "http://twitter.com/oauth/request_token", string.Empty);
}
Т.е. как видим, все принципе верно, но ошибка удивляет меня, и понять что не так не могу никак.
1. Модуль публикуется прямо на офф сайте OAuth, т.е. видимо верить можно
2. Ну Consumer Key + Secret - так же верны, ведь с twitter.com беру их.
3. Т.е. формирую запрос не верно, но где проблема, грабли то ?

Спасибо. и очень надеюсь, что все-таки кто-то рассмотрит данный вопрос (думаю многие с .NET имели(имеют) дело с OAuth ?! Собственно, чтобы не пришлось в каком раз мне с самим собой общаться :D

Последний раз редактировалось BOBAH13; 22.02.2010 в 17:16.
BOBAH13 вне форума Ответить с цитированием
Старый 26.04.2010, 02:02   #2
Vlad_55
Пользователь
 
Регистрация: 03.11.2007
Сообщений: 22
По умолчанию

Не стал лепить ещё один пост на тему Twitter+OAuth. В общем у меня с авторизацией проблем нет - все авторизуется и даже GET-запросы проходят. А вот с POST-запросами какая-то фигня...
Суть проблемы: ни в какую не отправляется POST-запрос, если в значениях параметров имеются русские буквы. Например запрос с параметром
Код:
status=тест
возвращает ошибку. А запрос с параметром
Код:
status=test
работает на ура.
Как пробовал решать:
1. Как и сказано в документации конвертировал строку в utf-8, потом кодировал стандартными функциями HTTPEncode, URLEncode, функциями из Synapse - EncodeURL, EncodeURLElement. Запрос не проходит - возвращает 401 код.
2. Пробовал подставлять вместо русских символов значения кодов из Unicode, например так:
Код:
&_#1055;&_#1088;&_#1086;&_#1075;&_#1088;&_#1072;&_#1084;&_#1084;&_#1080;&_#1088;&_#1086;&_#1074;&_#1072
(без подчеркивания).
Запрос прошел, но есть следующие грабли: если в строке есть ANSI-символы, то возвращается ошибка. Если есть пробелы - тоже ошибка, даже если пробелы также переводить в код. и самое фиговое - размер текста должен быть всего 23 символа вместо разрешенных 140.
Вопрос: кто-нибудь сталкивался с подобной проблемой? Как её решить? Надо чтобы отправлялось нормальное количество текста, т.е. 140 символов.
WebDelphi.ru - блог о программировании на Delphi
Vlad_55 вне форума Ответить с цитированием
Старый 29.04.2010, 23:05   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ха, а у меня все нормально с русскими символами. Шлет это:
Цитата:
Супер !
>>
Код:
status=%d0%a1%d1%83%d0%bf%d0%b5%d1%80+!
Вот так вот Формируется обычным методом System.Web.HttpUtility.UrlEncode

Раз у вас с авторизацией нет проблем, может уделите время и посмотрите мой код ?

Edit:
Цитата:
конвертировал строку в utf-8
зачем ? Все просто, string var = "Супер !", string post = UrlEncode(var); все.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
А Вы пользуетесь Twitter"ом ? spamer Свободное общение 23 22.07.2010 19:52
Подключение к twitter Smagulov85 Работа с сетью в Delphi 6 13.01.2010 23:14