Отсылка к статьям на хабре
Вот ссылки на мои статьи для желающих разобраться в вопросе поподробнее
Там я описываю всю историю возникновения данной программы, работу ее в режиме клиент-сервер, через интернет, с помощью браузера и т.д. Сейчас же почти все что там было описано уже устарело :-( Т.е. можно запустить, но не чаще чем раз в 5 минут делать запросы, часто авито выдает каптчу, часто пишет что ваш адрес заблокирован и прочую хрень, но для истории развития вопроса почитать можно. Особенно там жгли коменты. Но потом их почистили чтоли? Сейчас интересного не осталось
Работа и наиболее интересные отдачи
За 3 года, что я пользуюсь данной программой конечно же было получено дофига всего. В том числе были совершенно фантастические отдачи. Например:
- 2 токарных станка. Один большой ижевский 1И611П во вполне рабочем состоянии (про это писал на пикабу, но случайно создал новый аккаунт), второй маленький настольный, явно самопальный, но вполне себе рабочий. Вот эта статья:
- 2 бытовки. Первую уже продал, предварительно сделав в ней косметический ремонт, вторая стоит у меня на даче
- куча системных блоков от старых первопней до core i5 на сокетах до 1366, 1150. В том числе брендовые рабочие станции HP, горы памяти от диммов SD-RAM до DDR4 памяти, ноутбуки - много.
- оргтехника, мфу, принтеры (беру только термо или лазерные), рабочие или с мелкими дефектами, с кончившимися картриджами
- бытовая техника: холодильники, стиралки, микроволновки, газовые и электроплиты, варочные панели
- газовые баллоны, пропан, кислород, ацетилен, хладон, фреон
- промышленное оборудование: моторы, устройства, вентиляционное оборудование, отопительные котлы. На газу, на дизельном топливе
- интересная мебель: икеевская, металлические кровати
- тряпки: несколько десятков кг полотенец, простыней, пододеяльников, покрывал, матрасы. Это все отлично продается
- стройматериалы: фанера 1.5 на 1.5 м листы толстые, тяжелые 12 мм, целые панели OSB, бруски 50х50, доски с полов домов 1912 г. постройки, эти пошли на пол в гараже
- железо: много очень. Ворота на гараж, двери, решетки на окна, арматура, различный лом.
- для дачи: газонокосилки бензиновые и электро, садовый инвентарь, бетономешалка
- электротехника: лампы, светильники домашние и уличные, электроустановочные изделия, кабель, щитки, электросчетчики, шкафы
В общем, всего не перечислить, я конечно что-то упустил, но всего не упомнить.
И это я не искал по некоторым не особо интересным для меня категориям, типа авто запчастей, мобильных телефонов. Хотя как-то случайно видел объявления что отдают целую поляну автомобилей, примерно 90ых готов иномарки, джипы, но их надо было на чем-то и куда-то вывозить и еще непонятно что там с документами. Вот объявления интересные, но которые не сумел взять или не успел, или не потянул физически:
- подъемник для автомобилей из автосервиса
- огромная стенка из профлиста несущего, не смог найти кто мне ее разберет, высота была 6 метров, длина метров 20, в итоге я ее перепродал за 10000 (это копейки по сравнению с ценой самого профлиста). Это практически готовая крыша для дома, сарая, гаража
- несколько бытовок, в т.ч. металлических
В процессе работы программы возникало огромное количество проблем. Редко когда программа работала 2 недели подряд без моего вмешательства. Постоянно шла борьба с авито, т.к. они вводили все новые и новые подлянки. Особенно запомнился такой случай. Все шло хорошо, но почему-то ответ авито с данными для разбора стал очень маленький. Примерно раз в 10 меньше чем надо по объему. Стал выянять что случилось и понял что в html файле стали встречаться нули. Т.е. символы с кодом "0". И все строковые процедуры считали ноль за конец строки. Еще из с++ я мог с этим бороться, стал предварительно перебирать ответ сайта и менял все нули на пробелы. Но вот при разборе файла из 1с, этот номер не прошел. Нет просто в 1с никаких средств чтобы просчитать текстовый файл с диска и "перепрыгнуть" нули. Что я там только не делал - встречаю ноль - все, конец файла. В итоге я придумал такой способ. Перед разбором файла я пропускаю его через редактор sed - это старая программа времен ms dos, работает из командной строки и он может принудительно менять в файле одни символы на другие, вот я и менял нули на пробелы (0х20). При этом сами запросы я делал с периодом от 20 сек и больше. И скоро этой лавочке пришел конец. Пару раз сделал запрос, и все, "у вас проблемы с IP адресом". Больше авито не работает. Но правда потом минут через 20...30 снова работает. Но это уже был способ не пригодный для быстрого парсинга.
Я понял, что надо что-то менять в моей программе. Сначала я попробовал распределить все мои запросы по разным серверам с разными внешними IP адресами. Но это помогло лишь частично, запросов было больше чем доступных внешних IP адресов, а проверять бытовую технику раз в 5...15 минут, это никуда не годится. Утешение было лишь в том, что у моих конкурентов наверное были аналогичные проблемы. Хотя на авито есть платный API где можно делать запросы как угодно, никто тебя не заблокирует. Но в итоге мои отдачи пошли на ноль. Практически ничего не удавалось выловить.
Попытки переделать решение
Отказ от самодельных запросов
Я стал пытаться найти какой-то обходной путь. Причем бесплатный. И заметил что есть сервера, где моя программа не работает уже никак, т.е. и час и сутки можно ждать, но запрос так и не проходит, в ответ авито дает "проблема с IP адресом", но если запустить браузер, например, Chrome, то тот же запрос нормально проходит. Видимо дело в куках, но у меня уже был период когда я фиддлером вычислял какие именно куки требует авито и даже писал макрос для фиддлера, который вылавливал этот кук, затем я его вычитывал из файла в 1с и после подставлял в запрос. Но видимо программисты из авито пошли дальше и усложнили метод. Я понял что это плохой метод - всегда быть в позиции догоняющего и решил принципиально сменить парадигму. Надо пробовать открывать запрос просто браузером и сохранять ответ в html файл.
Так я пришел к первой части новой задачи. Разобрать готовый файл с ответом. Честно говоря, я замучился на с++ вручную искать всякие теги и решил все-таки использовать что-то более высокоуровневое. Главная задача была отказаться от кода на с++ и целиком работать из 1с. Благо в версии 8.3 есть много нужных мне инструментов: и запросы можно там руками делать и с FTP работать и html файлы анализировать. Так я и поступил. Стал разбирать html файл с ответом авито (т.е. там уже где были реальные объявления). Сначала я перегнал файл в здоровенный массив, а во вторую очередь я уже из массива делал выборку по тегам. Получал таблицу значений где каждая строка была реальными данными по объявлению:
- data id (т.е. идентификатор объявления)
- дата и время подачи объявления
А эта таблица значений уже могла быть напрямую обработана (отсеять по черным спискам, проверить нет ли такого в базе, сохранить в базу, если еще не отправлено, то отправить в мессенджер)
С разбором html файла у меня не сразу, но получилось. Надо было только получить сам файл причем не руками же его сохранять, надо было этот процесс автоматизировать. В итоге я написал bat файл такого типа:
taskkill /F /IM chrome.exe
cd "C:\Program Files\Google\Chrome\Application\"
start chrome.exe %my_url%
taskkill /F /IM chrome.exe
т.е. в качестве аргумента я передавал запрос, затем прибивал хром если он запущен, запускал хром с аргументом текст запроса, хром открывал страницу я ее видел на экране нормально открытую, затем хром снова закрывал. Осталось каким-то образом заставить хром сохранить страницу в файл.
Цель - перехват выдачи хрома
Сначала я призвал на помощь старый добрый фиддлер. Написал в нем дополнительный макрос:
static function OnBeforeResponse(oSession: Session)
if (oSession.HostnameIs('www.avito.ru') && oSession.fullUrl.Contains("&s=104"))
oSession.utilDecodeResponse();
var filename = "C:\\GETYULA\\" + "~" + DateTime.Now.Millisecond + "_" + oSession.id + ".txt";
Page = oSession.GetResponseBodyAsString();
var sw : System.IO.StreamWriter;
sw = System.IO.File.CreateText(filename);
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
Т.е. перед ответом на запрос проверить что это "наш" запрос. А именно: он к авито и содержит в себе строку "&s=104". А это сортировка выдачи авито по дате подачи объявления. Как только мы отловили наш запрос расшифровать его (строка oSession.utilDecodeResponse()), и сохранить в файл. Имя файла должно быть уникально, поэтому в его имени я использую текущую милисекунду и еще добавляю символ "~". В итоге если:
- потом запустить фиддлер с указанным макросом
- открыть хромом страницу запроса
- подождать секунд 15...20 пока в хроме все загрузится
То в чистом остатке на диске появится текстовый файл (на самом деле там html) со всеми объявлениями из моего запроса. А его уже я могу разобрать на объявления в 1с. Но у этого способа были недостатки:
- привлечение стороннего ПО (фиддлер)
- сложная синхронизация всех операций (я пару дней подбирал задержки для четкой работы) между запросами из 1с, запуском фиддлера и хрома
- постоянные задержки, я не мог отследить момент когда страница полностью загрузится, поэтому приходилось брать время с запасом. А это потеря драгоценных секунд.
управление хромом через питон
Некоторое время я изучал инет. Читал про аргументы командной строки хрома, читал про управление другими браузерами и нигде не нашел приемлемого способа сначала открыть страницу, потом ее автоматически сохранить. Я глядел даже в строну CURL. Эта консольная программа может очень многое, страницы тоже умеет скачивать в файл, но с авито она не смогла вытащить реальную страницу с объявлениями. В конце концов, я понял что реальный способ это использовать пайтон. Ну или "питон". Это язык который дофига чего может, у меня с ним не было особого опыта работы, но я решил попробовать. Скачал сам пайтон, установил его, и запустил вот такой найденный на первой же странице поисковика файлик:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://ya.ru');
html = driver.page_source
f = open("C:/GETYULA/~page.txt", "wt")
И да, это сработало! Сам запустился chrome, написал в строке уведомлений, что им управляет стороннее ПО, открыл яндекс и сохранил его вывод в файл. Методика была получена. Дальше этот скрипт надо было усовершенствовать.
- сделать анализ аргументов командной строки (мне же запросы разные надо передавать)
- добавить нужную кодировку
- правильно передавать запрос, содержащий русские буквы
- сделать запуск браузера более быстрым. Я знаю что chrome можно запускать без показа окна
Запуск невидимого браузера без участия оператора
После некоторых тестов я понял что если хром запускать без появления главного окна, это не сильно влияет на скорость. Но сильно ухудшает наглядность. Если браузер видим, то я еще как-то успеваю глянуть, что там выдается и понять работает ли моя программа нормально. В итоге после нескольких дней отладки я получил нормальное сохранение вывода браузера со списком объявлений с авито в файл. Отдельно пришлось повозиться с кодировкой чтобы было можно распознать русские буквы, в итоге все подобрал. Теперь интервал между запросами составляет 3 минуты. Это конечно не то что было раньше (по 20 сек делал интервалы), но тоже ничего. Как показала практика много чего удается получить или хотя бы первым откликнуться на объявление.
Бывали конечно и неудачи. Один раз какая-то тетка отдавала газовую варочную панель, как обычно бывает форсунки забиты, в ручки/кнопки залит жир и автоподжиг не работает, но это все можно починить. В таких панелях самое сложное это ее разобрать, т.к. винты по 100 раз залиты горячей жратвой, и головки намертво приржавели. Часто их приходится вообще высверливать чтобы добраться до внутренностей. Я с теткой договорился, взял телегу и рванул на метро. Там еще от метро минут 20 надо было на транспорте ехать. Выхожу из метро, пишу ей типа все ок, я еду, через 20...30 мин доберусь, а она в ответ, мне много пишут (еще бы, объявление не сняла, там десятки желающих), переведите мне 500 руб, чтобы подтвердить что вы действительно едете. Мне 500 руб не жалко, но у меня дело принципа - получить бесплатно или за шоколадку/фрукты. В общем дальше не поехал.
Также бывают "соревновальщики". Пишут "кто быстрее приедет, тому и отдам". С такими тоже не связываюсь.
Часто встречаются "качели". Сначала отдают бесплатно что-то, потом, видя что желающих дофига решают это продать. Но конечно же желающих становится ноль. Так было со внешним блоком кондиционера как-то. Я был первый и уже выехал, как тетка сменила пластинку "много желающих, теперь продаю за 5000". Потом через несколько дней снизила до 1000 и все равно никому нафиг не нужен был этот блок. Потом снова он стал бесплатным, но мне уже не хотелось туда ехать. Хотя по правде говоря больше половины людей все таки хозяева своего слова. Если договорились, то отдают железно на тех же условиях. Часто опоздавшие предлагают деньги, чтобы товар оставили именно им. Был случай с дохлым ТВ Филипс. Я договорился, и уже поехал за ним, а мужик пишет, мне за него дают 500 руб, так что обломись. Я принципиально не участвую в аукционах, больше не предлагаю, ну нет, так нет. Через несколько дней автор объявления пишет, "приезжай за тв, тот, что 500 руб предлагал пропал". Так что даже если вы первый кто написал или позвонил по объявлению совершенно не факт что вы получите то что отдают.
Список последних интересных отдач (осень 2024 г)
- два обогревателя, один починил, второй и так был исправный. Современные красивые в белых корпусах. Со всякими регуляторами.
- две видяхи PCIe (одна артефачит, вторая ОК)
- три вентилятора для ПК (откушены разъемы)
- системный блок крутой. Хоть там и LGA775 но стоит core 2 quad и охрененный блок питания
Zalman с подключаемыми кабелями на 500 Вт (очень грязный, жесть). БП разобрал прочистил, заменил 3 вздувшихся конденсатора 2200Х6.3 и все, работает, проверил.
- кофемашина с мельницей для зерен крутая огромная Siemens (не рабочая, буду чинить). Это уже вторая кофемашина такого типа у меня, первую починил просто магнитиком :-) Там была утеряна крышка отсека, куда насыпаются зерна кофе и машина не стартовала без этой крышки, приклеил магнит, подобрал крышку. Капельные и рожковые кофеварки не беру, их дофига отдают. Добавлено: провел декальцинацию, машина заработала, кофе варит.
- 6 старых ноутбуков (времен Windows XP/7) некомплектные (пошли на доноры SMD компонент)
- материнка на сокет 1155 с процессором (не стартует, может починю если повезет) Добавлено: проверил, она нормально работает, только брендовая от НР, стоял пароль на биос, сбросил его перемычкой.
- Газовый конвектор alpine air 50 (говорят исправный и весит более 30 кг). С ним вместе отдали выхлопную трубу, пропановый баллон на 27 л и шкаф для 50 л баллона!!!
- шуруповерт hitachi без аккумуляторов
- дегидратор (сушилка для овощей/грибов) Viatto VA-Dg6ss (не включается, попытаюсь починить). Добавлено: починил, просто сгорел предохранитель на 10А. Заменил, включил, работает. Там нихромовая спираль и металлический вентилятор сквозь сетки с фруктами или грибами гонит теплый воздух просто.
- газовая варочная панель Ariston (не работает электро поджиг)
- газовая колонка Vilterm s13 (течет в подводке, можно починить)
- 11 дохлых аккумуляторов от бесперебойников (это только на цветмет)
- фотоаппарат Canon powershot S2 IS (не работает ЖК дисплей, но все остальное работает, вставил батарейки и карту памяти, смотреть можно через видоискатель, фотки делает, объектив выдвигает)
Также были ранее очень жирные отдачи, часть из которых я продал. Например:
- Котел на дизельном топливе с горелкой мощность 40 КВт, исправный, но очень тяжелый
- Печь камин на дровах "Бавария 3 стекла", правда вместо трех стекол были вварены стальные листы
- 80 кг медного купороса. Потом его удачно продал
- Два платежных терминала. Сейчас переделываю их под управление бильярдным залом.
- Бесперебойник Eaton 9305 мощностью 30 КВт, в виде железного шкафа на колесах, весил наверное 200 кг
Бесперебойник и разобранные стеллажи
- целый склад отрезных и шлифовальных дисков для болгарки. Новые импортные в коробках по 10 или 25 шт. Взял столько, сколько влезло в машину, наверное около 150 кг.
- стеллажи из осб, и их много. Закрывался какой-то пункт выдачи заказов. Стеллажи хотело несколько СОТЕН человек, но я был первым.
- 3 огромных внешних блока от кондиционеров, одному не поднять, затаскивал в прицеп лебедкой по доскам
это уже после помывки и мелкого ремонта
- 35 бесперебойников APC мощностью от 500 до 650 Вт. Просто без аккумуляторов, исправные
- еще один мобильный кондиционер AEG исправный, купил для него переходник чтобы гофру наружу вытянуть
- 3 больших электрических шкафа. Высотой от 80 см до метра. С кучей автоматов и прочей фигней внутри, мне очень понравились толстенные медные шины. Жалко их сдавать на цветмет. Шкафы питали какой-то цех
- большая коробка инструментов: болгарка, дрель, куча отверток, ключей и прочего
- 2 40 л баллона из под углекислоты (заправил их и использую для сварки)
В результате деятельности по получению халявы, ремонту и продаже ее был куплен автомобиль!
внешний вид сразу после покупки.
Мерседес 308D почтовик. Желтого цвета 1995 года выпуска. Также купил кучу кузовного железа для него (крылья, ремкомплекты дверей, телевизор, решетку радиатора и новый радиатор, помпу, ремень, арки, капот) и еще что-то. Сам а/м 1995 года, пробег 400000 км, дизельный двигатель, коробка автомат. И он едет и нормально заводится. Такой а/м хорош для получения всякой техники, в него _СТОЯ_ влезет куча холодильников, т.к. высота кузова 2 метра. И двери тоже 2 м высотой. Сзади есть подножка. В кузове можно поставить кровать и спать в нем, если тепло в ожидании отдачи. Есть сдвижная дверь из кабины в кузов. Если открыть эту дверь, можно возить длинномеры. Пока занимаюсь его ремонтом и приведением в божеский вид. На весну планирую заказать работы по подъему моего ижорского гаража на 85 см чтобы мерс туда нормально заезжал. Получится гараж - великан.
Даже страшно представить как это будет выглядеть. Но с председателем кооператива я уже договорился. Сделаю к заднему входу в мерс аппарели и лебедку внутри кузова чтобы играючи затягивать какие-нибудь стиралки или холодильники.
Также на вырученные от продаж деньги, я покупаю оборудование для ремонта всякого, например:
- манометрическая станция
- что-то для заправки кондиционеров
- оплачиваю взносы за гараж
Получение халявы с авито интересная и перспективная идея.
- отдачи никогда не кончаются
- они случаются практически каждый день
- мне не надо платить за аренду офиса (все работы провожу в гараже, дома или на даче)
- то что я продаю не надо закупать, если что-то не продается, можно это просто выкинуть или сдать на металлолом
- у меня не особо много конкурентов
- я еще и приношу пользу людям, которым надо от чего-то срочно избавиться
- программой пользуюсь не только я, но еще и несколько клиентов. Если вы не из СПб, то вы мне не конкурент: платите за свои рассылки и получайте халяву. В день реально набрать техники на несколько тысяч рублей.
- это не работа в теплом офисе, надо мотаться по городу в т.ч. и в плохую погоду
- есть риск куда-то поехать и остаться с носом