生成多个国家真实地址的chatgpt美化版

原帖地址
https://linux.do/t/topic/208185
ChatGPT美化版


预览地址
https://worker-address.sanritian.workers.dev/
新:https://sf.hupan.nyc.mn/
代码

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const { searchParams } = new URL(request.url)
  const country = searchParams.get('country') || getRandomCountry()
  let address, name, gender, phone

  for (let i = 0; i < 100; i++) {
    const location = getRandomLocationInCountry(country)
    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 && data.address.house_number && data.address.road && (data.address.city || data.address.town)) {
      address = formatAddress(data.address, country)
      break
    }
  }

  if (!address) {
    return new Response('Failed to retrieve detailed address, please refresh the interface (检索详细地址失败,请刷新界面)', { status: 500 })
  }

  const userData = await fetch('https://randomuser.me/api/')
  const userJson = await userData.json()
  if (userJson && userJson.results && userJson.results.length > 0) {
    const user = userJson.results[0]
    name = `${user.name.first} ${user.name.last}`
    gender = user.gender.charAt(0).toUpperCase() + user.gender.slice(1)
    phone = getRandomPhoneNumber(country)
  } else {
    name = getRandomName()
    gender = "Unknown"
    phone = getRandomPhoneNumber(country)
  }

const html = `
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>身份生成器</title>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Roboto', sans-serif;
            background-color: #121212; /* Dark background */
            color: #e0e0e0; /* Light text */
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        header {
            background-color: #1e1e1e;
            width: 100%;
            padding: 10px;
            text-align: center;
            border-bottom: 1px solid #444;
        }

        .logo {
            width: 120px; /* Adjust based on your logo size */
            margin-bottom:0px;
        }

        h1 {
            font-size: 2.5rem;
            margin: 0;
            color: #ffffff;
        }

        .subtitle {
            color: #b0bec5;
            font-size: 1.2rem;
        }

        .container {
            background-color: #1e1e1e;
            border-radius: 16px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
            padding: 30px;
            width: 100%; /* Full width */
            max-width: 1200px; /* Optional max width for larger screens */
            margin: 20px 0; /* Vertical margin */
            padding-bottom: 50px; /* Padding for better spacing */
        }

        .copied {
            display: none;
            color: #76ff03; /* Light green */
            text-align: center;
            margin-bottom: 15px;
            font-weight: bold;
        }

        .info {
            margin-bottom: 20px;
        }

        .item {
            padding: 15px;
            border-radius: 8px;
            margin: 10px 0;
            background-color: #292929; /* Item background */
            cursor: pointer;
            transition: background-color 0.3s, box-shadow 0.3s;
        }

        .item:hover {
            background-color: #424242; /* Hover effect */
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
        }

        .buttons {
            display: flex;
            justify-content: space-between;
            margin: 20px 0;
        }

        .btn {
            padding: 12px 20px;
            border: none;
            border-radius: 8px;
            color: white;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.2s;
            flex: 1;
            margin: 0 5px;
            font-weight: 700;
        }

        .refresh {
            background-color: #6200ea; /* Google Purple */
        }

        .refresh:hover {
            background-color: #3700b3;
            transform: translateY(-2px);
        }

        .save {
            background-color: #03dac5; /* Google Teal */
        }

        .save:hover {
            background-color: #018786;
            transform: translateY(-2px);
        }

        .country-select {
            margin-bottom: 20px;
        }

        .country-select label {
            margin-right: 10px;
            font-weight: bold;
            color: #ffffff;
        }

        .map {
            width: 100%;
            height: 300px;
            border: none;
            border-radius: 12px;
            margin-top: 20px;
        }

        .saved-addresses {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }

        .saved-addresses th, .saved-addresses td {
            border: 1px solid #444;
            padding: 12px;
            text-align: left;
        }

        .saved-addresses th {
            background-color: #6200ea; /* Google Purple */
            color: white;
        }

        .saved-addresses tr:nth-child(even) {
            background-color: #292929;
        }

        .saved-addresses tr:hover {
            background-color: #424242;
        }

        .github-icon {
            width: 20px;
            height: 20px;
            vertical-align: middle;
        }

        footer {
            text-align: center;
            margin-top: 30px;
            color: #b0bec5;
            font-size: 14px;
            width: 100%;
        }
    </style>
</head>
<body>
    <header>
        <img src="https://img.picui.cn/free/2024/09/20/66ed706b83f6b.png" alt="Logo" class="logo"> <!-- Replace with your logo URL -->
    </header>

    <main class="container">
        <div class="copied" id="copied">已复制!</div>

        <div class="info">
            <div class="item" onclick="copyToClipboard('${name}')"><strong>姓名:</strong>${name}</div>
            <div class="item" onclick="copyToClipboard('${gender}')"><strong>性别:</strong>${gender}</div>
            <div class="item" onclick="copyToClipboard('${phone.replace(/[()\s-]/g, '')}')"><strong>电话:</strong>${phone}</div>
            <div class="item" onclick="copyToClipboard('${address}')"><strong>地址:</strong>${address}</div>
        </div>

        <div class="buttons">
            <button class="btn refresh" onclick="window.location.reload();">获取新地址</button>
            <button class="btn save" onclick="saveAddress();">保存地址</button>
        </div>

        <div class="country-select">
            <label for="country">选择国家:</label>
            <select id="country" onchange="changeCountry(this.value)">
                ${getCountryOptions(country)}
            </select>
        </div>

        <iframe class="map" src="https://www.google.com/maps?q=${encodeURIComponent(address)}&output=embed"></iframe>

        <table class="saved-addresses" id="savedAddressesTable">
            <thead>
                <tr>
                    <th>操作</th>
                    <th>备注</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>电话号码</th>
                    <th>地址</th>
                </tr>
            </thead>
            <tbody>
                <!-- 动态生成的内容 -->
            </tbody>
        </table>
    </main>

    <footer>
        <p>Original version by chatgpt.org.uk, modified by Adonis142857 | 
            <a href="https://github.com/Adonis142857/Real-Address-Generator" target="_blank">
                <img src="https://pic.imgdb.cn/item/66e7ab36d9c307b7e9cefd24.png" alt="GitHub" class="github-icon">
            </a>
        </p>
    </footer>

    <script>
        function copyToClipboard(text) {
            navigator.clipboard.writeText(text).then(() => {
                const copied = document.getElementById('copied');
                copied.style.display = 'block';
                setTimeout(() => {
                    copied.style.display = 'none';
                }, 2000);
            });
        }
        function changeCountry(country) {
            window.location.href = \`?country=\${country}\`;
        }
        function saveAddress() {
            const note = prompt('请输入备注(可以留空)') || '';
            const savedAddresses = JSON.parse(localStorage.getItem('savedAddresses') || '[]');
            const newEntry = {
                note: note,
                name: '${name}',
                gender: '${gender}',
                phone: '${phone.replace(/[()\\s-]/g, '')}',
                address: '${address}'
            };
            savedAddresses.push(newEntry);
            localStorage.setItem('savedAddresses', JSON.stringify(savedAddresses));
            renderSavedAddresses();
        }

        // 渲染保存的地址
        function renderSavedAddresses() {
            const savedAddresses = JSON.parse(localStorage.getItem('savedAddresses') || '[]');
            const tbody = document.getElementById('savedAddressesTable').getElementsByTagName('tbody')[0];
            tbody.innerHTML = '';
            savedAddresses.forEach((entry, index) => {
                const row = tbody.insertRow();
                const deleteCell = row.insertCell();
                const noteCell = row.insertCell();
                const nameCell = row.insertCell();
                const genderCell = row.insertCell();
                const phoneCell = row.insertCell();
                const addressCell = row.insertCell();

                // 删除按钮
                const deleteBtn = document.createElement('button');
                deleteBtn.textContent = '删除';
                deleteBtn.className = 'delete-btn';
                deleteBtn.onclick = () => {
                    savedAddresses.splice(index, 1);
                    localStorage.setItem('savedAddresses', JSON.stringify(savedAddresses));
                    renderSavedAddresses();
                };
                deleteCell.appendChild(deleteBtn);

                noteCell.textContent = entry.note;
                nameCell.textContent = entry.name;
                genderCell.textContent = entry.gender;
                phoneCell.textContent = entry.phone;
                addressCell.textContent = entry.address;
            });
        }

        // 页面加载时渲染已保存的地址
        window.onload = function() {
            renderSavedAddresses();
        };
    </script>
</body>
</html>


`



  return new Response(html, {
    headers: { 'content-type': 'text/html;charset=UTF-8' },
  })
}

function getRandomLocationInCountry(country) {
  const countryCoordinates = {
    "US": [{ lat: 37.7749, lng: -122.4194 }, { lat: 34.0522, lng: -118.2437 }],
    "UK": [{ lat: 51.5074, lng: -0.1278 }, { lat: 53.4808, lng: -2.2426 }],
    "FR": [{ lat: 48.8566, lng: 2.3522 }, { lat: 45.7640, lng: 4.8357 }],
    "DE": [{ lat: 52.5200, lng: 13.4050 }, { lat: 48.1351, lng: 11.5820 }],
    "CN": [{ lat: 39.9042, lng: 116.4074 }, { lat: 31.2304, lng: 121.4737 }],
    "TW": [{ lat: 25.0330, lng: 121.5654 }, { lat: 22.6273, lng: 120.3014 }],
    "HK": [{ lat: 22.3193, lng: 114.1694 },{ lat: 22.3964, lng: 114.1095 }],
    "JP": [{ lat: 35.6895, lng: 139.6917 }, { lat: 34.6937, lng: 135.5023 }],
    "IN": [{ lat: 28.6139, lng: 77.2090 }, { lat: 19.0760, lng: 72.8777 }],
    "AU": [{ lat: -33.8688, lng: 151.2093 }, { lat: -37.8136, lng: 144.9631 }], 
    "BR": [{ lat: -23.5505, lng: -46.6333 }, { lat: -22.9068, lng: -43.1729 }], 
    "CA": [{ lat: 43.651070, lng: -79.347015 }, { lat: 45.501690, lng: -73.567253 }], 
    "RU": [{ lat: 55.7558, lng: 37.6173 }, { lat: 59.9343, lng: 30.3351 }], 
    "ZA": [{ lat: -33.9249, lng: 18.4241 }, { lat: -26.2041, lng: 28.0473 }], 
    "MX": [{ lat: 19.4326, lng: -99.1332 }, { lat: 20.6597, lng: -103.3496 }], 
    "KR": [{ lat: 37.5665, lng: 126.9780 }, { lat: 35.1796, lng: 129.0756 }], 
    "IT": [{ lat: 41.9028, lng: 12.4964 }, { lat: 45.4642, lng: 9.1900 }], 
    "ES": [{ lat: 40.4168, lng: -3.7038 }, { lat: 41.3851, lng: 2.1734 }], 
    "TR": [{ lat: 41.0082, lng: 28.9784 }, { lat: 39.9334, lng: 32.8597 }], 
    "SA": [{ lat: 24.7136, lng: 46.6753 }, { lat: 21.3891, lng: 39.8579 }], 
    "AR": [{ lat: -34.6037, lng: -58.3816 }, { lat: -31.4201, lng: -64.1888 }], 
    "EG": [{ lat: 30.0444, lng: 31.2357 }, { lat: 31.2156, lng: 29.9553 }], 
    "NG": [{ lat: 6.5244, lng: 3.3792 }, { lat: 9.0579, lng: 7.4951 }], 
    "ID": [{ lat: -6.2088, lng: 106.8456 }, { lat: -7.7956, lng: 110.3695 }] 
  }
  const coordsArray = countryCoordinates[country]
  const randomCity = coordsArray[Math.floor(Math.random() * coordsArray.length)]
  const lat = randomCity.lat + (Math.random() - 0.5) * 0.1
  const lng = randomCity.lng + (Math.random() - 0.5) * 0.1
  return { lat, lng }
}

function formatAddress(address, country) {
  return `${address.house_number} ${address.road}, ${address.city || address.town || address.village}, ${address.postcode || ''}, ${country}`;
}


function getRandomPhoneNumber(country) {
  const phoneFormats = {
    "US": () => {
      const areaCode = Math.floor(200 + Math.random() * 800).toString().padStart(3, '0')
      const exchangeCode = Math.floor(200 + Math.random() * 800).toString().padStart(3, '0')
      const lineNumber = Math.floor(1000 + Math.random() * 9000).toString().padStart(4, '0')
      return `+1 (${areaCode}) ${exchangeCode}-${lineNumber}`
    },
    "UK": () => {
      const areaCode = Math.floor(1000 + Math.random() * 9000).toString()
      const lineNumber = Math.floor(100000 + Math.random() * 900000).toString()
      return `+44 ${areaCode} ${lineNumber}`
    },
    "FR": () => {
      const digit = Math.floor(1 + Math.random() * 8)
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+33 ${digit} ${number}`
    },
    "DE": () => {
      const areaCode = Math.floor(100 + Math.random() * 900).toString()
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+49 ${areaCode} ${number}`
    },
    "CN": () => {
      const prefix = Math.floor(130 + Math.random() * 60).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+86 ${prefix} ${number}`
    },
    "TW": () => {
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('');
      return `+886 9${number}`;
    },
    "HK": () => {
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('');
      return `+852 ${number}`;
    },
    "JP": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+81 ${areaCode} ${number}`
    },
    "IN": () => {
      const prefix = Math.floor(700 + Math.random() * 100).toString()
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+91 ${prefix} ${number}`
    },
    "AU": () => {
      const areaCode = Math.floor(2 + Math.random() * 8).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+61 ${areaCode} ${number}`
    },
    "BR": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+55 ${areaCode} ${number}`
    },
    "CA": () => {
      const areaCode = Math.floor(200 + Math.random() * 800).toString().padStart(3, '0')
      const exchangeCode = Math.floor(200 + Math.random() * 800).toString().padStart(3, '0')
      const lineNumber = Math.floor(1000 + Math.random() * 9000).toString().padStart(4, '0')
      return `+1 (${areaCode}) ${exchangeCode}-${lineNumber}`
    },
    "RU": () => {
      const areaCode = Math.floor(100 + Math.random() * 900).toString()
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+7 ${areaCode} ${number}`
    },
    "ZA": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+27 ${areaCode} ${number}`
    },
    "MX": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+52 ${areaCode} ${number}`
    },
    "KR": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+82 ${areaCode} ${number}`
    },
    "IT": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+39 ${areaCode} ${number}`
    },
    "ES": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+34 ${areaCode} ${number}`
    },
    "TR": () => {
      const areaCode = Math.floor(200 + Math.random() * 800).toString().padStart(3, '0')
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+90 ${areaCode} ${number}`
    },
    "SA": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 7 }, () => Math.floor(Math.random() * 10)).join('')
      return `+966 ${areaCode} ${number}`
    },
    "AR": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+54 ${areaCode} ${number}`
    },
    "EG": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+20 ${areaCode} ${number}`
    },
    "NG": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+234 ${areaCode} ${number}`
    },
    "ID": () => {
      const areaCode = Math.floor(10 + Math.random() * 90).toString()
      const number = Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)).join('')
      return `+62 ${areaCode} ${number}`
    }
  }
  return phoneFormats[country]()
}

function getRandomCountry() {
  const countries = ["US", "UK", "FR", "DE", "CN", "TW", "HK", "JP", "IN", "AU", "BR", "CA", "RU", "ZA", "MX", "KR", "IT", "ES", "TR", "SA", "AR", "EG", "NG", "ID"]
  return countries[Math.floor(Math.random() * countries.length)]
}

function getCountryOptions(selectedCountry) {
  const countries = [
    { name: "美国", code: "US" },
    { name: "英国", code: "UK" },
    { name: "法国", code: "FR" },
    { name: "德国", code: "DE" },
    { name: "中国", code: "CN" },
    { name: "中国台湾", code: "TW" },
    { name: "中国香港", code: "HK" }, 
    { name: "日本", code: "JP" },
    { name: "印度", code: "IN" },
    { name: "澳大利亚", code: "AU" },
    { name: "巴西", code: "BR" },
    { name: "加拿大", code: "CA" },
    { name: "俄罗斯", code: "RU" },
    { name: "南非", code: "ZA" },
    { name: "墨西哥", code: "MX" },
    { name: "韩国", code: "KR" },
    { name: "意大利", code: "IT" },
    { name: "西班牙", code: "ES" },
    { name: "土耳其", code: "TR" },
    { name: "沙特阿拉伯", code: "SA" },
    { name: "阿根廷", code: "AR" },
    { name: "埃及", code: "EG" },
    { name: "尼日利亚", code: "NG" },
    { name: "印度尼西亚", code: "ID" }
  ]
  return countries.map(({ name, code }) => `<option value="${code}" ${code === selectedCountry ? 'selected' : ''}>${name}</option>`).join('')
}
55 个赞

资源荟萃, Lv1资源荟萃

image
下面这一条有东西吗

2 个赞

这是多地址的表格,点击上面的并保存地址就会显示到下面

3 个赞

不错!zsbd

1 个赞

厉害,没有搞接口调用可惜

接口就在代码里

1 个赞

这个保存确实可以

好的,我找找,我前端我一窍不通看不懂代码

感谢分享,mark

1 个赞

感谢大佬分享的代码

感谢大佬分享

感谢大佬分享

保存的地址能在下面保存多久?

佬,厉害啊,感谢分享

看着挺好的,感谢

佬 有个问题,你选择图片的地址,不会改变地址栏的地址。

似乎有个问题,选择国家不生效

选了国家 还是随机国家

worker地址好像都被墙了 可以弄个自定义域名