【问题标题】:Finding the phone company of a cell phone number?查找手机号码的电话公司?
【发布时间】:2011-11-25 09:06:38
【问题描述】:

我有一个应用程序,人们可以在其中提供电话号码,它会通过电子邮件-短信网关向电话号码发送短信。但是,要使其正常工作,我需要给定号码的电话公司,以便将电子邮件发送到正确的 SMS 网关。我见过一些允许您查找这些信息的服务,但它们都不是以 Web 服务或数据库的形式出现的。

例如,http://tnid.us 提供这样的服务。我的电话号码的示例输出:

他们从哪里获得每个号码的“当前电话公司”信息。这是免费提供的信息吗?是否有数据库或某种网络服务可以用来获取给定手机号码的信息?

【问题讨论】:

  • 这有点令人困惑。但总的来说,大公司就像联邦调查局一样,拥有我们没有的访问权限。我想他们可能与信用卡局勾结……但我知道什么。

标签: web-services sms phone-number


【解决方案1】:

[披露:我为 Twilio 工作]

您可以使用Twilio Lookup 检索电话号码信息。

如果您目前正在评估电话号码查找的服务和功能,我建议您试试 Lookup via the quickstart

【讨论】:

    【解决方案2】:

    这将是相当密集的代码,但只要有 tnid.us 网站,您现在就可以自己做,无需 API:

    为什么不使用电话号码的 URL 在隐藏的浏览器窗口中打开 IE?看起来 URL 将采用 http://tnid.us/search.php?q=########## 的格式,其中 # 代表一个数字。所以你需要一个文本框、一个标签和一个按钮。我将文本框称为“txtPhoneNumber”,将标签称为“lblCarrier”,按钮将调用我在“OnClick”下方的函数。

    按钮函数使用 MSHtml.dll 和 SHDocVW.dll 创建 IE 实例,并对浏览器“对象”中的 HTML 进行页面抓取。然后你把它解析下来。您必须首先安装 Visual Studio 2005 附带的互操作性程序集 (C:\Program Files\Common Files\Merge Modules\vs_piaredist.exe)。那么:

    1> 在 Visual Studio.NET 中创建一个新的 Web 项目。

    2> 添加对 SHDocVw.dll 和 Microsoft.mshtml 的引用。

    3> 在 default.aspx.cs 中,在顶部添加这些行:

    using mshtml;
    using SHDocVw;
    using System.Threading;
    

    4> 增加如下功能:

    protected void executeMSIE(Object sender, EventArgs e)
    {
        SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorerClass();
        object o = System.Reflection.Missing.Value;
        TextBox txtPhoneNumber = (TextBox)this.Page.FindControl("txtPhoneNumber");
        object url = "http://tnid.us/search.php?q=" + txtPhoneNumber.Text);
        StringBuilder sb = new StringBuilder();
    
        if (ie != null) {
            ie.Navigate2(ref url,ref o,ref o,ref o,ref o);
            ie.Visible = false;
            while(ie.Busy){Thread.Sleep(2);}
            IHTMLDocument2 d = (IHTMLDocument2) ie.Document;
            if (d != null) {
                IHTMLElementCollection all = d.all;
                string ourText = String.Empty;
                foreach (object el in all)
                {
                   //find the text by checking each (string)el.Text
                   if ((string)el.ToString().Contains("Current Phone Company"))
                       ourText = (string)el.ToString();
                }
             // or maybe do something like this instead of the loop above...
             // HTMLInputElement searchText = (HTMLInputElement)d.all.item("p", 0);
                int idx = 0;
                // and do a foreach on searchText to find the right "<p>"...
                foreach (string s in searchText) {
                   if (s.Contains("Current Phone Company") || s.Contains("Original Phone Company")) {
                      idx = s.IndexOf("<strong>") + 8;
                      ourText = s.Substring(idx);
                      idx = ourText.IndexOf('<');
                      ourText = ourText.Substring(0, idx); 
                   }
                }
                // ... then decode "ourText"
                string[] ourArray = ourText.Split(';');
                foreach (string s in ourArray) {
                    char c = (char)s.Split('#')[1];
                    sb.Append(c.ToString());
                }
                // sb.ToString() is now your phone company carrier....
            }
        }
    
        if (sb != null)
            lblCarrier.Text = sb.ToString();
        else
            lblCarrier.Text = "No MSIE?";
    }
    

    由于某种原因,当我直接使用 tnid.us 网站时,我没有得到“当前电话公司”,但只有原始网站。所以你可能想让代码测试它得到了什么,即

    bool currentCompanyFound = false;
    if (s.Contains("Current Telephone Company")) {  currentCompanyFound = true }
    

    我让它检查上面的任何一个,所以你会得到一些东西。代码应该做的是找到

    之间的 HTML 区域
    <p class="lt">Current Telephone Company:<br /><strong>
    

    </strong></p>
    

    我让它寻找索引

    <strong>
    

    并添加该单词的字符以到达起始位置。我不记得您是否可以对 .indexOf 使用字符串或仅使用字符。但是你明白了,你或其他人可能会找到一种方法让它从那里开始工作。

    您返回的文本是用字符代码编码的,因此您必须对其进行转换。我在上面给了你一些代码,应该可以帮助...

    【讨论】:

    • +1 全力以赴提供免费解决方案,但我认为如果我真的需要它那么糟糕,我会使用他们的 API
    • 您应该能够编写脚本下载页面,并解析页面上的 html。这似乎不那么密集的代码,并且稍微不那么混乱。
    • 脚本(客户端)通常更密集的带宽/处理器,并且可以锁定浏览器 - 发现代码隐藏(服务器端)是该部门的方式。如果它是托管解决方案。我同意任何时候解析 HTML 都很麻烦,但我刚刚完成了一个项目,当我发布此内容时我必须这样做,所以当时对我来说似乎很直观。
    【解决方案3】:

    您需要的是称为HLR(归属位置寄存器)号码查找。

    在其基本形式中,此类 API 需要国际格式的电话号码(例如,+15121234567)并返回其IMSI,其中包括其MCC(给你国家)和MNC(给你您是手机的运营商)。甚至可能包括电话当前的运营商(例如,判断电话是否正在漫游)。如果手机当前超出范围或关闭,它可能无法工作。在这些情况下,根据 API 提供者的不同,它们可能会为您提供缓存结果。

    您提到的网站似乎提供了这样的功能。对“HLR 查找 API”的网络搜索将为您提供更多结果。我有 CLX's 服务的个人经验,我会推荐它。

    【讨论】:

      【解决方案4】:

      您是否在 tnid.us 结果页面上稍微往下看?

      Need API access?  Contact sales@tnID.us.
      

      【讨论】:

      • 刚刚又看了一遍,发现“需要为您的企业识别电话号码?”而不是需要 API 访问权限。呵呵。我假设他们有一些销售线或根据每个请求而改变的东西。无论哪种方式,很好的发现
      猜你喜欢
      • 2011-11-19
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多