Какая гадость эта ваша динамическая типизация!4
ig egor_wexler
ig egor_wexler
В эти славные дни распродаж хочу предостеречь клиентов данной площадки.
TL;DR.: Продавец может молча подменить характеристики товара или сам товар постфактум (оплаты). Не страшно, ибо можно вернуть товар и деньги, но может стать неприятным сюрпризом.
Ситуация: вижу в продаже пару углекислотных огнетушителей ОУ-3 по цене одного (~1,5 килорубля), на картинке - пара, удостоверяюсь, что в описании всё про 2 шт. Клево, давно хотел заменить дома старый порошковый, а тут так удачно заскочил! Оформляю, оплачиваю, ползаю по сайту дальше.
Вдруг, замечаю неладное - на картинке заказа вдруг один огнетух и статус заказа сменился с "создано" на что-то вроде "собрано у продавца". В карточке уже и след простыл второго. Молча. Цена прежняя. Вдыхаю-выдыхаю, иду писать в ТП, дескать, вертайте в зад, как было при акцепте оферты. Ответом просят скриншоты карточки товара в изначальном состоянии, на что я развожу руками, конечно. А они, дескать, ничего знать не знают, сейчас там 1 шт. (спасибо, КО!).
Злюсь. Остываю. Решаю отменить заказ, чтобы пойти к сиреневым конкурентам. У ТП-бота прошу отменить заказ, и тут...
Снова прежняя картинка товара! Может озон кэширует или еще что. Делаю скриншот, снова зову ТП-человека.
Ничего они делать не собираются. Подарили царских 150 баллов-рублей на счет. Обидненько. Благо, заказ не отправлен и возврат денежек мгновенный.
@Ozon, неужели нельзя прикрутить аудит изменений для карточек товаров и уведомление для клиентов с заказами в обработке? Я уж не говорю о механизме, чтобы хоть как-то регулировать подобные споры.
Всем известно, что каждое учебное заведение в Этой стране обязано иметь свой веб-сайт. Давече мне в руки попал перечень требований к оформлению этих специализированных сайтов. Инициатива хорошая - стандартизировать интерфейс всех сайтов, чтобы пользователь без труда мог найти интересующую информацию, вне зависимости от фантазии разработчика. Но реализована она настолько отвратительно даже на этапе документирования, что я просто не могу не поделиться с общественностью. Это туча своих семантических атрибутов, представляющих собой смесь транслита с словами на английском и ошибками. Например, один из примеров схемы URL для раздела сведений по образовательным стандартам:
http://<адрес_официального_Сайта>/sveden/eduStandarts
Семантические атрибуты вроде:
itemtype="http://obrnadzor.gov.ru/microformats/UchredLaw"
itemprop="Ustav_DocLink"
itemprop="Tek_kontrol_DocLink"
Зачем?! Уже 2016 почти, а Рособрнадзор не в курсе о существовании REST?
Все бы ничего, сделали фигню и никого она не трогает, но она навязывается как обязательный стандарт в стране и ошибки эти нужно повторять буква-в-букву.
Но "финишем" для меня стали "рейтинги" в разделе с архивом приказов.
Как-то это непрофессионально и бестолково. Почему у нас не принято читать то, под чем ставишь свою подпись? А? г-н Бисеров?
На носу НГ, а ты, дорогой пикабушник, собираешься ехать домой/по гостям/в интересное место? Билет купить не забыл? Все ж раскупили! Ан-нет, не всё. В продаже билетов нет, но они еще будут "выбрасываться" пачками ближе к дате отъезда. Нужно мониторить сайт на наличие билетов. Не вставать же ради этого каждый день в 8 утра, ей богу! Нам срочно нужна наша личная секретарша! Кофе подождет, а вот дела не ждут.
Что у нас есть?
- Сайт РЖД, где мы в первоисточнике можем смотреть наличие билетов,
- браузер с инструментами разработчика (Chrome или Firefox+Firebug вполне подойдут)
- средства для программирования и окружение для запуска программ (C# и .NET Framework в моем случае).
Морда сайта имеет куку (идентификатор сессии) и делает три HTTP-запроса:
0) запрос самой HTML-страницы с сопутствующими ресурсами и их запросами (баннеры-х**неры, яндекс-метрики всякие, про них я не буду говорить),
1) запрос к базе, получает идентификатор ответа (rid),
2) по идентификатору ответа забирает данные
HTTP-запросы содержат информацию о желаемых билетах и идентичны друг другу, за исключением добавления крайнего параметра () во второй раз.
HTTP-запрос - это и есть HTTP-запрос.
Запросом к базе - я буду называть наш набор требований к билетам, с чем работает БД РЖД и что в результате дает нам данные.
Сервер нам всегда отвечает json-объектом, в котором есть поле "result", которое может быть { OK, Error, RID }.
На первый HTTP-запрос нам приходит объект с "result":"RID". Примерно такой:
{
"result" : "RID",
"discounts" : { },
"rid" : "202628254",
"timestamp" : "01.12.2015 11:13:29.077",
"tipFlags" : { "Ukr" : 0 }
}
Значит, мы можем смело лезть искать поле "rid" и подставлять код из него значением параметра rid во второй HTTP-запрос. Если в "result" json-ответа будет значение "OK", то у нас все получилось.
Тонкость в том, что если сервер не успеет извлечь результат между нашими запросами, то "result" будет "Error" или вообще ответ на предыдущий запрос. Лучше обезопасить себя принудительной задержкой между запросами или настойчиво запрашивать до тех пор, пока не получим OK.
В случае удачного запроса, мы получим данные вроде этих:
Теперь непосредственно Анечка.
Нам нужно нечто, способное делать HTTP-GET-запрос и хранить куки. Используем System.Net.WebClient с небольшой модификацией.
Пару слов о разборе json-данных. Для этих целей я использую Newtonsoft.Json, который можно взять через NuGet. Требуется создать модель данных (C# классы), чтобы спроецировать на них json. Например, для объекта-ответа с rid, пример которого я приводил выше, можно написать такой класс:
{
"result" : "RID",
"discounts" : { },
"rid" : "202628254",
"timestamp" : "01.12.2015 11:13:29.077",
"tipFlags" : { "Ukr" : 0 }
}
Те свойства RidResponseEntity, соответствия которым найдено не будет, примут дефолтное значение типа, поэтому классы-проекции можно делать лишь с необходимыми полями. Коллекции значений так же ложатся на эту концепцию. Объекты-проекции могут наследоваться.
По этим принципам организуем остальные проекционные типы
Теперь мы можем показать Анечке, как можно приносить нам апдейты с сайта РЖД.
Значения station*_name и station*_code можно почерпнуть из API автодополнения на том же сайте, оно так же работает через json. Базируется здесь , есть HTML-интерфейс, код языка - ru.
Вот и всё. Смс-оповещалку с какого-нибудь смс.ру прикрутить не составит труда.
Поделие на Гитхабе с таймером и бегунами, кто не умеет в GIT, тому по ушам ссылка на zip-архив.
Предложения, пожелания, форки и срачи в комментариях приветствуются.
P.S. Зачем это все? Почему это все так плохо ?
А потому что могу! ;))