当前位置: 首页 > 知识库问答 >
问题:

任意国家的随机电话号码生成器

谷梁凌
2023-03-14

我正试图从一系列国家的电话号码中创建合成数据。

我发现谷歌的libphonenumberJava库有Python、C等端口。一个很好的资源。

使用此库是否可以从国家/地区列表中生成有效的随机电话号码?

在我写的这段代码中,我使用了他们的getCERpleNumber函数,但每次都生成相同的数字:

import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.NumberParseException;

public class Driver {
    public static void main(String[] args) {
       // Prints "Hello, World" in the terminal window.
       for (int i=0;i<10;i++)
       {
          System.out.println(Generator());
       }
    }


    public static PhoneNumber  Generator() 
    {
       String regionCode = new String("GB");
       PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
       PhoneNumber exampleNumber =phoneNumberUtil.getExampleNumber(regionCode);
       return exampleNumber;
    }

}

共有2个答案

倪德业
2023-03-14

这个库不会为您提供随机数,无论您运行代码多少次,您总是会得到:

Country Code: 44 National Number: 1212345678

您可以查看他们的github项目:

https://github.com/googlei18n/libphonenumber/

您将在此文件夹中看到许多原始文件:

https://github.com/googlei18n/libphonenumber/tree/master/java/libphonenumber/src/com/google/i18n/phonenumbers/data

他们从那些文件中得到那个号码,所以它是硬编码的。没有办法随机获得。

云欣嘉
2023-03-14

最好的方法是使用库中的正则表达式,但这需要大量的工作。

由于getExampleNumber函数将返回完全相同的值,因此您始终可以使用它来随机化(或迭代)其中的数字。

下面是如何做到这一点的示例(示例),获取每个支持区域的10个随机移动电话号码:

class MainActivity : AppCompatActivity() {
    @WorkerThread
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val phoneNumbersToRandomize = 10
        var regionsThatFoundMobilePhonesFor = 0
        if (savedInstanceState == null)
            thread {
                val phoneNumberUtil = PhoneNumberUtil.getInstance()
                val startTime = System.currentTimeMillis()
                val supportedRegions = phoneNumberUtil.supportedRegions
                for (region in supportedRegions) {
                    val validPhoneNumbers = HashSet<String>()
                    val exampleNumber = phoneNumberUtil.getExampleNumberForType(region, PhoneNumberUtil.PhoneNumberType.MOBILE)
                    if (exampleNumber == null) {
                        Log.w("AppLog", "region:$region no exampleNumber")
                        continue
                    }
                    Log.d("AppLog", "region:$region exampleNumber:${phoneNumberUtil.format(exampleNumber, PhoneNumberUtil.PhoneNumberFormat.E164)}")
                    val countryCode = phoneNumberUtil.getCountryCodeForRegion(region)
                    val nationalSignificantNumber = phoneNumberUtil.getNationalSignificantNumber(exampleNumber)
                    //                    Log.d("AppLog", "finding $phoneNumbersToRandomize random mobile phone numbers for $region example phone number:" +
                    //                            phoneNumberUtil.format(exampleNumber, PhoneNumberUtil.PhoneNumberFormat.E164) + " countryCode:$countryCode nationalSignificantNumber:$nationalSignificantNumber ")
                    val randomDigitsLength = nationalSignificantNumber.length
                    while (validPhoneNumbers.size < phoneNumbersToRandomize) {
                        val inputPhone = "+$countryCode${getRandomStringOfDigits(randomDigitsLength)}"
                        if (validPhoneNumbers.contains(inputPhone))
                            continue
                        val phoneNumber = phoneNumberUtil.parse(inputPhone, region)
                        val nationalSignificantNumberFromGeneratedNumber = phoneNumberUtil.getNationalSignificantNumber(phoneNumber)
                        if (nationalSignificantNumberFromGeneratedNumber.length != randomDigitsLength)
                            continue
                        val isValidMobilePhoneNumber = phoneNumberUtil.isValidNumberForRegion(phoneNumber, region)
                                && phoneNumberUtil.isPossibleNumberForType(phoneNumber, PhoneNumberUtil.PhoneNumberType.MOBILE)
                        if (isValidMobilePhoneNumber) {
                            validPhoneNumbers.add(inputPhone)
                        }
                    }
                    ++regionsThatFoundMobilePhonesFor
                }
                Log.d("AppLog", "done regionsThatFoundMobilePhonesFor:$regionsThatFoundMobilePhonesFor out of ${supportedRegions.size}" +
                        "timeTaken:${System.currentTimeMillis() - startTime}ms")
            }

    }

    companion object {
        private fun getRandomStringOfDigits(numberOfDigitsToGenerate: Int): String {
            val sb = StringBuilder(numberOfDigitsToGenerate)
            for (i in 0 until numberOfDigitsToGenerate)
                sb.append(Random.nextInt(10).toString())
            return sb.toString()
        }
    }
}

渐变依赖项:

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    api 'com.googlecode.libphonenumber:libphonenumber:8.12.13'
 类似资料:
  • 我看到了一些与我要求的相似的问题,但似乎没有什么符合要求的。 我处于需要处理通话记录并使用电话号码确定国家的位置。拨打的号码可以是任何国家,例如: 44 7899455120-英国 34 965791845-西班牙 355 788415235-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地

  • 我正在使用google库将国际电话号码转换为国家号码。 的一个示例是919744012345 我期望的是“9744012345”(请参阅印度的移动电话号码),但我得到的是带前导零的“09744012345”。 如何正确转换国际电话号码?

  • 我需要在UITextField中显示电话号码格式作为占位符。我怎么能那样做? 对于国家选择,我使用下面提到的库,它提供了针对用户选择的国家的国旗和国家代码。 https://github.com/NikKovIos/NKVPhonePicker 选择国家后,我需要显示所选国家的电话号码格式,提交该电话号码时,我必须验证电话号码。 我还发现,第三方(PhoneNumberKit)的灵感来源于谷歌的l

  • 我有这样一个字符串:33123456789(法语电话号码)。我想在不知道国家的情况下提取国家代码(33)。例如,如果我有另一部来自另一个国家的手机,它应该可以工作。我使用谷歌图书馆https://code.google.com/p/libphonenumber/. 如果我知道国家,那很酷,我可以找到国家代码: 但是我找不到一种在不了解国家的情况下解析字符串的方法。

  • 我可以在Android系统中检测来电,但问题是我想知道那个电话号码的国家代码,这样我就可以分析它是国家号码还是国际号码。我知道libphonenumber,但它需要事先知道地区代码才能获得国家代码,如示例所示 它已经知道把作为参数。但是我们不知道这个数字是否为我们所知,那么我们如何分析这个数字。

  • 我想要电话号码的国家代码列表。例如,美国(1),英国(44)...我知道libphonenumber是一个帮助手机解析、格式化和验证的好工具。然而,它似乎没有列出所有国家代码的功能。但是那些数据应该在libphonenumber的元数据中,对吗?有人有这方面的经验吗?