ubercrawler/src/index.js
2023-11-11 23:46:45 -08:00

116 lines
3.4 KiB
JavaScript

import puppeteer from "puppeteer-core"
import * as utils from "./utils.js"
import { processTrip } from "./processTrip.js"
import fs from "fs"
import { loginToUber } from "./navigateSite.js"
async function main() {
let options = JSON.parse(fs.readFileSync("./options.json", "utf8"))
const browser = await puppeteer.launch({
headless: false,
ignoreHTTPSErrors: true,
executablePath: "/usr/bin/chromium",
})
try {
const page = await browser.newPage()
await page.setRequestInterception(true)
let usefulRequestHeaders = {}
let testForHeaders = () => !!usefulRequestHeaders["content-type"]
page.on("request", (request) => {
let url = request.url()
if (url.includes("getWebActivityFeed")) {
usefulRequestHeaders = { ...request.headers() }
console.log("hello!", usefulRequestHeaders)
}
if (request.isInterceptResolutionHandled()) {
return
}
if (
url.endsWith(".png") ||
url.endsWith(".jpg") ||
url.endsWith(".ico")
) {
console.log("aborted: ", url)
request.abort()
} else {
console.log("requested", url)
request.continue()
}
})
page.on("response", async (response) => {
const request = response.request()
if (request.url().includes("getWebActivityFeed")) {
console.log(response)
}
})
await loginToUber(page, options, testForHeaders)
let uberJSON = []
let paginationOption = {}
while (true) {
let res = await fetch(
"https://drivers.uber.com/earnings/api/getWebActivityFeed?localeCode=en",
{
method: "POST",
body: JSON.stringify({
startDateIso: options.startDateIso ?? "2023-04-01",
endDateIso: options.endDateIso ?? "2023-04-31",
paginationOption,
}),
headers: usefulRequestHeaders,
},
)
let body = await res.json()
let trips = body?.data?.activities?.map(async (activity) => {
if (activity.formattedTotal == "$0.00") {
return ""
}
if (activity.type == "QUEST") {
// These are all duplicates of MISC items.
return ""
}
if (activity.type == "MISC" || activity.activityTitle == "Delivery") {
return {
uuid: activity.uuid,
recognizedAt: new Date(
(activity.recognizedAt ?? 1) * 1000,
).toISOString(),
pickupAddress: activity.tripMetaData?.pickupAddress,
dropOffAddress: activity.tripMetaData?.dropOffAddress,
total: Number(activity.formattedTotal),
type: activity.activityTitle,
}
}
if (activity.type == "TRIP" || activity.type == "CT") {
// Trip or Share
return await processTrip(activity, usefulRequestHeaders)
}
})
if (trips) {
let tripResults = await utils.settlePromises(trips)
uberJSON = [...uberJSON, ...tripResults]
} else {
let failedRequest = { failedRequest: res, body }
console.error(failedRequest)
uberJSON = [...uberJSON, failedRequest]
}
if (!body.data.pagination.hasMoreData) {
break
}
paginationOption.cursor = body.data.pagination.nextCursor
}
fs.writeFileSync("./uberResults.json", JSON.stringify(uberJSON))
} catch (err) {
console.error("Critical failure", err)
} finally {
await browser.close()
}
}
main()