/** * 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}`; }