Skip to content

Instantly share code, notes, and snippets.

@abhijithvijayan
Last active February 28, 2025 07:22
Show Gist options
  • Save abhijithvijayan/1507b5d9d484cf4b7180b14154cfddb1 to your computer and use it in GitHub Desktop.
Save abhijithvijayan/1507b5d9d484cf4b7180b14154cfddb1 to your computer and use it in GitHub Desktop.
Vaahan Fancy Scrapper
// Login to https://fancy.parivahan.gov.in/fancy/faces/public/login.xhtml and navigate to Number Selection tab, select RTO and run these on console
// Update START, END, RTO, STATE_CODE, COOKIE & SERVER_TOKEN
// get the Cookie & ViewState from Network request(or with Postman Interceptor)
// Find open status from here
// https://fancy.parivahan.gov.in/fancy/faces/public/seriesOpenStatus.xhtml
(async () => {
const START = 6198;
const END = 7196;
const RTO = 03;
const STATE_CODE = "KL";
const COOKIE = "SERVERID_fancy_24=vahan_xxxxxxx";
const SERVER_TOKEN = "xxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/x/xxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxx+xxx/xxxx+xxxxxxxxx+x/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+/xxxx/xxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxx+xxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxx+xxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxx+xxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xx/xxxxxxx/xxxxxxxx/xxxxxxxxx+xx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xx+xxxxxxxxxx+x+xxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxx+xxx/xxxx+xx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx/x/xxxxx/xxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx/xxxxxxxxxxxxx+xxxxxx/x+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxx/+xxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxx/xxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const myHeaders = new Headers();
myHeaders.append("sec-ch-ua-platform", "\"macOS\"");
myHeaders.append("sec-ch-ua", "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"");
myHeaders.append("sec-ch-ua-mobile", "?0");
myHeaders.append("Faces-Request", "partial/ajax");
myHeaders.append("X-Requested-With", "XMLHttpRequest");
myHeaders.append("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36");
myHeaders.append("Accept", "application/xml, text/xml, */*; q=0.01");
myHeaders.append("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
myHeaders.append("Sec-Fetch-Site", "same-origin");
myHeaders.append("Sec-Fetch-Mode", "cors");
myHeaders.append("Sec-Fetch-Dest", "empty");
myHeaders.append("host", "fancy.parivahan.gov.in");
myHeaders.append("Cookie", COOKIE);
function getNumber(result, number) {
const [availableNumber] = result.match(new RegExp(`${STATE_CODE}${RTO}[A-Z]{0,2}${number}`, "g")) || []
return availableNumber;
}
window.availableNumbers = [];
const reservedOrBooked = [...document.querySelectorAll("[id*=':regigtrationNumber']")];
reservedOrBooked.forEach((reserved) => {
const extractedNumber = getNumber(reserved.textContent, "[0-9]{4}");
if (extractedNumber) {
window.availableNumbers.push(extractedNumber)
}
})
for (let number = START; number <= END; number += 1) {
await new Promise((resolve) => {
setTimeout(resolve, 1000)
});
console.log({
msg: `checking ${number}`
})
const urlencoded = new URLSearchParams();
urlencoded.append("appname1", "");
urlencoded.append("btnCheckChoiceNumber1", "btnCheckChoiceNumber1");
urlencoded.append("dtAvailChoiceNumber_scrollState", "0,0");
urlencoded.append("ib_Veh_Seri_focus", "");
urlencoded.append("ib_Veh_Seri_input", "-1");
urlencoded.append("ib_home_rto_focus", "");
urlencoded.append("ib_home_rto_input", "-1");
urlencoded.append("ib_scrossflag_focus", "");
urlencoded.append("ib_scrossflag_input", "-1");
urlencoded.append("ib_statea1_focus", "");
urlencoded.append("ib_statea1_input", "-1");
urlencoded.append("ib_statea_focus", "");
urlencoded.append("ib_statea_input", `${RTO}`);
urlencoded.append("ib_stateb_focus", "");
urlencoded.append("ib_stateb_input", "-1");
urlencoded.append("ib_veh_catg_focus", "");
urlencoded.append("ib_veh_catg_input", "-1");
urlencoded.append("j_idt68", "");
urlencoded.append("javax.faces.ViewState", SERVER_TOKEN);
urlencoded.append("javax.faces.partial.ajax", "true");
urlencoded.append("javax.faces.partial.execute", "@all");
urlencoded.append("javax.faces.partial.render", "tblAvailChoiceNumber popup txtChoiceNumber txtChoiceNumber1");
urlencoded.append("javax.faces.source", "btnCheckChoiceNumber1");
urlencoded.append("master_Layout_form_Login", "master_Layout_form_Login");
urlencoded.append("selCubicCapacity_focus", "");
urlencoded.append("selCubicCapacity_input", "-1");
urlencoded.append("sel_fuel_type_focus", "");
urlencoded.append("sel_fuel_type_input", "-1");
urlencoded.append("tblAvailFancyNumber:2:selected_number", "on");
urlencoded.append("tblAvailFancyNumber:j_idt116:filter", "");
urlencoded.append("tblAvailFancyNumber_scrollState", "0,67.5");
urlencoded.append("txtChoiceNumber", "");
urlencoded.append("txtChoiceNumber1", `${number}`);
const requestOptions = {
method: "POST",
headers: myHeaders,
body: urlencoded,
redirect: "follow"
};
await fetch("https://fancy.parivahan.gov.in/fancy/faces/app/applicanthome.xhtml", requestOptions)
.then((response) => response.text())
.then((result) => {
const extractedNumber = getNumber(result, number);
if (extractedNumber && result.includes("dtAvailChoiceNumber:0:regigtrationNumber")) {
console.log({
msg: "found",
number
})
window.availableNumbers.push(extractedNumber)
}
})
.catch((error) => console.error(error));
}
window.availableNumbers.sort()
console.log({
availableNumbers: window.availableNumbers
})
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment