1. C# / Говнокод #17195

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    public CookieContainer GetCookies(string url, string login, string password)
    {
        try
        {
            var cookies = new CookieContainer();
            string postData = string.Format(@"subaction=dologin&username={0}&password={1}&selected_language=Russian&x=62&y=37", Uri.EscapeDataString(login), Uri.EscapeDataString(password));
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url + "admin.php");
            httpWebRequest.AllowAutoRedirect = true;
            httpWebRequest.CookieContainer = cookies;
            httpWebRequest.Method = "POST";
            httpWebRequest.ContentType = "application/x-www-form-urlencoded";
            httpWebRequest.UserAgent = "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.289 Version/12.01";
            httpWebRequest.ServicePoint.Expect100Continue = false;
            byte[] ByteQuery = System.Text.Encoding.UTF8.GetBytes(postData);
            httpWebRequest.ContentLength = ByteQuery.Length;
            Stream QueryStream = httpWebRequest.GetRequestStream();
            QueryStream.Write(ByteQuery, 0, ByteQuery.Length);
            QueryStream.Close();
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            StreamReader sr = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
            string loginPage = sr.ReadToEnd();
            sr.Close();
            if (loginPage.IndexOf(@"div class=""error""") == -1)
            {
                httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri);
                httpWebResponse.Close();
                return cookies;
            }
            else
            {
                return null;
            }
            
        }
        catch (Exception)
        {
            if (n < 3)
            {
                Thread.Sleep(400);
                n++;
                return GetCookies(url, login, password);
            }
            else
            {
                n = 0;
                return null;
            }
        }
    }

    Костыльно-ориентированное велосипедирование. Выдержка из паттерна "тулза для работы с вебом", метод авторизации на какой-то из CMS.

    Запостил: pushistayapodmyshka, 27 Ноября 2014

    Комментарии (25) RSS

    • > Opera ... Presto
      Наш человек!
      Ответить
    • Ну постдату клеить форматом - говнище. В остальном, имхо, сойдет.

      Сам недавно делал подобную херню на питоне для деплоя джумломодулей.
      Ответить
      • Всё равно как-то гнетуще, громоздко и абсолютно не реюзабельно. А обработка исключений-то какая... ух!
        Ответить
        • а зачем это вообще надо?
          Ответить
          • Дефайн "это". Обработка исключений? Реюзабельность? Такие классы вообще?
            Ответить
            • зачем вообще этот куки нужен? дальше-то что? там целый велосипедный завод, который эмулярует работу браузера, чтобы работать с CMS?
              Ответить
              • >там целый велосипедный завод, который эмулярует работу браузера, чтобы работать с CMS?
                Именно.
                Ответить
        • > абсолютно не реюзабельно
          Из-за реюзабельности одноразовый скриптик может превратиться в огромную систему... Если это часть большого проекта - говно. Если мелочь для заливки/донастройки - все норм.

          > А обработка исключений-то какая... ух!
          Ну а что не так то? При любой ошибке пробуем до 3 раз с интервалом 400мс. Меня там больше всего пугает нелокальная переменная n.
          Ответить
          • >Если мелочь для заливки/донастройки - все норм.
            Да, но по-моему лучше один раз написать себе приличный класс для подобных задач, а не копипастить из проекта в проекта, редактируя урлы, постдату, хттпхэдеры и всякие условия.
            Ответить
            • Это если проектов несколько а если один. то какой смысл в нормальном классе.
              Ответить
              • А чёрт знает. Я выросла на быдлокодовых "проэктах", где все задачи были похожими: парсеры всякие, работа с CMS и т.п. хрень.
                К слову, сабж (моего авторства) в своё время был переосмыслен и переписан в полезную библиотеку, которая до сих пор иногда верно служит мне по необходимости.
                Ответить
      • Да не сойдет, на самом деле)
        Потому что если это одноразовый скрипт написал-и-забыл то зачем на C# писать то?
        А если это часть системы то там везде хардкод и говно.
        Ответить
        • > зачем на C# писать то
          Да, скорее всего, что было под рукой, на том и писали. Ставить ${langname} ради одноразового скриптика влом. А фрейморк 3.5+ сейчас на любой винде есть.
          Ответить
          • На любой винде так же естьб VBS, JS, и PowerShell.
            Ответить
            • > bat/cmd
              Ёбаное говно.
              > VBS
              Говно.
              > JScript
              Говно, т.к. очень старый стандарт (по стандарту ли вообще?). Но пару раз послужило мне верой и правдой.
              > PowerShell
              Учить еще одно говно только ради винды? Увольте...
              Ответить
              • >>Ёбаное говно.
                окей. Ну вигет поставьте на винду.
                >>Говно.
                А писать на сишарпе тупой скрипт не говно?
                >>Говно, т.к. очень старый стандарт
                Можно подумать тут нуженновый стандарт
                >>Учить еще одно говно только ради винды? Увольте...
                Если Вы знаете .NET (а Вы знаете .NET раз пишите на C#) то пауершелл выучить -- дело одной недели.

                В конце концов под .NET есть и IronPython
                Ответить
                • > А писать на сишарпе тупой скрипт не говно?
                  Что-то мне намекает, что во всех этих языках (кроме, разве что, IronPython, но его надо ставить) работа с HTTP ну ничуть не проще, чем в шарпе...

                  > вигет
                  curl тогда уж. Он более гибкий. Но дергать его из батников - фублядь, фунахуй.
                  Ответить
                  • Дело не в языках, а в том что JS, VBS и прочите WSH языки могут COM.
                    А в COM есть WinHttpRequest .
                    А в PS и вовсе есть API к .NET
                    -------
                    ы: http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa384071%28v=vs.85%29.aspx

                    ы2: как это нахуй? А из шела нормально? А когда Вам надо на лялихе куки получить Вы всегда это на C пишете? Или все таки на курле и баше или на перле или на пайтоне?
                    Ответить
                    • > из шела нормально
                      Не особо, но bash всё же терпимей, чем батники.

                      Дело именно в языках. И если у меня есть возможность и скрипт будет чуточку сложнее копирования пары файликов - я стараюсь писать его не на баше, а на каком-нибудь питоне. Почему? Да тупо потому что это язык. Нормальные строки, не выносящие мозг экранировками, нормальные не испохабленные регулярки, нормальная математика, нормальные переменные, нормальные функции, нормальные модули... Так что я вполне понимаю авторов сего творения.

                      > могут COM
                      Я знаю. Я с jscript'а шарился в планировщике задач и отправлял e-mail'ы. Терпеть можно, хотя с тем же запуском процессов там не совсем айс. Но я не думаю, что с WinHttpRequest работать проще, чем с HttpWebRequest.
                      Ответить
        • > зачем на C# писать то?
          Я иногда одноразовые скриптики пишу на C#. Студия всегда под рукой, интеллисенс дописывает большую часть кода, компилится доли секунды, выполняется быстро, статическая типизация избавляет от многих ошибок типа опечаток, и прочие плюшки.
          Ответить
          • Я теперь уже набрался опыта работы в проектах, и когда я слышу: "у меня для тебя есть небольшой квест". Например, недавно мне нужно было сделать тупо веб интерфейс, который будет редактировать значения в одной таблице, где всего 4 параметра лежит. И одна процедура, результат которой мне надо по нажании кнопки выгружать в excel. Потом выяснилось, что там целый набор хранимых процедур будет, нужна авторизация, интерфейс с динамеческими гридами.... До этого мне еще ставили задачку - сделать консольный мейлен, который при запуске с параметркми командной строки будет слать не жное письмо нцжным получателям.
            После 20-30 версий это отдельный проект, который имеет такое понятие как " пакет". Есть полный фарш для отправки писем, динамические запросы в оракл, выгрузка на ftp, локальное хранилище, файлообменник move it, вложение в почту, таблица в тело письма, упаковка в архивы, в том числе с паролями.... Короче ненависть :(((
            Ответить
    • Возраст и стаж программиста написавшего это ? если опыт программирования до года, то простительно ,если так пишет "опытный" программист ,то страшно
      Ответить
      • Опыт программирования авторки этого кода, на тот момент, составлял пару месяцев. Возраст, думаю, не важен.
        Ответить
        • тогда это норм код, сеньёр должен джуну объяснить что да как и дать почитать "просветительскую" книгу про антипаттерны
          Ответить
    • catch (Exception)
      {
      if (n < 3)
      {
      Thread.Sleep(400);
      n++;
      return GetCookies(url, login, password);
      }
      else
      {
      n = 0;
      return null;
      }
      }

      После этого, всё написанное раньше, уже не так плохо выглядит!
      Ответить

    Добавить комментарий