carmolim / olx-monitor

Script que monitora novos anúncios feitos no OLX, alteração de preços em anúncios existentes e envia notificações para seu Telegram.
MIT License
76 stars 29 forks source link

Não é mais possível persistir as URLs a partir de hoje #18

Closed rafaelribeiroo closed 6 months ago

rafaelribeiroo commented 10 months ago

Boa tarde amigo,

Fui executar o script hoje e pela primeira vez ele me retornou diversos erros ao tentar enviar a requisição pra URL especificada, você também está enfrentando esse tipo de erro? Vou informar o log abaixo, bem como o trecho do código responsável por isso.

12:03:53.571 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=41 12:03:53.673 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=42 12:03:53.776 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=43 12:03:53.876 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=44 12:03:53.978 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=45 12:03:54.082 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=46 12:03:54.188 ERROR Could not fetch the url https://www.olx.com.br/brasil?q=funko&o=47

do {
        currentUrl = setUrlParam(url, 'o', page)

        try {
            const response  = await axios(currentUrl)
            const html      = response.data;
            const $         = cheerio.load(html)
            nextPage        = await scrapePage($, searchTerm, notify, url)
        } catch (error) {
            log.error('Could not fetch the url ' + currentUrl)
        }

        page++

    } while (nextPage);

Minha URL monitorada:

config.urls = [
    'https://www.olx.com.br/brasil?q=funko'
]

WORKAROUNDS

Já tentei solucionar removendo o database e recriando e mesmo assim o erro persiste.

rafaelribeiroo commented 10 months ago

Acredito fortemente que olx mudou a estrutura dos dados novamente

carmolim commented 10 months ago

Bom dia! Uma boa notícia e uma má notícia. A boa notícia é que a estrutura da página não mudou, continua tudo na mesma. A má notícia é que agora o Olx aplicou uma proteção contra bots utilizando a CloudFlare. Quando você faz a chamada para o Olx usando um curl, você vai ver essa mensagem:

Sorry, you have been blocked

You are unable to access olx.com.br

Ainda não sei se será possível remediar essa situação de uma maneira fácil. Sabia que isso poderia acontecer a qualquer momento, e é bem simples a para a Olx fazer esse bloqueio e infelizmente aconteceu.

Assim que tiver novidades publico aqui.

rafaelribeiroo commented 10 months ago

Se ajudar, tem alguns projetos bem famosos pelo github que realizam o bypass na CF, posso te indicar alguns, inclusive usando NodeJS

carmolim commented 10 months ago

Eu fiz um teste rápido usando o https://github.com/puppeteer/puppeteer que já foi o suficiente para resolver, mas ainda quero ver se tem outras alternativas mais performáticas. Se você puder listar alguns projetos eu agradeço!

rafaelribeiroo commented 10 months ago

Eu testei este aqui atualizado ontem e funciona tranquilo, porém o mantenedor considera todos os ADs (inclusive antigos) sendo novos e dispara inúmeras notificações, o seu é realmente é bem performático.

carmolim commented 10 months ago

Fiz uma alternativa funcional utilizando o Puppeteer, mas o script fica bem mais lento e mais pesado e não é a solução que gostariad de utilizar. Fiz vários testes mas ainda não consegui entender perfeitamente o que está acontecendo, vou documentar minhas descobertas para ver se alguém consegue enxergar algo que não estou conseguindo ver.

Basicamente utilizando a versão mais recente do script, a primeira requisição feita para o Olx sempre retorna 200, mas todas as requisições posteriores são respondidas com uma página de erro do Cloud Front com status code 403.

Hoje as requisições são feitas sem enviar nenhum header específico para tentar evadir o bloqueio. O projeto que o @rafaelribeiroo compartilhou usa python, mas até onde eu vi ele não usa nenhuma técnica para tentar contornar um possível bloqueio do Cloud Front além de passar alguns headers, mas não entendo muito de python para ter certeza se ele realmente não está fazendo mais nada além disso, mas de qualquer forma o script está funcionando.

Apesar do status code ser 403 suspeitei que poderia ser algum tipo de rate limit (que normalmente usa o status code 429), porque a primeira requisição retorna 200 e as posteriores não. Porém colocando um delay de 1, 5, 60 segundos não teve efeito nenhum, todas as requisições posteriores caíram no mesmo bloqueio, indicando que não dever ser um rate limit, até porque se eu fechar a execução do node, e inciar novamente várias vezes por minuto a primeira requisição sempre retornou 200.

Outro teste que fiz e, estranhamente foi bem sucedido foi o de fazer várias requisições "paralelas" utilizando o Promise.all` dessa forma testei fazer por volta de 100 requisições e todas retornaram 200 com as informações corretas. Achei esse comportamento estranho, talvez seja uma evidência de que não deve ser um bloqueio de rate limit, mas também não me ajudou muito a entender porque todas as requisições retornaram o resultado esperado.

Infelizmente não dá para fazer o script funcionar assim de forma eficiente, seria necessário fazer pelo menos uma requisição para cada um dos links monitorados para saber quantas páginas de resultados cada um tem, e aí fazer todas as chamadas, mas como apenas a primeira chamada está "passando" não daria para fazer isso também.

A pergunta é: o que acontece de diferente quando uso o Promise.all? Eu só consigo pensar no tempo diferença entre as requisições.

Para testar isso ao invés de colocar um delay de 1 segundo entre as requisições, eu fui diminuindo o delay entre as requisições e quando cheguei em 300ms a segunda requisição também teve sucesso, mas já na quarta ou as vezes na terceira (variava de acordo com o tempo de resposta de cada GET) já recebia um 403 novamente. O que confirmou que de fato o intervalo entre as requisições tem alguma influência no que está acontecendo.

Continuei testando e encontrei outro comportamento estranho. Eu utilizei duas instancias do nodemon para executar o mesmo arquivo de teste ao mesmo tempo e sempre a primeira requisição dava sucesso e as seguintes não.

Fiz diferentes variações desse teste:

Depois disso ainda fiz outros testes, utilizei headers reais de browsers para cada requisição, criei uma nova instância do axios com headers válidos a cada requisição e o comportamento continuou o mesmo: a primeira requisição retorna sucesso e as demais 403.

Outro teste que fiz foi fazer requisições usando o curl fazendo uma requisição simples:

curl --request GET \
  --url 'https://www.olx.com.br/brasil?q=funko' \

Também cai no 403, mas passando alguns headers (os mesmos que usei no axios) retorna 200 com o conteúdo esperado:

curl 'https://www.olx.com.br/' \
  -H 'authority: https://www.olx.com.br/brasil?q=funko' \
  -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
  -H 'accept-language: en-US,en;q=0.9' \
  -H 'cache-control: no-cache' \
  -H 'dnt: 1' \
  -H 'pragma: no-cache' \
  -H 'sec-ch-ua: "Chromium";v="119", "Not?A_Brand";v="24"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'sec-fetch-dest: document' \
  -H 'sec-fetch-mode: navigate' \
  -H 'sec-fetch-site: same-origin' \
  -H 'sec-fetch-user: ?1' \
  -H 'upgrade-insecure-requests: 1' \
  -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' \
  --compressed

Enfim, não sei o que está acontecendo, só consigo afirmar que acontece algo após a primeira requisição feita (com exceção a quando utilizo o Primise.all que talvez sejam "várias primeiras requisições") que acaba bloqueando as requisições subsequentes.

Acho que os próximos passos seria analisar os headers que o servidor envia para tentar encontrar alguma pista.

Depois de ler muita coisa na internet também acredito que esse bloqueio possa estar sendo fruto de algum tipo de tls fingerprinting, isso explicaria porque as chamadas feitas pelo projeto em python não estão sendo bloqueadas e as feitas em node estão. Também não tenho certeza disso mas uma das evidências que apontam nessa direção é que um dos tests que fiz foi de testar diferentes versões do node para ver se afetaria o resultado e para minha surpresa outras versões não estão sendo bloqueadas:

✅ v20.9.0 ✅ v19.9.0 🛑 v18.3.0 🛑 v18.17.1 ✅ v16.16.0

Na minha máquina eu estava rodando a versão 18.3.0, @rafaelribeiroo, consegue ver qual versão você está utilizando e verificar se mudando para alguma dessas versões o script funciona normalmente?

Ainda preciso investigar mais, mas sei que o node não disponibiliza uma API que permita fazer configurações de baixo nível no TLS, o que útil contornar essa situação, isso se realmente for um bloqueio utilizando tls fingerprinting, mas ainda é possível fazer algumas tentativas como reordenar as cifras enviadas no client hello e gerar novos fingerprints.

Ainda não consegui fazer nenhum teste baseado nisso, mas parece ser uma solução promissora para tentar evitar utilizar o Puppeteer.

Quando tiver mais um tempo para estudar e fazer alguns testes atualizo por aqui, por hora a saída parece ser trocar a versão do node, verificar se funciona e esperar que demorem para bloquear novamente.

rafaelribeiroo commented 10 months ago

Boa noite! Obrigado pela atenção e prestatividade @carmolim. Cheguei a testar todas as versões mencionadas e infelizmente continuo recebendo os erros mencionados, vamos verificar se mais algum usuário contribuirá nessa issue, obrigado desde já

Poderia por gentileza criar uma ramificação com a solução do Puppeteer?

mermao1 commented 10 months ago

Olá, @rafaelribeiroo @carmolim. Vocês estão recebendo o retorno de erro no scrapper.log?

Acabei de fazer uma busca em meu log e não achei nada que possa indicar que minhas requisições possam estar sendo bloqueadas, e meu monitor está funcionando certinho, sem intercorrências nos últimos dias.

Algumas informações: Node: v14.16.1 (Não me xinga, @carmolim - time que tá ganhando não se mexe 😂) Quantidade de URLs buscadas: 34 😮 Timing: /15 * - Busca à cada 15 minutos - xx:15 - xx:30 - xx:45 - xx:60 - Rodando 24 horas em SCREEN IP do servidor: Brasileiro residencial (servidor local em minha casa)

rafaelribeiroo commented 10 months ago

Oba, belezinha @mermao1 ? Sim, o erro consta também no scrapper.log, conforme evidência abaixo. Muito estranho tudo isso, em nenhum momento seu script ficou bichado?

image

carmolim commented 10 months ago

Boa noite pessoal. Essa semana tirei um tempinho para fazer alguns testes e com a ajuda do @termack deu para entender como a mitigação do CloudFlare estava atuando, fiz os ajustes necessários no código para o script voltar a funcionar normalmente.

Durante esses testes deu constatar que a equipe da Olx aplicou algumas medidas de segurança para impedir o uso de bots, e além disso aplica diferentes níveis de segurança para diferentes endereços.

Especificamente no caso do @rafaelribeiroo que está fazendo uma busca no Brasil inteiro existe um nível de segurança mais alto, possivelmente porque existe uma chance maior da quantidade de anúncios ser mais alta. Foi por esse motivo que o script não funcionou para você mesmo utilizando outras versões do node. Talvez seja interessante criar um monitoramento para várias urls de diferentes lugares ao invés de buscar no Brasil inteiro para evitar bloqueios.

Apesar de não conseguirmos determinar exatamente qual o mecanismos de proteção que eles estão utilizado com certeza é voltada a proteger o sistema contra bots. O ajuste foi simples de fazer e não envolve nenhuma solução sofisticada, quando fizer a PR vou dar mais detalhes, mas gostaria de lembrar que é um tanto quanto trivial eles aplicarem bloqueios que sejam mais efetivos.

Eu estou rodando local essa nova versão e espero disponibilizar, se tudo correr bem, nesse final de semana.

@mermao1 eu não cheguei a testar com a versão 14 do node, mas ele deve estar funcionando com a combinação de urls que você está utilizando, você deu sorte!

carmolim commented 10 months ago

Quem quiser ajudar a testar, acabei de publicar a versão com os ajustes nessa branch: https://github.com/carmolim/olx-monitor/tree/cloudflare

Possível que dê problema no envio das notificações porque nesse período pode ter tido muitos anúncios novos e mudanças de preço e vai encavalar os envios para o Telegram pretendo arrumar esse comportamento, mas só causa problema quando o script fica algum tempo sem rodar e houveram muitas mudanças nesse intervalo de tempo.

mermao1 commented 10 months ago

@rafaelribeiroo não, o script está funcionando normalmente e sem intercorrências.

root@proxy:~/olx-monitor# cat scrapper.log |grep INFO |wc -l
321563
root@proxy:~/olx-monitor# cat scrapper.log |grep ERROR |wc -l
144

Meus erros são em grande maioria isso aqui:

11:15:03.341 ERROR SQLITE_CONSTRAINT: UNIQUE constraint failed: ads.id
13:15:04.286 ERROR SQLITE_CONSTRAINT: UNIQUE constraint failed: ads.id
18:00:03.844 ERROR SQLITE_CONSTRAINT: UNIQUE constraint failed: ads.id
09:28:59.917 ERROR SQLITE_CONSTRAINT: UNIQUE constraint failed: ads.id

Tive pouquíssimos erros relacionados ao insucesso na requisição da página, mas são tão eventuais que eu tenho certeza não ser nada relacionado a bloqueio:

root@proxy:~/olx-monitor# cat scrapper.log |grep "Could not fetch the url" |wc -l
7
Possomato commented 10 months ago

Olá pessoal! @carmolim, estou testanto essa branch nova que você disponibilizou aqui com apenas um link de pesquisa em todo o Brasil, e está funcionando perfeitamente, como antes.

Obs. Estou rodando com Node v20.9.0, e também, não tive o problema do flood de mensagens no telegram.

mermao1 commented 10 months ago

Parece que agora o bloqueio chegou pra mim =(

mermao1 commented 10 months ago

@carmolim tava pensando, será que é possível rodar o comando do node incluindo um proxy http? que aí já testaríamos block para o IP. Poderia ser uma blacklist? Excesso de requisições vindo daquele IP?

Edit: Não é o IP. Estou acessando OLX normalmente utilizando um PC com o mesmo IP. Problema deve ser a detecção da requisição por bot / curl mesmo.

mermao1 commented 10 months ago

Esse Browser Integrity Check da Cloudflare é tenso. Não posso contribuir com programação, mas vou trazer alguns links que acho que podem contribuir de alguma forma.

https://stackoverflow.com/questions/71529199/where-does-cloudflare-detect-web-and-terminal-requests-on-equal-terms

https://github.com/Alrefai/clanime/commit/1428ac955b87bf698372ea7e906a6834c41d736e

https://github.com/IBM/taxinomitis/commit/0b3fe1a5efbc699491f63cf83cb62a434be5b1cf

https://gist.github.com/jeszy75/4267c2f501880a4bf6dac65d25ab10c2#impersonating-a-browser (curl-impersonate)

victorviana3 commented 10 months ago

Olá. Estou rodando o aplicativo ja na branch cloudflare mas não tá dando certo. o erro é

nov 18 10:19:30 raspberrypi olx-monitor.service[1621]: 10:19:30.391 ERROR json error: Error: Request failed with status code 403
nov 18 10:19:30 raspberrypi olx-monitor.service[1621]: 10:19:30.401 ERROR Request failed with status code 403
nov 18 10:19:30 raspberrypi olx-monitor.service[1621]: {"message":"Request failed with status code 403","name":"Error","stack":"Error: Request failed with status code 403\n    at createError
mermao1 commented 10 months ago

Também testei a nova branch e sem sucesso.

Mas uma notícia boa: testei essa ferramenta: https://github.com/lwthiker/curl-impersonate/releases (versão v0.6.0-alpha.1), e minha requisição em curl passou o Browser Integrity Check da Cloudflare:

root@proxy:~/curl# ./curl_chrome107 --url "https://www.olx.com.br/computadores-e-acessorios?pe=500&q=fonte%20flex" -I
HTTP/2 200
date: Sun, 19 Nov 2023 12:44:50 GMT
content-type: text/html; charset=utf-8
cache-control: max-age=60
cache-control: no-transform
x-powered-by: Next.js
etag: "qasdjhqa336wvh"
content-encoding: gzip
expires: Sun, 19 Nov 2023 12:45:50 GMT
x-frame-options: SAMEORIGIN
x-nc: 0
x-content-type-options: nosniff
access-control-allow-credentials: true
access-control-allow-methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
access-control-allow-headers: Authorization, Content-Type
content-security-policy-report-only: default-src https: wss: data: 'self' 'unsafe-inline' 'unsafe-eval'; report-uri https://cspreport.olx.com.br/api/v1/cspreport/mixedcontent
vary: Accept-Encoding
set-cookie: r_id=f1f7076b-d4a8-45ab-bd1f-38a9df592ec0; Domain=.olx.com.br; Path=/; Max-Age=34560000; SameSite=Strict
x-cache: Miss from cloudfront
via: 1.1 b8e85c5c71395f0e0fb2f8242762543e.cloudfront.net (CloudFront)
x-amz-cf-pop: FOR50-P1
x-amz-cf-id: kxGAx_ylHhwy6Df0jXw4q99BSvP1vd37yezKWcaapUHspT3ZsSbqAA==
cf-cache-status: DYNAMIC
set-cookie: TestAB_Groups=sanityweb50_control.ds-web-vitals_enabled.ngage-chat-on-gallery_enabled.txp-fakedoor-buy-button_optreq.payg-discount-re-julius_ml-ranges.ppc-myplan-redirect-lp_enabled.goods-history-sales_control.adfacelift-default-web_control.ppf-free-insertion-re_enabled.ds-header-navbar_enabled.free-edtion-goods-parcela_enabled.delivery-quote-weight-11060_control.delivery-quote-weight-3040_control.txp-expanded-delivery-method_control.billing-history_enabled.pay-now-always_enabled.apmkel-filters-fair_switch.txp-retry-by-id-pay_enabled.adv-remocao-topo_control.ppf-myplan-new-marketplace-pos_enabled.payg-discount-julius_ml-ranges.imo-xp-linkshelf-autocomplete_enabled.ngage-chat-miniprofile_enabled.ppf-boost-motos_enabled.ngage-adview-miniprofile_enabled.delivery-methods-modal_control.bumpds-bjperformancetrackb_control.rec-adv-package_on.apmkel-list-item-fair-badge_orange.autospp-notshow-modal-hv-myads_control.ppf-edition-re_enabled.chatmod-logged-user-showphonebody_enabled.autos-aqui-mileage_control.mes-chats-http-retrieves_enabled.adsxp-adviewlinks-bjQTZ-3020_enabled.bj-homepage-abtest_enabled.contentmod-gallery-tip_control.imo-xp-adview-modules_priceInfoAtTop.acc-split-login-v2_control.imo-xp-privatead_enabled.listing-grid_list.ngage-listing-badges_control.pos-cars-fee-boost_d-first; Domain=.olx.com.br; Path=/; Max-Age=1800; SameSite=Strict
set-cookie: __cf_bm=CUi4vkZICGPN79w4fOBR0FJJpf6sf6LjErFu8i3FgD4-1700397890-0-AYjZ4flhmFXVIJd3i0dfYd0BimGKfG0yqUqC8E9Dbk5xj8fTfYohzXWHOjO2YrJ7BkbzY4AmJvBjK9QDO4fEXK4=; path=/; expires=Sun, 19-Nov-23 13:14:50 GMT; domain=.olx.com.br; HttpOnly; Secure; SameSite=None
server: cloudflare
cf-ray: 82888bfc5e87280c-JDO

Já com a utilização do curl próprio do sistema (sem as modificações do repositório acima):

root@proxy:~/curl# curl "https://www.olx.com.br/computadores-e-acessorios?pe=500&q=fonte%20flex" -I
HTTP/2 403
date: Sun, 19 Nov 2023 12:47:29 GMT
content-type: text/html; charset=UTF-8
x-frame-options: SAMEORIGIN
referrer-policy: same-origin
cache-control: max-age=15
expires: Sun, 19 Nov 2023 12:47:44 GMT
set-cookie: __cf_bm=6SXxTYRfzPAG6narwrYGH51V429ExiW7CWowE7ziuFo-1700398049-0-AcovNnuxAEtbx8/25BasMCpXfWaTuc2DW8zT9lah6ZGtPfS6JJyMrSPiHzHAzKM6tjhiSJkNLIHd/1Rjg09zZVE=; path=/; expires=Sun, 19-Nov-23 13:17:29 GMT; domain=.olx.com.br; HttpOnly; Secure; SameSite=None
server: cloudflare
cf-ray: 82888fdf4b646f92-JDO

@carmolim algo que possa ser aproveitado dessa ferramenta?

rafaelribeiroo commented 10 months ago

vo ja na branch cloudflare mas não tá dando certo. o erro é

Aoba @carmolim , obrigado mais uma vez pela atenção e dedicação nesse algoritmo que tem ajudado demais... recentemente eu fiquei off para testar 24/7 essa nova branch que você disponibilizou e a princípio ela funcionou perfeitamente, inclusive ela funciona muito bem nas primeiras horas após executar o código, mas após umas 8-9h de execução ininterruptas, ela retorna o erro abaixo, mas é só rodar novamente que dá tudo certo (supervisord recomendado).

image

carmolim commented 9 months ago

Olá pessoal, de fato o Olx, deu uma apertada na mitigação contra bots, quase 100% de certeza que agora eles estão utilizando fingerprint de TLS.

@Possomato com os ajustes da branch cloudflare era para funcionar com todas as versões mesmo, então o comportamento era esperado para as buscas no Brasil todo, mas agora não parou.

@mermao1 certamente o bloqueio por ip é uma possibilidade, mas como os ips residenciais acabam mudando de tempo em tempo não acho que eles irão optar por esse caminho, a não ser que a quantidade de requisições seja muito alta sempre do mesmo ip e por um longo período de tempo, no caso de você ter um VPS, mas mesmo assim iria exigir um esforço maior para ficar gerenciando blocklists de ips. Se eles aplicassem um rate-limit por ip, seria mais efetivo. O último link que você mandou do stack overflow tem uma resposta interessante comentando sobre o naiveproxy, não cheguei a me aprofundar no projeto, mas talvez possa ajudar em algo no futuro.

@victorviana3 realmente eles fizeram um bloqueio melhor agora, por isso o ajuste que eu tinha feito parou de funcionar.

Estou testando uma alternativa que permite com que as requisições feitas pelo node tenham um fingerprint ja3 de um navegador válido, dessa forma, se eles aplicarem o bloqueio para esse ja3 específico também irão acabar bloqueando clientes legítimos. Oprojeto que estou utilizando se chama CycleTLS, ela já fornece uma lib para ser utilizada no node, o que facilita a integração, mas por trás do pano ela usa processos em go. A sugestão do curl-impersonate parece ser interessante também, mas achei mais complicada de integrar.

Nesse link é possível ver qual é o fingerprint ja3 que o seu navegador gera, se vocês quiserem contribuir, conseguimos fazer uma lista com vários ja3 e randomizar por essa lista a cada requisição, dificultando um pouco mais a vida do Olx, dá para entrar pelo celular e também em navegadores diferentes, assim conseguimos uma lista maior de fingerprints legítimos. É importante testar as combinações antes porque nem sempre elas tem funcinando 100%.

Esses são alguns pares de user-agent / ja3 que consegui até o momento que estão funcionando:

[
    [
        'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0',
        '771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-51-57-47-53-10,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25-256-257,0',
    ], 
    [
        'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0',
        '771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,27-51-35-13-18-23-16-0-5-65281-11-43-10-45-17513-21,29-23-24,0'
    ]
];

O último commit na branch cloudflare funcionou corretamente nas últimas 48 horas, vamos esperar que ele dure por mai sum tempo. Importante rodar npm install antes para baixar a nova dependência.

Obrigado pela colaboração de todos!

victorviana3 commented 9 months ago

Obrigado! tem funcionado corretamente desde o ultimo commit!

FernandoGiovannini commented 9 months ago

funcionando corretamente aqui também com o ultimo commit

mermao1 commented 9 months ago

Funcionando aqui também \o/

rodrigosnovac commented 9 months ago

Funcionando perfeitamente aqui 🙏

carmolim commented 9 months ago

Que bom voltou a funcionar, espero que essa correção dure por mais um bom tempo! Em breve vou fazer a PR para fazer o merge com a master. Obrigado pela compreensão e colaboração!

carmolim commented 9 months ago

Hoje eu fiz um teste com a branch main, que roda com a antiga solução que tinha parado de funcionar e para minha surpresa estava funcionando perfeitamente. Não sei o OLX alterou segurança deles, ou o que pode ter acontecido, mas aparentemente está 100% funcional. 🤷‍♂️

brunojsilv commented 9 months ago

Boa noite, estou tentando testar com a branch cloudflare, mas sempre recebo um erro após o npm install e node index.js

-----------------------Saída do console---------------------------

up to date, audited 165 packages in 2s

22 packages are looking for funding run npm fund for details

4 moderate severity vulnerabilities

To address all issues (including breaking changes), run: npm audit fix --force

Run npm audit for details. node:internal/modules/cjs/loader:1147 throw err; ^

Error: Cannot find module 'form-data' Require stack:

Node.js v20.10.0


Estou executando através de um container Docker, eu faço um clone do branch para uma imagem base do node alpine, copio os meus arquivos config.js e .env, aplico as permissões para o usuario node e seto a pasta raiz do script como workdir padrão.

Na branch main, o script executa, mas cai no bloqueio já citado da cloudflare.

Somente na branch cloudflare que o script retorna esse erro, alguém poderia me ajudar?

carmolim commented 9 months ago

@brunojsilv consegue compartilhar o seu Dockerfile / docker-compose para tentar reproduzir o problema?

brunojsilv commented 9 months ago

Consigo sim, segue em anexo os dois arquivos comprimidos em .zip.

Adicione os arquivos .env e config.js no mesmo local do Dockerfile/docker-compose.yml que no processo de build eles serão copiados para dentro do container do node.

dockerfile+compose_olx-monitor.zip

eduardocvaz commented 9 months ago

@brunojsilv veja se esse comando resolve seu erro npm install --save form-data

carmolim commented 8 months ago

@brunojsilv eu não tive tempo de testar os arquivos que você mandou ainda, mas iniciei uma PR reorganizando o código para facilitar a criação de uma imagem docker para usar o projeto.

Eu passei pelo mesmo problema que você está passando, não tenho certeza, mas acho que está relacionado à imagem node:alpine. Eu iniciei usando a mesma imagem que você está usando como base mas tive problemas diferentes rodando no ubuntu e no mac os.

Tente utilizar apenas a imagem node para ver se passa a funcionar.

Eu não tenho muita experiência mexendo com docker, mas agora estou conseguindo testar certinho no ubuntu e no mac.

Espero criar uma PR em breve para deixar um Dockerfile certinho, e talvez até disponibilizar no Docker Hub.

carmolim commented 7 months ago

@brunojsilv publiquei essa brach com um Dockerfile e um arquivo docker-compose.yml para você testar. Ainda tem alguns ajustes que quero fazer, mas o queria ver se você consegue rodar na sua máquina essa versão.

brunojsilv commented 7 months ago

Opa, testei aqui, está funcionando no branch docker sim, disparou as mensagens no telegram também, chega em um determinado momento que ele dá um erro crítico e o container morre, mas imagino que seja por conta desses ajustes que você mencionou que ainda precisa fazer.

De qualquer forma, segue a saída final do log para fins de consulta:

olx-monitor-1 | node:internal/process/per_thread:233 olx-monitor-1 | throw new ErrnoException(err, 'kill'); olx-monitor-1 | ^ olx-monitor-1 | olx-monitor-1 | Error: kill ESRCH olx-monitor-1 | at process.kill (node:internal/process/per_thread:233:13) olx-monitor-1 | at /usr/app/node_modules/cycletls/dist/index.js:264:29 olx-monitor-1 | at new Promise () olx-monitor-1 | at Golang.exit (/usr/app/node_modules/cycletls/dist/index.js:261:20) olx-monitor-1 | at CycleTLS.exit (/usr/app/node_modules/cycletls/dist/index.js:370:37) olx-monitor-1 | at httpClient (/usr/app/components/HttpClient.js:38:12) olx-monitor-1 | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) olx-monitor-1 | at async scraper (/usr/app/components/Scraper.js:34:31) { olx-monitor-1 | errno: -3, olx-monitor-1 | code: 'ESRCH', olx-monitor-1 | syscall: 'kill' olx-monitor-1 | } olx-monitor-1 | olx-monitor-1 | Node.js v21.6.1 olx-monitor-1 exited with code 0

Qualquer update na branch docker que precise de teste é só me falar que eu executo aqui, blz? Obrigado.

carmolim commented 6 months ago

valeu @brunojsilv, vou tentar mexer com isso no final de semana, aparentemente o problema é numa dependência, talvez não seja tão simples de resolver. Como essa discussão sai do escopo inicial desse issue vou fechar aqui e quando tiver novidades eu te marco .