0xDEADFA11

0xDEADFA11

На Пикабу
Дата рождения: 01 января
22К рейтинг 108 подписчиков 59 подписок 15 постов 2 в горячем
Награды:
10 лет на ПикабуС Днем рождения, Пикабу!

Какая гадость эта ваша динамическая типизация!4

ig egor_wexler

Продавец на Ozon может безнаказанно менять карточку товара

В эти славные дни распродаж хочу предостеречь клиентов данной площадки.


TL;DR.: Продавец может молча подменить характеристики товара или сам товар постфактум (оплаты). Не страшно, ибо можно вернуть товар и деньги, но может стать неприятным сюрпризом.


Ситуация: вижу в продаже пару углекислотных огнетушителей ОУ-3 по цене одного (~1,5 килорубля), на картинке - пара, удостоверяюсь, что в описании всё про 2 шт. Клево, давно хотел заменить дома старый порошковый, а тут так удачно заскочил! Оформляю, оплачиваю, ползаю по сайту дальше.

Вдруг, замечаю неладное - на картинке заказа вдруг один огнетух и статус заказа сменился с "создано" на что-то вроде "собрано у продавца". В карточке уже и след простыл второго. Молча. Цена прежняя. Вдыхаю-выдыхаю, иду писать в ТП, дескать, вертайте в зад, как было при акцепте оферты. Ответом просят скриншоты карточки товара в изначальном состоянии, на что я развожу руками, конечно. А они, дескать, ничего знать не знают, сейчас там 1 шт. (спасибо, КО!).

Злюсь. Остываю. Решаю отменить заказ, чтобы пойти к сиреневым конкурентам. У ТП-бота прошу отменить заказ, и тут...

Продавец на Ozon может безнаказанно менять карточку товара OZON, Обман, Служба поддержки, Негатив, Длиннопост

Снова прежняя картинка товара! Может озон кэширует или еще что. Делаю скриншот, снова зову ТП-человека.

Продавец на Ozon может безнаказанно менять карточку товара OZON, Обман, Служба поддержки, Негатив, Длиннопост

Ничего они делать не собираются. Подарили царских 150 баллов-рублей на счет. Обидненько. Благо, заказ не отправлен и возврат денежек мгновенный.


@Ozon, неужели нельзя прикрутить аудит изменений для карточек товаров и уведомление для клиентов с заказами в обработке? Я уж не говорю о механизме, чтобы хоть как-то регулировать подобные споры.

Показать полностью 2

Рособрпозор

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

http://<адрес_официального_Сайта>/sveden/eduStandarts

Семантические атрибуты вроде:

itemtype="http://obrnadzor.gov.ru/microformats/UchredLaw"


itemprop="Ustav_DocLink"


itemprop="Tek_kontrol_DocLink"

Рособрпозор Рособрнадзор, Почему?, Web-программирование, Стандарты, Госслужба, Бугурт

Зачем?! Уже 2016 почти, а Рособрнадзор не в курсе о существовании REST?


Все бы ничего, сделали фигню и никого она не трогает, но она навязывается как обязательный стандарт в стране и ошибки эти нужно повторять буква-в-букву.


Но "финишем" для меня стали "рейтинги" в разделе с архивом приказов.

Рособрпозор Рособрнадзор, Почему?, Web-программирование, Стандарты, Госслужба, Бугурт

Как-то это непрофессионально и бестолково. Почему у нас не принято читать то, под чем ставишь свою подпись? А? г-н Бисеров?

Показать полностью 2

Не останемся без билетов на поезд или пишем "Анечку"

На носу НГ, а ты, дорогой пикабушник, собираешься ехать домой/по гостям/в интересное место? Билет купить не забыл? Все ж раскупили! Ан-нет, не всё. В продаже билетов нет, но они еще будут "выбрасываться" пачками ближе к дате отъезда. Нужно мониторить сайт на наличие билетов. Не вставать же ради этого каждый день в 8 утра, ей богу! Нам срочно нужна наша личная секретарша! Кофе подождет, а вот дела не ждут.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Что у нас есть?

- Сайт РЖД, где мы в первоисточнике можем смотреть наличие билетов,

- браузер с инструментами разработчика (Chrome или Firefox+Firebug вполне подойдут)

- средства для программирования и окружение для запуска программ (C# и .NET Framework в моем случае).

Морда сайта имеет куку (идентификатор сессии) и делает три HTTP-запроса:


0) запрос самой HTML-страницы с сопутствующими ресурсами и их запросами (баннеры-х**неры, яндекс-метрики всякие, про них я не буду говорить),

1) запрос к базе, получает идентификатор ответа (rid),

2) по идентификатору ответа забирает данные


HTTP-запросы содержат информацию о желаемых билетах и идентичны друг другу, за исключением добавления крайнего параметра () во второй раз.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

HTTP-запрос - это и есть HTTP-запрос.

Запросом к базе - я буду называть наш набор требований к билетам, с чем работает БД РЖД и что в результате дает нам данные.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Сервер нам всегда отвечает 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.


В случае удачного запроса, мы получим данные вроде этих:

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Теперь непосредственно Анечка.


Нам нужно нечто, способное делать HTTP-GET-запрос и хранить куки. Используем System.Net.WebClient с небольшой модификацией.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Пару слов о разборе json-данных. Для этих целей я использую Newtonsoft.Json, который можно взять через NuGet. Требуется создать модель данных (C# классы), чтобы спроецировать на них json. Например, для объекта-ответа с rid, пример которого я приводил выше, можно написать такой класс:


{

"result" : "RID",

"discounts" : { },

"rid" : "202628254",

"timestamp" : "01.12.2015 11:13:29.077",

"tipFlags" : { "Ukr" : 0 }

}

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Те свойства RidResponseEntity, соответствия которым найдено не будет, примут дефолтное значение типа, поэтому классы-проекции можно делать лишь с необходимыми полями. Коллекции значений так же ложатся на эту концепцию. Объекты-проекции могут наследоваться.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

По этим принципам организуем остальные проекционные типы

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост
Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост
Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Теперь мы можем показать Анечке, как можно приносить нам апдейты с сайта РЖД.

Не останемся без билетов на поезд или пишем "Анечку" Программирование, РЖД, Люби РЖД, Csharp, Гайд, Анна, Длиннопост

Значения station*_name и station*_code можно почерпнуть из API автодополнения на том же сайте, оно так же работает через json. Базируется здесь , есть HTML-интерфейс, код языка - ru.

Вот и всё. Смс-оповещалку с какого-нибудь смс.ру прикрутить не составит труда.

Поделие на Гитхабе с таймером и бегунами, кто не умеет в GIT, тому по ушам ссылка на zip-архив.

Предложения, пожелания, форки и срачи в комментариях приветствуются.


P.S. Зачем это все? Почему это все так плохо ?

А потому что могу! ;))

Показать полностью 10

Qt is cute [2]: QMake & third-party libs

Продолжаем буянить не по формату :-)
Qt is cute [2]: QMake &amp; third-party libs Продолжаем буянить не по формату :-)
Показать полностью 1

Qt is cute [1]: Signal-slots

Немного о сигналах и слотах в терминах Qt.
Qt is cute [1]: Signal-slots Немного о сигналах и слотах в терминах Qt.
Показать полностью 1

Qt is cute

Почему я люблю Qt? Ну, во-первых, он зеленый. А зеленый - мой любимый цвет...
Qt is cute Почему я люблю Qt? Ну, во-первых, он зеленый. А зеленый - мой любимый цвет...
Показать полностью 1

Лига Любительских Проектов Пикабу (ЛЛПП)

Лига Любительских Проектов Пикабу (ЛЛПП)
Отличная работа, все прочитано!