Solo estaba tratando de generar una alerta de vacuna covid usando Cowin Setu API (India) en nodejs. Pero me enfrento a algo extraño, cada vez que presiono obtener solicitud, recibo un código de respuesta 403 de cloudfront que dice "Solicitud bloqueada", pero lo mismo funciona tanto desde el cartero como desde el navegador. Por favor, ayúdame en esto
Obteniendo este error: -
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> <TITLE>ERROR: The request could not be satisfied</TITLE> </HEAD><BODY> <H1>403 ERROR</H1> <H2>The request could not be satisfied.</H2> <HR noshade size="1px"> Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner. <BR clear="all"> If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation. <BR clear="all"> <HR noshade size="1px"> <PRE> Generated by cloudfront (CloudFront) Request ID: Q1RZ94qgFp6AjUUKE4e9urMB85VejcqMbaJO6Y8Xq5Qp4kNjDBre9A== </PRE> <ADDRESS> </ADDRESS> </BODY></HTML>Aquí está mi código nodejs:
var express = require("express"); var app = express(); var bodyParser = require("body-parser"); const axios = require("axios"); const { Telegram } = require("telegraf"); const fetch = require("node-fetch"); var cors = require('cors'); var request=require('request'); const tg = new Telegram(process.env.BOT_TOKEN); const bot = new Telegram(process.env.BOT_TOKEN, { polling: true }); //bot.start((ctx) => ctx.reply('Welcom to Covid Vaccine Finder')) /*bot.hears("about", ctx => { ctx.reply("Hey, I am CoviBot!"); }); bot.launch();*/ app.use(bodyParser.json()); app.use(cors()); app.use( bodyParser.urlencoded({ extended: true }) ); app.get("/", function(req, res) { res.send("Welcom to Covid Vaccine Finder"); }); app.get("/test", function(req, res, next) { var d = new Date(); var options = { year: "numeric", month: "2-digit", day: "2-digit" }; var date = String(d.toLocaleDateString("en", options)); date = date.replace(/\//g, "-"); console.log(date); const URL = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/findByPinpincode=110088&date=13-05-2021"; var options = { url: URL, method: 'GET', headers: { 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-GB,en;q=0.8,en-US;q=0.6,hu;q=0.4', 'Cache-Control': 'max-age=0', Connection: 'keep-alive', Host: 'cdn-api.co-vin.in', 'User-Agent': 'request', } }; request(options,function(err,res,body){ let json = body; console.log(json); }); const txt = "Finding vaccine centres for you...."; //tg.sendMessage(process.env.GROUP_ID, txt); res.send(txt); }); // Finally, start our server app.listen(process.env.PORT, function() { console.log("Covid app listening on port 3000!"); });Espero que este problema se solucione
Gracias
Ok, si quieres trabajar localmente, puedes usar
let headers = { 'accept': 'application/json', 'Accept-Language': 'hi_IN', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', }Ahora, si desea implementar en Heroku o Firebase, devolverá 403, creo que se debe principalmente a que están bloqueando cualquier IP fuera del servidor indio.
Enlace Github: https://github.com/manojkumar3692/reactjs_nodejs_cowin
Te mantendré informado aquí
Usar lo siguiente
var options = { url: URL, method: 'GET', headers: { Host: 'cdn-api.co-vin.in', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } };Agregué un encabezado user-agent a la solicitud para que la API reconozca que mi solicitud proviene de un navegador, en lugar de un script.
headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', } url = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByDistrict?district_id=303&date="+date response = requests.get(url, headers=headers)Debe usar la API de identificador de agente de usuario. Consulte esto https://devcenter.heroku.com/articles/useragentidentifier#using-with-python
Debe realizar su solicitud en el siguiente formato, adjunto un formato de muestra para la API de metadatos de estados:
curl --ubicación --solicitud OBTENER 'https://cdn-api.co-vin.in/api/v2/admin/ubicación/estados' --header 'Aceptar-Idioma: hi_IN' --header 'Aceptar: aplicación /json' --header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/90.0.4430.93 Safari/537.36'
Pruebe estos encabezados. Funcionaron para mí en el servidor local (no en producción)
let options = { headers: { "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36", }, };Estos no funcionarán en producción porque las API de Cowin están geovalladas y no se puede acceder a ellas desde direcciones IP que no sean indias. En la mayoría de los sitios de alojamiento gratuitos como Heroku, la IP india no es una opción. Entonces, la solución alternativa podría ser usar AWS, GCP, Azure con un servidor indio (aún no probado).
Referencia: https://github.com/cowinapi/developer.cowin/issues/228
No se trata de la solicitud de agente de usuario o formato. Enfrenté el mismo problema y pruebas adicionales demostraron que cloudFront está bloqueando la IP si varias solicitudes provienen de la misma IP consecutivamente. También se desbloquea después de un par de minutos. Básicamente, no quieren que estos alerten esto, probablemente esté sobrecargando su servidor.
Parece que la API no puede usarse fuera de la India. Intente combinar algún proxy indio/uso en el servidor indio