1. PHP / Говнокод #14668

    +146

    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
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    <?php
    define('STOCK_URL', 'http://govnokod.ru/comments');
    define('REFERER_URL', 'http://govnokod.ru/');
    define('AUTH_COOKIES', 'a:2:{s:9:"PHPSESSID";s:26:"k719c8rqcm85dptista7b7rck7";s:4:"auth";s:32:"0ce5a7d54092aa07e37b88ffbe098135";}');
    define('MODERATED_TEXT', '[color=red][i]Слава «Беркуту»![/i][/color]');
    define('DEFAULT_UA', 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.16');
    define('POST_HEADERS', "X-Requested-With: XMLHttpRequest\r\nContent-Type: application/x-www-form-urlencoded\r\n");
    define('PONY1', "//ol[@class='posts hatom']/li/h2/a");
    define('PONY2', "//form/div/input[@name='_csrf_token']");
    define('PONY3', "//li[@class='hcomment']/div/a[@class='edit-comment-link']");
    
    function myCookies() {
    	$map_cookies = function($k, $v) {return $k . '='. $v;};
    	return implode('; ', array_map($map_cookies, array_keys(unserialize(AUTH_COOKIES)), unserialize(AUTH_COOKIES)));
    }
    
    function huyarim($url, $referer, $mask, $attr) {
    	$context_options = stream_context_create(array('http' => array(
    	  'method' => 'GET',
    	  'user_agent' => DEFAULT_UA,
    	  'header' => 'Referer: '. $referer . "\r\n" . 'Cookie: ' . myCookies()
    	)));
    	$links = array();
    	$file = @file_get_contents($url, false, $context_options);
    	if ($file) {
    	  $old_libxml_error = libxml_use_internal_errors(true);
    	  $dom = new DOMDocument;
     	  $dom->loadHTML($file);
    	  libxml_use_internal_errors($old_libxml_error);
     	  $domxpath = new DOMXPath($dom);
     	  $filtered = $domxpath->query($mask);
    	  foreach ($filtered as $item) {
    		$links[] = $item->getAttribute($attr);
    	  }
    	}  
    	return $links;
    }
    
    function getList() {return huyarim(STOCK_URL, REFERER_URL, PONY1, 'href');}
    function getCsrf($url) {$tokens = huyarim($url, STOCK_URL, PONY2, 'value'); return $tokens[0];}
    function getComments($url) {return huyarim($url, STOCK_URL, PONY3, 'href');}
    
    function doPost($url, $referer, $token) {
    	$postdata = http_build_query(array(
    	  '_csrf_token' => $token,
    	  'text' => MODERATED_TEXT,
    	  'commentSubmit' => 'Отправить комментарий [Ctrl+Enter]',
    	  'ajax' => 'true'
     	));
    	$context_options = stream_context_create(array('http' => array(
    	  'protocol_version' => 1.1,
    	  'method' => 'POST',
    	  'user_agent' => DEFAULT_UA,
    	  'header' => POST_HEADERS . 'Referer: '. $referer . "\r\n" . 'Cookie: ' . myCookies(),
    	  'content' => $postdata
    	)));
    	return file_get_contents($url, false, $context_options);
    }
    
    $links = getList();
    foreach($links as $link) {
    	$token = getCsrf($link);
    	$comments = getComments($link);
    	foreach($comments as $comment) {
    		if (false !== doPost($comment, $link, $token)) {
    			echo $comment . ' OK' . PHP_EOL;
    		}
    	}
    }

    CURL и PECL_HTTP не нужны. Да, и ООП тоже не нужно.

    Запостил: inkanus-gray, 19 Февраля 2014

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

    • >
      define('PONY1', "//ol[@class='posts hatom']/li/h2/a");
      define('PONY2', "//form/div/input[@name='_csrf_token']");
      define('PONY3', "//li[@class='hcomment']/div/a[@class='edit-comment-link']");


      Это что, вброс г.. на на вентилятор?
      Ответить
    • > PHP V. Huyarim
      а мой бобик блохаст
      он очень пузат...
      Ответить
    • >define('AUTH_COOKIES'
      Логин не осилил, лошара? :)
      Ответить
      • С логином может не поместиться в сто строк, поэтому оставим его читателям в качестве домашнего задания.

        Тактико-техническое требование: обеспечить логин через OpenID, потому что пароль владелец аккаунта в любой момент может сменить.
        Ответить
        • >поэтому оставим его читателям в качестве домашнего задания.
          >ко-ко-ко, ниасилил, ко-ко-ко
          Понятно.

          Опенид зарегить тяжелее, чем 100 логинов на гк.
          Ответить
          • Список опенид-провайдеров с регистрацией в один шаг:
            1. Яндекс. Используем айдишник типа kokoko.ya.ru.
            2. Мейлрушечка. Используем айдишник типа kokoko.id.mail.ru (или kokoko.id.inbox.ru, kokoko.id.list.ru, kokoko.id.bk.ru, в зависимости от домена).
            3. Яху. Там айдишник некрасивый и напрямую из адреса ящика не выводится, надо смотреть в своём профиле.
            4. Гугл. Такая же ситуация, как с Яху, но можно создать журнал в Блогспоте и использовать красивый айдишник kokoko.blogspot.com. Более того, на одну гугловскую учётку можно создать кучу блогспотовских журналов.

            Для остальных провайдеров (например, myid.net, myopenid.com, oneid.ru, loginza.ru, livejournal.com, wordpress.com) потребуется предварительно регать е-мейл, но можно попытаться воспользоваться одноразовым мейлом.

            Почему я заговорил про опенид? Благодаря Страйкеру здесь к учётке можно привязывать опенайдишники, а кнопки для отвязывания я не нашёл. Т. е. один раз привязав опенайдишник к захваченной чужой говнокодовской учётке, ты получишь её навсегда. Первый владелец может даже сбрасывать пароль, но ему это не поможет. Отвязать опенайдишник можно только через письмо Страйкеру.
            Ответить
            • Что? У сиреженьки можно регистрировать акки без телефона? Для остальных тот же вопрос.
              Ответить
              • Только что создал без телефона [email protected], из него создал http://konardo.blogspot.com/

                Привязать блогспотовский айдишник к ГК сейчас не получилось из-за бага в пыховской библиотеке ('Dumb' signature verification failed), но зато привязал основной гугловский айдишник. Он у меня выглядит так:
                https://www.google.com/accounts/o8/id?id=AItOawkju6u9WPJg9TpeIfxulrf6Rewavjo8qhI
                (вводить при логине надо https://www.google.com/accounts/o8/id).

                Итого: минута на регистрацию, телефон не нужен.

                В Яндексе и в Мэйле ещё быстрее.
                Ответить
                • О, да тут сходка троллей. О...
                  Товарищи, есть ли способ создать свой мейл-сервер, чтобы получать ссылки на подтверждение емейл-адресов чтобы регистрировать анкеты на сайтах? Возможно ли сделать это на Delphi/Indy?
                  Ответить
                  • Способ есть. Главное в DNS создать MX-запись, остальное — пустяки.
                    Ответить
                    • Без подколов, плз.
                      На вкладке компонентов Indy есть компонент - IdSmtpServer.
                      Может, у кого-то есть опыт работы с ним?
                      Ответить
                      • плять, формошлёпщики нихуя не могут без кнопочек на панели дельфинария
                        первая буква в smtp означает Simple
                        это простейший текстовый протокол
                        Ответить
                        • Мы не понимаем с Вами друг друга, дорогой товарищ. Заставить компонент работать нетрудно; вопрос в том, как отправить на него сообщение. Сервер создается, разумеется, в пределах моего компа.
                          Какой должен быть хост? На какой адрес отправлять, как он будет выглядеть?
                          Ответить
                          • Чтобы принять входящее сообщение, нужно владеть доменом. Без этого никак.

                            Если почтовый сервер видит адрес получателя [email protected], то он спрашивает у DNS для домена yamudak.com запись типа MX. Допустим, там будет запись
                            yamudak.com. 3600 IN MX smtp.yamudak.com.
                            Тогда почтовый сервер приконнектится к tcp-порту № 25 машины smtp.yamudak.com, а дальше отправитель и smtp.yamudak.com будут общаться согласно RFC 2821.

                            smtp.yamudak.com: 220 Привет, я типа почтовый сервер! Я клёвый!
                            Отправитель: EHLO gmail.com
                            smtp.yamudak.com: 250-<тут он сообщит, какой он крутой и какие команды он поддерживает>
                            Отправитель: MAIL FROM:<[email protected]>
                            smtp.yamudak.com: 250 OK
                            Отправитель: RCPT TO:<[email protected]>
                            smtp.yamudak.com: 250 OK
                            Отправитель: DATA
                            smtp.yamudak.com: 354 Что ж, начни отправлять письмо, закончи переносом строки, точкой и ещё одним переносом.
                            Отправитель: <тут он отправит письмо со всеми заголовками>
                            smtp.yamudak.com: 250 OK
                            Отправитель: QUIT
                            smtp.yamudak.com: 221 Чмафки, лю тя!
                            < Отправитель покинул чатик >

                            Вот и вся любовь. На айпи отправить е-мейл нельзя.
                            Ответить
                            • Ошибся, а меня никто не поправил. У MX-записи перед доменом, разумеется, будет ещё число, показывающее приоритет записи на случай, если smtp-серверов несколько (имеются резервные). Поэтому пример следует читать так:
                              yamudak.com. 3600 IN MX 10 smtp.yamudak.com.
                              Ответить
                            • Спасибо.
                              Ответить
                        • > это простейший текстовый протокол
                          Да не, тут stertor прав. Зачем изобретать велосипед, если есть готовая реализация этого протокола?
                          Ответить
                          • неспособность разобраться в smtp и подключение в проект функционала через перетаскивание кнопочки с панели на форму - это крайняя степень пиздеца
                            уверен, что реализовал этот смтп-сервер такой же программист мышкой
                            школьники, займитесь делом, почитайте хотя бы педивикию, раз rfc не можете
                            Ответить
                            • > подключение в проект функционала через перетаскивание кнопочки с панели на форму - это крайная степень пиздеца
                              Ты просто им завидуешь.

                              Да и никто не заставляет кидать этот компонент на форму. Можно подключить модуль через uses и создавать инстанс вручную.
                              Ответить
                              • > зависть
                                точно, всю жизнь мечтал писать программы в обработчиках Form1.Button1 бесполезных толстых клиентов под единственную ОС
                                Ответить
                            • Зачем велосипедить смтп-сервер (для которого потом придётся ещё и реализовывать многочисленные расширения протокола, не описанные в основном рфц), когда можно установить готовый?

                              P.S. Мне страшно представить велосипедную реализацию STARTTLS компайл-тайм на макросах.
                              Ответить
                              • зачем нужно реализовывать многочисленные расширения протокола, если ему нужен простейший майл-сервер
                                он же не собирается делать промышленный сервер, на дельфи-то
                                Ответить
                              • Лол, ни дай бог криптографию велосипедить.

                                >компайл-тайм на макросах.
                                Это теперь аналог "на скриптах за 5 минут по айпишнику на уровне ядра"?
                                Ответить
                        • Для какого-то злого эксперимента (у нас начальство их любит: скрам, аджайл, опен-спейс...) решили дать моему "коллеге" написать программу для бэкоффиса, чтобы они могли конвертировать шрифты для загрузки в наш редактор (редактор на флеше).
                          Коллега - "Виндовс-программист" (т.е. он умеет только пользоваться программами с графическим интерфейсом, и считает, что Виндовс 8 - самая лучшая во всех отношениях операционная система, если бы он умел читать/писать по-русски, был бы вылитый Стертор). Вобщем, решил он писать эту программу на АИРе.
                          Наш проект собирается Антом, поскольку скрипты для сборки писал я, коллега пришел ко мне:
                          --Слышь, мне тут нужно библиотеку со шрифтами [...].
                          Я ему нашел три опенсорные реализации на Хексе (компилируется во много разных языков, в том числе в исходники С++, флешевый байткод). Объяснил, что Ант ему не нужен, потому-что сам по себе не имеет отношения к перекодировке шрифтов из ТТФ в флешевый формат, что Ант за собой потащит Яву и Флексовый компилятор, все в комплекте - почти гигабайт.

                          В итоге у всех в дизайнеров в оффисе теперь есть по копии Флеск СДК + программа собраная в АИР перетаскиванием компонент мышкой. Коллега поднял свой авторитет среди дизайнеров, бегая с умным видом от компа к компу скачивая им Яву и СДК. Теперь он просто незаменим.
                          Ответить
                          • >"Виндовс-программист" (т.е. он умеет только пользоваться программами с графическим интерфейсом, и считает, что Виндовс 8 - самая лучшая во всех отношениях операционная система, если бы он умел читать/писать по-русски, был бы вылитый Стертор).
                            Что-то такое есть. Порабощенные спермомирком.
                            Ответить
                        • http тоже, скажешь, http либы ненужны?
                          Ответить
                          • если в качестве примера взять WinHttp - то нахуй не впёрлись
                            алсо половина таких либ написана для однопоточных анскильных питушков, которым всё что нужно - это выполнить 1 запрос в секунду из своего убогого приложения

                            или ты даже не осилил составить или разобрать http заголовок?
                            Ответить
                            • Не осилил и нахуй не нужно - разницу улавливаешь?

                              Когда-то делал закат солнца вручную, потом бросил. Увидишь библиотеку вроде requests - поймешь, какой же ты мудак.
                              Ответить
                              • напишешь сервер, который держит хотя бы 10к клиентов - поговорим
                                requests - судя по примеру прямо на их заглавной странице - обыкновенный однопоточный блокирующий шит
                                читай про event-driven
                                Ответить
                                • Какое это отношение имеет к велосипедостроению? Если тебе нужны асинхронные - они тоже есть.
                                  Ответить
                                  • тут в качестве рекламы python requests (и любой другой невелосипедной библиотеки) должен был бы быть сервер, который 10к одновременных клиентов обслуживает, скажем, 200 потоками и потребляет, скажем, < 0.5G RAM
                                    Ответить
                                    • > requests
                                      > сервер
                                      WTF? Requests это же всего лишь http клиент.

                                      А асинхронная серверная часть, емнип, есть в twisted. Х.з.че у не со скоростью, питон не особо дружит с перфомансом и потоками..
                                      Ответить
                                      • клиент? ок
                                        > алсо половина таких либ написана для однопоточных анскильных питушков, которым всё что нужно - это выполнить 1 запрос в секунду из своего убогого приложения

                                        вот и вернулись к тому, с чего всё начиналось
                                        Ответить
                                        • > однопоточных анскильных питушков
                                          Более того, этот requests блокирующий.
                                          Ответить
                                        • Для клиента это недостаток или как?
                                          Ответить
                                          • любая сетевая активность в серьезном приложении должна быть асинхронной
                                            иначе ты даже тупо не сможешь нажать на крестик своего окошка, пока отправил http запрос хуй пойми куда
                                            (к слову, даже в убогом winhttp есть асинхронность, правда неуправляемая по ресурсам)
                                            Ответить
                                            • Не понял, кто сказал, что во время ожидания запроса надо нихуя не делать и не принимать сообщения?
                                              Причём тут потоки?
                                              Ответить
                                              • Странно, что ты не спрашиваешь,при чем тут анскильные петушоки. Хм..
                                                Ответить
                                              • как ты примешь следующее сообщение из очереди сообщений, если ты уже заблокировался в своем единственном потоке на приёме ответа от сервера
                                                другое дело - сигнал
                                                Ответить
                                                • Я не сижу в вечном цикле, ожидая сообщения от сервера, понимаешь? Я сижу в вечном цикле, принимая сообщения от пользователя или от системы, между делом мне может прийти сообщение "тут что-то сервер прислал, позырь".
                                                  Зависнуть в процессе обработки сообщения от сервера? Мне кажется, этот вопрос уже не имеет отношения к сетям.
                                                  Ответить
                                                  • > между делом мне может прийти сообщение "тут что-то сервер прислал, позырь"
                                                    воот, даже до Тараса дошло, что в сетевых вопросах без асинхронности никак
                                                    Ответить
                                                • Я подозреваю, что Тарас предпочитает мультиплексирование и корутины.
                                                  Ответить
                                            • > в серьезном приложении
                                              Определи серьезное приложение. 400 потоков - это серьезно? Прекрасно работает на тредах.

                                              >иначе ты даже тупо не сможешь нажать на крестик своего окошка, пока отправил http запрос хуй пойми куда
                                              Чем треды не устраивают?
                                              Ответить
                                              • Измерять серьёзность приложения кол-вом потоков - это что-то новенькое.
                                                Ответить
                                                • Проблемы с блокирующим API проявляются с определенного количества соединений (то есть потоков), roman-kashitsyn
                                                  Ответить
                                              • треды это было интересно лет эдак 20 назад (апач "был написан в начале 1995 года")

                                                400 потоков - навскидку должны держать 12к соединений плюс минус трамвайная остановка (зависит от того, насколько интенсивный обмен)

                                                1 поток на 1 соединение - это фуфел, годно только для тех, кто уже ограничен инструментом и не может никак иначе

                                                это, замечу, пока ещё не ввели таймаут этого соединения - и если этим занимается тупоголовый блокирующий программист, то в результате ещё +1 поток на соединение (один ждёт чтения на сокете, второй - ждёт срабатывания таймера, чтобы прибить первый тред)
                                                Ответить
                                                • >1 поток на 1 соединение - это фуфел,
                                                  Для сервера.
                                                  Ответить
                • Да, действительно. Писечка сереженьки смилостивилась? Раньше вроде никак было.
                  Ответить
                  • Он может задним числом заблокировать учётку, не привязанную к телефону, если будешь пользоваться гуглоплюсом и прочей ненужной ерундой, под предлогом, что Серёженька сомневается в подлинности анкеты. А если всем подряд не пользоваться, то может и прокатить.
                    Ответить
                    • У меня непривязанный к телефону акк живет уже черти сколько, пользуюсь только почтой. А что, были случаи?
                      Ответить
                      • Случаи были, но должно сильно повезти, чтобы попасть под раздачу.

                        У меня однажды Фейсбук фотографию банковской карточки спросил, но через месяц передумал и разблокировал, не дождавшись моего ответа. Едва ли не все крупные сети время от времени берут пользователей на испуг.
                        Ответить
                    • Алсо 100% было время, когда было нельзя. А щас можно в одноклассниках без телефона?
                      Ответить
                      • Да, они чуть ли не каждый месяц меняют правила...

                        В Одноклассниках и даже во Вконтакте сейчас без телефона нельзя... Но если очень хочется, то можно: http://sms-reg.com/

                        Порядка 10 российских рублей. Деньги можно перевести, например, с анонимного ящика Яндекс-денег, на который в РФ можно анонимно закинуть наличные через терминал экспресс-оплаты. Теоретически нет гарантии, что аккаунт потом не уведут, потому что никому не известно, в чьих руках симка, на которую принимали SMS, но по отзывам злоупотреблений пока не было.
                        Ответить
    • Свой класс на питоне выложить, что ли.
      Ответить
    • [code]**************************************** ****
      * ВАЖНАЯ ИНФОРМАЦИЯ *
      **************************************** ****


      Никнейм: anonimb84a2f6fd141
      Openid: anonim-backdoor.id.mail.ru
      Пароль от openid: dc604057d2ea

      Никнейм: Horse2
      Openid: horse2-backdoor.id.mail.ru
      Пароль от openid: SG9yc2Uy

      Никнейм: Horse3
      Openid: horse3-backdoor.id.mail.ru
      Пароль от openid: SG9yc2Uz

      Никнейм: Konardo
      Openid: konardo-backdoor.id.mail.ru
      Пароль от openid: S29uYXJkbw==

      ********************************************


      Менять пароли от опенайдишников бессмысленно, потому что в любой момент можно привязать новые.
      Ответить
    • песик не плохо так устроился


      -----
      <a href=http://konfiskat-optom.com/>электроника каталог</a> | http://konfiskat-optom.com/
      Ответить

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