Привет всем,меня зовут 711.Я работаю в индустрии рептилий уже 4 года.Я написал бесчисленное количество рептилий,больших и маленьких.У меня есть рабочие потребности,свои увлечения и несколько небольших проектов для дополнительного заработка. Это все отступления.Сегодня я поделюсь с вами первой статьей о краулерах, которая попала мне в Zhihu: "Платформа проверки счетов Государственной налоговой инспекции по сложному сбору краулеров", написанная на c#. Конечно, мой наиболее часто используемый язык — это python, и в будущем я поделюсь краулером, написанным на python, обратите внимание.
Далее задействованы основные языки и инструменты:
javascript
c#
fiddler
chrome
Базовые знания о шифровании и дешифровании
Первый шаг, мы посещаемНалоговая администрация Главная, Этот шаг предназначен для получения файлов cookie, их сохранения с помощью объекта C# CookieContainer и последующего повторного использования.
Сначала страница выглядит так:
Примечание: Сертификат веб-сайта Государственной налоговой службы подписан сам по себе, и для первой проверки необходимо установить корневой сертификат. . Кажется, что я не доверяю центру сертификации, поэтому я выступаю в качестве сертификата подписи центра сертификации, или Государственная налоговая администрация не хочет покупать сертификат. .
Что ж, скачайте и установите корневой сертификат.
Код немного грязно. Редактор Zhihu скопировал его, и он не имеет формата. Есть только текстуры. Пожалуйста, нести со мной.
Второй шаг, получить код подтверждения изображения, следует отметить, что для получения кода подтверждения изображения передается параметр fpdm (то есть код счета-фактуры).
Хорошо, мы получили код подтверждения изображения. Возьми любой, он выглядит так. Всего существует следующие типы проверочных кодов:
JSON, возвращаемый интерфейсом кода подтверждения запроса, выглядит следующим образом:
jQuery1102035659710036181713_1508466648376({"key1":"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","key2":"2017-10-20 10:38:54","key3":"cab180f9f851b8e7802dc1e5cf275413","key4":"01"})
Проанализировав страницу JS, мы обнаружили, что разные значения Key4 соответствуют различным типам проверки кодов, чтобы мы могли обработать изображение через C # и отображать только код подтверждения символа соответствующего цвета.
Значение key1 — это кодировка base64 изображения кода подтверждения, а наше декодирование:
Проблема с получением проверочного кода решена, осталось заполнить остальные параметры формы (Рисунок 1) Просто заполните значения в актуальном счете.
На третьем шаге отправьте форму, немного напомните, URL-адрес отправленной формы отличается от разных провинций. Найдите этот ключ.На этом этапе нет никаких трудностей, если вы вводите данные в соответствии с содержанием, заполненным в форме.
Форма выглядит следующим образом:
Это был долгий путь, и мы, наконец, видим веху.
Но дело в том, что давайте посмотрим на возвращаемые данные, самое хлопотное в этом краулер это:
например
На исходной странице показано следующее:
при возвращении
{
"key1": "001",
«Key2»: «N ▽ восьмой этаж, № 24, средняя улица QILIN, Road Catai Road, Baiyun район, Guangzhou 87095513 ▽ 10 ▽ 20170920 ▽ 91220101556397833M ▽ Guangzhou Bank Shatainan филиал 800205874708016 ▽ 91340421MA2NE7xfxf ▽ North Nongshui Road, Chengguan Town, Fengtai , Хуайаинань город 17729909400 ▽ 79799400 ▽ 79799616160577875799 ▽ сельскохозяйственный банк 6228482019200386470 ▽ 1422.64 ▽▽ 1271.67 ▽ 661526257466 ▽ 661526257466 ▽ 561526257466 ▽ Fengtai County Guangyi Pharmacy ▽ Guangdong Kangaiduo Chain Pharmacy Co., Ltd. ▽ -316.03 ",
"key3": "Shu □ Wei □ □ Цитрат □ Кислота □ Висмут □ Rai □ Ni □ T □ D □ Капсула □ □ □ . □ 2 □ г □ * □ 1 □ 4 □ капсулы □ / □ коробка 0.. 14 капсул в коробке █17█11.79█23.58█2█4.01▽Li □ Xin □ Ping □ □ серная кислота □ сардина □ амин □ спирт □ ингаляция □ газ □ туман □ □ □1□□0□0□* □2□0□0□揿□█100 мкг*200掿█ коробка █17█12.258█122.58█10█20.84▽ с □гребень□ □лиан□цветок □прозрачный □Blaze □□капсула□ □0.3 □0.3 □г□*□2□4□ капсул □█0,35г*24 капсулы █ коробки █17█9,288█92,88█10█15,79▽ раз □ выносливость □ □ □Мужской □Спрей □(□Новый □Упаковка □Упаковка □) □ □1□5□m□l□█15 мл█ коробка █0█7.30066667█109.51█15█0▽Dan □ □ Noret Acene □ □ Прогестерон □ Кишечнорастворимые □ Таблетки□ □ 1□.□5□м□г□*□1□ Таблетки □█1,5мг*1 Таблетки █ Коробки █0█14.8232█741.16█50█0▽ Здоровье □ Юань □ □ □ Полезный □ Здоровье □ Бактерии □ Настой □ (□ Детский □ Тип □) □ □ 1 □.□ 5 □ г □ * □ 2 □ 6 □ пакеты □ █1,5г*26 пакетиков █ коробок █17█2322,17█1222.393122 █20,81▽сопротивление □Для мужчин □спрей □(□новая □упаковка □) □ □1□0□m□l□█10мл█ коробка █17█28.506█142.53█5█24.23▽9□9□9□ □ Холодный Дух □ □ Гранулы □ □ 1□0□г□*□9□пакет□█10г*9пакетов█коробка█17█7.6808█384.04█50█65.29",
"key4": " ",
"key5": "var fpxx=fpdm+'≡'+fphm+'≡'+swjgmc+'≡'+jsonData.key2+'≡'+yzmSj",
"key6": "var result={\"template\":0,\"fplx\":fplx,\"fpxx\":fpxx,\"hwxx\":hwxx,\"jmbz\":jmbz,\"sort\":jmsort}",
"key7": "fa367b974b0b9f01f4dbe9f48283ef7e",
"key8": "068c64196a8ae94ed7f7c9953254a7ac",
"key9": "31891b7b47c110f7f582b0864b55634c",
"key10": "WPX4IOUjwAHDBWJT9vaWaWR+A1LfXTDdCBsZ0FBUKv50T6s4XcNHy3uDuNARnktp",
"key11": "dc1de",
"key12": ""
}
какие? ? ? Что это, черт подери, такое? Искаженный код по-прежнему смешивается с правильными данными, и даже некоторый код js смешивается с ним. . .
Не волнуйтесь, спокойно анализируйте и спокойно разбирайтесь, тогда давайте начнем четвертый шаг, восстановим запутанные и зашифрованные данные
Четвертый шаг, восстановление запутанных и зашифрованных данных
Проанализировав js веб-страницы, мы обнаружили, что
Данные key3 в json каждый раз разделяются и перемешиваются определенным образом.
Кроме того, правила сортировки скремблированных данных шифруются AES, а это значит, что мы сначала должны расшифровать правила сортировки, а затем восстановить правила сортировки.После получения правил сортировки мы можем восстановить исходные скремблированные данные. Это должно предложить наш инструмент С# для выполнения js.
Что касается того, как С# выполняет js, ищите исходный код везде.
На приведенном выше рисунке показано выполнение извлеченных js, с одной стороны, для восстановления данных, а с другой стороны, для расшифровки данных. Стоит отметить, что информация о реплике шифруется отдельно, и расшифровывать ее нужно аккуратно с помощью js.
Наконец, данные получаются путем расшифровки, восстановления сортировки и очистки:
Конечный продукт таков:
полный.