Files

550 lines
15 KiB
JavaScript

/**
* https://github.com/chatgptuk/Real-US-Address-Generator/blob/main/worker.js
* https://us.chatgpt.org.uk/
* pnpm create cloudflare@latest real-us-address-generator-api
* http://localhost:8787/
*/
// addEventListener('fetch', (event) => {
// event.respondWith(handleRequest(event.request));
// });
export default {
async fetch(request, _env, _ctx) {
return handleRequest(request);
},
};
async function handleRequest(request) {
const { searchParams } = new URL(request.url);
const state = searchParams.get('state') || getRandomState();
let phone, country, addressData;
const remoteProvinces = ['NL', 'NT', 'NU', 'YT']; // Remote Canadian Provinces/Territories
for (let i = 0; i < 20; i++) {
// Try up to 20 times to get a detailed address
const location = getRandomLocationInState(state);
const apiUrl = `https://nominatim.openstreetmap.org/reverse?format=json&lat=${location.lat}&lon=${location.lng}&zoom=18&addressdetails=1`;
const response = await fetch(apiUrl, {
headers: { 'User-Agent': 'Cloudflare Worker' },
});
const data = await response.json();
if (data && data.address) {
if (data.address.country_code === 'us') {
if (data.address.house_number && data.address.road && data.address.city) {
country = 'US';
addressData = data.address;
break;
}
} else if (data.address.country_code === 'ca') {
if (remoteProvinces.includes(state)) {
// For remote provinces, allow partial addresses
country = 'CA';
addressData = data.address;
break;
} else {
// For other provinces, require detailed address
if (data.address.house_number && data.address.road && data.address.city) {
country = 'CA';
addressData = data.address;
break;
}
}
}
}
}
if (!addressData) {
return new Response(
JSON.stringify({ error: 'Failed to retrieve detailed address' }),
{
status: 500,
headers: { 'content-type': 'application/json;charset=UTF-8' }
}
);
}
const userResp = await fetch('https://fakerapi.it/api/v1/persons?_quantity=1&_locale=en_US');
const userJson = await userResp.json();
let firstName, lastName;
if (userJson && userJson.data && userJson.data.length > 0) {
const user = userJson.data[0];
firstName = user.firstname;
lastName = user.lastname;
phone = getRandomPhoneNumber(country, state);
} else {
const randomName = getRandomName();
const nameParts = randomName.split(' ');
firstName = nameParts[0];
lastName = nameParts[1];
phone = getRandomPhoneNumber(country, state);
}
// Ensure we have the correct state abbreviation
const stateAbbreviations = {
// US States
Alabama: 'AL',
Alaska: 'AK',
Arizona: 'AZ',
Arkansas: 'AR',
California: 'CA',
Colorado: 'CO',
Connecticut: 'CT',
Delaware: 'DE',
Florida: 'FL',
Georgia: 'GA',
Hawaii: 'HI',
Idaho: 'ID',
Illinois: 'IL',
Indiana: 'IN',
Iowa: 'IA',
Kansas: 'KS',
Kentucky: 'KY',
Louisiana: 'LA',
Maine: 'ME',
Maryland: 'MD',
Massachusetts: 'MA',
Michigan: 'MI',
Minnesota: 'MN',
Mississippi: 'MS',
Missouri: 'MO',
Montana: 'MT',
Nebraska: 'NE',
Nevada: 'NV',
'New Hampshire': 'NH',
'New Jersey': 'NJ',
'New Mexico': 'NM',
'New York': 'NY',
'North Carolina': 'NC',
'North Dakota': 'ND',
Ohio: 'OH',
Oklahoma: 'OK',
Oregon: 'OR',
Pennsylvania: 'PA',
'Rhode Island': 'RI',
'South Carolina': 'SC',
'South Dakota': 'SD',
Tennessee: 'TN',
Texas: 'TX',
Utah: 'UT',
Vermont: 'VT',
Virginia: 'VA',
Washington: 'WA',
'West Virginia': 'WV',
Wisconsin: 'WI',
Wyoming: 'WY',
// Canadian Provinces and Territories
Alberta: 'AB',
'British Columbia': 'BC',
Manitoba: 'MB',
'New Brunswick': 'NB',
'Newfoundland and Labrador': 'NL',
'Nova Scotia': 'NS',
Ontario: 'ON',
'Prince Edward Island': 'PE',
Quebec: 'QC',
Saskatchewan: 'SK',
'Northwest Territories': 'NT',
Nunavut: 'NU',
Yukon: 'YT',
};
// Get the correct state abbreviation - use addressData.state if available, otherwise use the original state parameter
const stateAbbr = stateAbbreviations[addressData.state] || state;
const jsonResponse = {
firstName: firstName,
lastName: lastName,
streetAddress: `${addressData.house_number || ''} ${addressData.road || ''}`.trim(),
aptSuiteBldg: '', // Could be enhanced if needed
city: addressData.city || addressData.town || addressData.village || '',
state: stateAbbr,
zipCode: addressData.postcode || '',
phoneNumber: phone
};
return new Response(JSON.stringify(jsonResponse, null, 2), {
headers: { 'content-type': 'application/json;charset=UTF-8' },
});
}
function getRandomLocationInState(state) {
const stateCoordinates = {
// US States
AL: [
{ lat: 32.377716, lng: -86.300568 },
{ lat: 33.520661, lng: -86.80249 },
],
AK: [
{ lat: 61.216583, lng: -149.899597 },
{ lat: 58.301598, lng: -134.419998 },
],
AZ: [
{ lat: 33.448376, lng: -112.074036 },
{ lat: 34.048927, lng: -111.093735 },
],
AR: [
{ lat: 34.746483, lng: -92.289597 },
{ lat: 36.082157, lng: -94.171852 },
],
CA: [
{ lat: 36.778259, lng: -119.417931 },
{ lat: 34.052235, lng: -118.243683 },
],
CO: [
{ lat: 39.739235, lng: -104.99025 },
{ lat: 38.833881, lng: -104.821365 },
],
CT: [
{ lat: 41.76371, lng: -72.685097 },
{ lat: 41.308273, lng: -72.927887 },
],
DE: [
{ lat: 39.739072, lng: -75.539787 },
{ lat: 38.774055, lng: -75.139351 },
],
FL: [
{ lat: 30.332184, lng: -81.655647 },
{ lat: 25.761681, lng: -80.191788 },
],
GA: [
{ lat: 33.749001, lng: -84.387985 },
{ lat: 32.083541, lng: -81.099831 },
],
HI: [
{ lat: 21.306944, lng: -157.858337 },
{ lat: 19.896767, lng: -155.582779 },
],
ID: [
{ lat: 43.615021, lng: -116.202316 },
{ lat: 47.677683, lng: -116.780466 },
],
IL: [
{ lat: 41.878113, lng: -87.629799 },
{ lat: 40.633125, lng: -89.398529 },
],
IN: [
{ lat: 39.768402, lng: -86.158066 },
{ lat: 41.593369, lng: -87.346427 },
],
IA: [
{ lat: 41.586834, lng: -93.625 },
{ lat: 42.5, lng: -94.166672 },
],
KS: [
{ lat: 39.099728, lng: -94.578568 },
{ lat: 37.687176, lng: -97.330055 },
],
KY: [
{ lat: 38.252666, lng: -85.758453 },
{ lat: 37.839333, lng: -84.27002 },
],
LA: [
{ lat: 30.695366, lng: -91.187393 },
{ lat: 29.951065, lng: -90.071533 },
],
ME: [
{ lat: 44.310623, lng: -69.77949 },
{ lat: 43.661471, lng: -70.255325 },
],
MD: [
{ lat: 38.978447, lng: -76.49218 },
{ lat: 39.290386, lng: -76.61219 },
],
MA: [
{ lat: 42.360081, lng: -71.058884 },
{ lat: 42.313373, lng: -71.057083 },
],
MI: [
{ lat: 42.732536, lng: -84.555534 },
{ lat: 42.331429, lng: -83.045753 },
],
MN: [
{ lat: 44.953703, lng: -93.089958 },
{ lat: 44.977753, lng: -93.265015 },
],
MS: [
{ lat: 32.298756, lng: -90.184807 },
{ lat: 32.366806, lng: -88.703705 },
],
MO: [
{ lat: 38.576702, lng: -92.173516 },
{ lat: 38.627003, lng: -90.199402 },
],
MT: [
{ lat: 46.878717, lng: -113.996586 },
{ lat: 45.783287, lng: -108.50069 },
],
NE: [
{ lat: 41.256538, lng: -95.934502 },
{ lat: 40.813618, lng: -96.702595 },
],
NV: [
{ lat: 39.163914, lng: -119.767403 },
{ lat: 36.114647, lng: -115.172813 },
],
NH: [
{ lat: 43.208137, lng: -71.538063 },
{ lat: 42.99564, lng: -71.454789 },
],
NJ: [
{ lat: 40.058323, lng: -74.405663 },
{ lat: 39.364285, lng: -74.422928 },
],
NM: [
{ lat: 35.084385, lng: -106.650421 },
{ lat: 32.319939, lng: -106.763653 },
],
NY: [
{ lat: 40.712776, lng: -74.005974 },
{ lat: 43.299427, lng: -74.217933 },
],
NC: [
{ lat: 35.779591, lng: -78.638176 },
{ lat: 35.227085, lng: -80.843124 },
],
ND: [
{ lat: 46.825905, lng: -100.778275 },
{ lat: 46.877186, lng: -96.789803 },
],
OH: [
{ lat: 39.961178, lng: -82.998795 },
{ lat: 41.499321, lng: -81.694359 },
],
OK: [
{ lat: 35.46756, lng: -97.516426 },
{ lat: 36.15398, lng: -95.992775 },
],
OR: [
{ lat: 44.046236, lng: -123.022029 },
{ lat: 45.505917, lng: -122.675049 },
],
PA: [
{ lat: 40.273191, lng: -76.886701 },
{ lat: 39.952583, lng: -75.165222 },
],
RI: [
{ lat: 41.824009, lng: -71.412834 },
{ lat: 41.580095, lng: -71.477429 },
],
SC: [
{ lat: 34.00071, lng: -81.034814 },
{ lat: 32.776474, lng: -79.931051 },
],
SD: [
{ lat: 44.366787, lng: -100.35376 },
{ lat: 43.544595, lng: -96.731103 },
],
TN: [
{ lat: 36.162663, lng: -86.781601 },
{ lat: 35.149532, lng: -90.048981 },
],
TX: [
{ lat: 30.267153, lng: -97.743057 },
{ lat: 29.760427, lng: -95.369804 },
],
UT: [
{ lat: 40.76078, lng: -111.891045 },
{ lat: 37.774929, lng: -111.920414 },
],
VT: [
{ lat: 44.260059, lng: -72.575386 },
{ lat: 44.475883, lng: -73.212074 },
],
VA: [
{ lat: 37.540726, lng: -77.43605 },
{ lat: 36.852924, lng: -75.977982 },
],
WA: [
{ lat: 47.606209, lng: -122.332069 },
{ lat: 47.252876, lng: -122.44429 },
],
WV: [
{ lat: 38.34982, lng: -81.632622 },
{ lat: 39.629527, lng: -79.955896 },
],
WI: [
{ lat: 43.073051, lng: -89.40123 },
{ lat: 43.038902, lng: -87.906471 },
],
WY: [
{ lat: 41.140259, lng: -104.820236 },
{ lat: 44.276569, lng: -105.507391 },
],
// Canadian Provinces and Territories
AB: [
{ lat: 51.044733, lng: -114.071883 },
{ lat: 53.546124, lng: -113.493823 },
],
BC: [
{ lat: 49.282729, lng: -123.120738 },
{ lat: 48.428421, lng: -123.365644 },
],
MB: [
{ lat: 49.895137, lng: -97.138374 },
{ lat: 50.445211, lng: -96.823611 },
],
NB: [
{ lat: 45.963589, lng: -66.643115 },
{ lat: 46.510712, lng: -67.255044 },
],
NL: [
{ lat: 53.135509, lng: -57.660435 },
{ lat: 50.445211, lng: -57.1 },
],
NS: [
{ lat: 44.648862, lng: -63.57532 },
{ lat: 45.010474, lng: -63.416817 },
],
ON: [
{ lat: 51.253775, lng: -85.323214 },
{ lat: 43.653225, lng: -79.383186 },
],
PE: [
{ lat: 46.23824, lng: -63.131074 },
{ lat: 46.492424, lng: -63.793013 },
],
QC: [
{ lat: 46.813878, lng: -71.20798 },
{ lat: 45.501689, lng: -73.567256 },
],
SK: [
{ lat: 52.939915, lng: -106.450863 },
{ lat: 50.445211, lng: -104.618896 },
],
NT: [
{ lat: 64.825544, lng: -115.82534 },
{ lat: 61.251955, lng: -114.352482 },
],
NU: [
{ lat: 64.282327, lng: -76.614813 },
{ lat: 70.299598, lng: -83.107562 },
],
YT: [
{ lat: 64.282327, lng: -135.0 },
{ lat: 64.0, lng: -138.0 },
],
};
const coordsArray = stateCoordinates[state];
if (!coordsArray) {
// Fallback to a default location if state/province not found
return { lat: 39.8283, lng: -98.5795 }; // Geographic center of the contiguous US
}
const randomCity = coordsArray[Math.floor(Math.random() * coordsArray.length)];
const lat = randomCity.lat + (Math.random() - 0.5) * 0.1; // Smaller random offset
const lng = randomCity.lng + (Math.random() - 0.5) * 0.1;
return { lat, lng };
}
function getRandomPhoneNumber(country, state) {
const areaCodesUS = {
AL: ['205', '251', '256', '334', '938'],
AK: ['907'],
AZ: ['480', '520', '602', '623', '928'],
AR: ['479', '501', '870'],
CA: [ '209', '213', '310', '323', '408', '415', '424', '510', '530', '559', '562', '619', '626', '650', '661', '707', '714', '760', '805', '818', '831', '858', '909', '916', '925', '949', ],
CO: ['303', '719', '720', '970'],
CT: ['203', '475', '860', '959'],
DE: ['302'],
FL: ['239', '305', '321', '352', '386', '407', '561', '727', '754', '772', '786', '813', '850', '863', '904', '941', '954'],
GA: ['229', '404', '470', '478', '678', '706', '762', '770', '912'],
HI: ['808'],
ID: ['208', '986'],
IL: ['217', '224', '309', '312', '331', '618', '630', '708', '773', '779', '815', '847', '872'],
IN: ['219', '260', '317', '463', '574', '765', '812', '930'],
IA: ['319', '515', '563', '641', '712'],
KS: ['316', '620', '785', '913'],
KY: ['270', '364', '502', '606', '859'],
LA: ['225', '318', '337', '504', '985'],
ME: ['207'],
MD: ['240', '301', '410', '443', '667'],
MA: ['339', '351', '413', '508', '617', '774', '781', '857', '978'],
MI: ['231', '248', '269', '313', '517', '586', '616', '734', '810', '906', '947', '989'],
MN: ['218', '320', '507', '612', '651', '763', '952'],
MS: ['228', '601', '662', '769'],
MO: ['314', '417', '573', '636', '660', '816', '975'],
MT: ['406'],
NE: ['308', '402', '531'],
NV: ['702', '725', '775'],
NH: ['603'],
NJ: ['201', '551', '609', '732', '848', '856', '862', '908', '973'],
NM: ['505', '575'],
NY: [ '212', '315', '332', '347', '516', '518', '585', '607', '631', '646', '680', '716', '718', '838', '845', '914', '917', '929', '934', ],
NC: ['252', '336', '704', '743', '828', '910', '919', '980', '984'],
ND: ['701'],
OH: ['216', '234', '283', '330', '380', '419', '440', '513', '567', '614', '740', '937'],
OK: ['405', '539', '580', '918'],
OR: ['458', '503', '541', '971'],
PA: ['215', '267', '272', '412', '484', '570', '610', '717', '724', '814', '835', '878'],
RI: ['401'],
SC: ['803', '839', '843', '854', '864'],
SD: ['605'],
TN: ['423', '615', '629', '731', '865', '901', '931'],
TX: [ '210', '214', '254', '281', '325', '346', '409', '430', '432', '469', '512', '682', '713', '737', '806', '817', '830', '832', '903', '915', '936', '940', '956', '972', '979', ],
UT: ['385', '435', '801'],
VT: ['802'],
VA: ['276', '434', '540', '571', '703', '757', '804'],
WA: ['206', '253', '360', '425', '509'],
WV: ['304', '681'],
WI: ['262', '414', '534', '608', '715', '920'],
WY: ['307'],
};
const areaCodesCanada = {
AB: ['403', '587', '825'],
BC: ['236', '250', '604', '672', '778'],
MB: ['204', '431'],
NB: ['506'],
NL: ['709'],
NS: ['782', '902'],
ON: ['226', '249', '289', '343', '365', '416', '437', '519', '548', '613', '639', '647', '705', '807', '905'],
PE: ['902'],
QC: ['418', '438', '450', '514', '579', '581', '819', '873'],
SK: ['306', '639'],
NT: ['867'],
NU: ['867'],
YT: ['867'],
};
let areaCodeList = [];
if (country === 'US') {
areaCodeList = areaCodesUS[state] || ['000'];
} else if (country === 'CA') {
areaCodeList = areaCodesCanada[state] || ['000'];
}
const areaCode = areaCodeList[Math.floor(Math.random() * areaCodeList.length)];
const exchangeCode = Math.floor(200 + Math.random() * 700)
.toString()
.padStart(3, '0');
const lineNumber = Math.floor(1000 + Math.random() * 9000)
.toString()
.padStart(4, '0');
return `(${areaCode}) ${exchangeCode}-${lineNumber}`;
}
function getRandomState() {
const states = [
// US States
"AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA",
"HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA",
"ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV",
"NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK",
"OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT",
"VT", "VA", "WA", "WV", "WI", "WY",
// Canadian Provinces and Territories
"AB", "BC", "MB", "NB", "NL", "NS", "ON", "PE", "QC", "SK",
"NT", "NU", "YT"
]
return states[Math.floor(Math.random() * states.length)];
}
function getRandomName() {
const firstNames = ['John', 'Jane', 'Alex', 'Emily', 'Chris', 'Katie', 'Mike', 'Laura', 'David', 'Sarah'];
const lastNames = ['Smith', 'Johnson', 'Brown', 'Williams', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez'];
const firstName = firstNames[Math.floor(Math.random() * firstNames.length)];
const lastName = lastNames[Math.floor(Math.random() * lastNames.length)];
return `${firstName} ${lastName}`;
}