65.9K
CodeProject 正在变化。 阅读更多。
Home

Domain-Genie™ 创建新的电视购物域名

2010年10月23日

CPOL

8分钟阅读

viewsIcon

54891

downloadIcon

562

为电视购物和产品创建和测试新域名

DomainGenie

引言

众所周知,创建一个新的域名非常困难,而如今在商业中拥有一个好的域名至关重要。我制作半小时的电视直销节目,由著名名人主持,销售从减肥到软件的各种产品。每次我创建一个新的电视直销节目来销售新产品时,我都必须为该产品创建一个新的域名。正如大多数读者所知,所有好的域名都已经被占用了。

由于一个电视直销节目一年仅电视销售额就能带来 2000 万到 3 亿美元的收入,因此获得一个易于记忆的域名至关重要。域名可以成就或毁掉一个电视直销节目,这同样适用于许多其他在线业务。许多电视观众会根据产品名称搜索网站。例如,如果产品名称是“Domain-Genie”,他们会自动认为域名是 www.Domain-Genie.com,因此我们总是尝试将电视直销节目中的产品名称作为该节目的域名。

在本文中,我将介绍一种创建仍然可用且适合电视直销的域名的方法,该方法试图同时生成好的域名并检查这些名称的可用性。由于 ICANN 不允许您运行脚本来检查其服务器上的域名可用性,因此我决定使用不访问 ICANN 服务器的 DNS 检查。我的方法只能让您大致了解哪些名称可用,但它有助于缩小您创建的列表。

背景

在这里,我要感谢另外两位作者。为了处理 DNS 查询,我使用了 CodeProject 上一篇名为 **DNS.NET Resolver** 的文章中的代码来分析 DNS 数据包。我使用的选项卡控件也来自 CodeProject 上一篇名为 **A Highly Configurable MDI Tab Control from Scratch** 的文章,用于创建本文项目中的 WhoisForm 和 DictionaryForm 的选项卡。第一部分是生成新的域名,然后检查该域名是否已注册并获得商标。我还使用了 Juraj Borza 在 CodeProject 上另一篇文章 **Creating a Nickname Generator** 中的单词生成器的一个修改版本。

头韵和押韵造就好的域名

简短、甜美、简单且易于记忆是好域名的关键。那么什么使名称易于记忆呢?一个词或短语很容易记住,如果这个词具有视觉关联。例如,“猫”这个词很容易记住,因为当你看到这个词时,你可以很容易地想象出一只猫。在电视直销中,我们展示了产品和域名的视觉关联,这样电视观众就能更容易地记住名称。

头韵是指一个词组的两个或多个重读音节,要么具有相同的辅音或辅音组(辅音头韵),例如“from stem to stern”,或者具有可能因音节而异的元音(元音头韵),例如“each to all”。在示例项目中,我包含了使用相同首字母的头韵,并计划在下一个更新中添加一个用于辅音头韵的算法,这应该有助于创建听起来更令人愉悦的名称。

那么我们如何通过编程方式创建一个好的域名呢?在 Domain-Genie 中,我使用了一个两阶段系统,如下面的图所示。

DomainGenie

其思想是我们创建两个短语,即短语 #1 和短语 #2。每个短语可以来自各种来源,例如

  • 固定单词
  • 专业词汇列表
  • 语言词典
  • 随机生成的字母

然后,您可以选择将这两个短语并置而不带连字符,或者您可以在两个短语的并置之间包含一个连字符。有一个选项是使用“头韵”,它允许您强制短语 #1 的首字母与短语 #2 的首字母匹配。最困难的事情之一是找到免费的好的专业词汇列表,我很欢迎知道在哪里可以在互联网上找到这些词汇列表的读者的任何建议?该程序允许您设置这两个短语的最大长度。

我在程序中包含了一些属于特定类别的单词列表。在互联网上找到这些单词列表很困难,我仍在寻找更多的单词列表。我包含的单词列表如下所示。

DomainGenie

测试域名可用性的逻辑

下面是用于查看域名是否可用的线程和逻辑代码。如我所述,这是一种非常粗略的猜测可用性的方法,并且会产生误报。已注册的域名可能没有任何名称服务器,而具有名称服务器的域名在某些条件下可能可用。但它提供了一种快速查看数千个域名的方法。我使用的逻辑如下所示,可用性存储在变量 _Status 中。

private void DoWhoisQuery(object o)
{
   object[] state = (object[])o;
   int _Row = (int)state[0];
   string _Domain = (string)state[1];
   string _Server = (string)state[2]; 
   string _Status = "registered";
   string _DStatus = "unknown";
   string _Info = string.Empty;
   int iAnswerCount = -1;
   StringBuilder sb = new StringBuilder();
   Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US", false);
   Stopwatch sw = new Stopwatch();
   sw.Start();
   Response response = resolver.Query(_Domain, QType.ANY, QClass.IN);
   sw.Stop();
   bool bError = false;
   if (response.Error != "")
   {
      sb.Append(response.Error.ToString());
      iAnswerCount = -1;
      _Status = "unknown";
      _DStatus = "-1";
      _Info = "none";
      bError = true;
   }
   if(!bError)
   {
      iAnswerCount = response.header.ANCOUNT;
      if (iAnswerCount < 1)
         _Status = "available?";
      if (iAnswerCount > 1)
         iAnswerCount = 0;
      sb.Append("Got answer:");
      sb.Append("<br />");
      sb.Append(string.Format("->>HEADER<<- opcode: {0}, status: {1}, id: {2}", 
      response.header.OPCODE, response.header.RCODE, response.header.ID));
      sb.Append("<br />");
      sb.Append(string.Format("flags: {0}{1}{2}{3}; QUERY: {4}<br />, 
      ANSWER: {5}<br />, AUTHORITY: {6}<br />, ADDITIONAL: {7}<br />",
      response.header.QR ? " qr" : "",
      response.header.AA ? " aa" : "",
      response.header.RD ? " rd" : "",
      response.header.RA ? " ra" : "",
      response.header.QDCOUNT,
      response.header.ANCOUNT,
      response.header.NSCOUNT,
      response.header.ARCOUNT));
      sb.Append("<br />");
      if (response.header.QDCOUNT > 0) {
         sb.Append("QUESTION SECTION:");
         foreach (Question question in response.Questions)
         sb.Append(string.Format("{0}", question));
         sb.Append("<br />");
      }
      if (response.header.ANCOUNT > 0) {
         sb.Append("ANSWER SECTION:");
         foreach (AnswerRR answerRR in response.Answers)
         sb.Append(answerRR);
         sb.Append("<br />");
      }
      if (response.header.NSCOUNT > 0) {
         sb.Append("AUTHORITY SECTION:");
         foreach (AuthorityRR authorityRR in response.Authorities)
            Console.WriteLine(authorityRR);
         sb.Append("<br />");
      }
      if (response.header.ARCOUNT > 0) {
         sb.Append("ADDITIONAL SECTION:");
         foreach (AdditionalRR additionalRR in response.Additionals)
            sb.Append(additionalRR);
         sb.Append("<br />");
      }
      sb.Append(string.Format("Query time: {0} msec", sw.ElapsedMilliseconds));
      sb.Append("<br />");
      sb.Append(string.Format("SERVER: {0}#{1}({2})", response.Server.Address, 
      response.Server.Port, response.Server.Address));
      sb.Append("<br />");
      sb.Append(string.Format("WHEN: " + response.TimeStamp.ToString(
      "ddd MMM dd HH:mm:ss yyyy", new System.Globalization.CultureInfo("en-US"))));
      sb.Append("<br />");
      sb.Append(string.Format("MSG SIZE rcvd: " + response.MessageSize));
      sb.Append("<br />");
   }
   try
   {
      ThreadSync.InvokeDelegate( QueryComplete, this, new CellUpdateEventArgs( 
    _Row, _Domain, _Server, _Status, _DStatus, sb.ToString()));
   }
   catch (SystemException e)
   {
      throw e;
   }
   catch (Exception e)
   {
   } 
}

语言词典的虚拟列表视图

另一种有用的方法是使用语言词典。在下一个更新中,我将发布 77 种语言的完整语言词典。由于每种语言的单词数量很多,因此我使用了虚拟列表视图来加载大型语言词典,并且我按如下方式加载了虚拟视图。

        void SetupListview(bool blnVirtual)
        {
            // Force it to be virtual
            blnVirtual = true;
            this.listViewWords.VirtualMode = false;
            this.listViewWords.View = View.List;
            this.listViewWords.CheckBoxes = true;

            if (blnVirtual)
            {
                // This makes it real fast!!
                this.listViewWords.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);
                this.listViewWords.VirtualListSize = lvi.Length;
                this.listViewWords.VirtualMode = true;

                // This is for drawing unchecked checkboxes
                this.listViewWords.OwnerDraw = true;
                this.listViewWords.DrawItem += new DrawListViewItemEventHandler(listView_DrawItem);

                // Redraw when checked or doubleclicked
                this.listViewWords.MouseClick += new MouseEventHandler(listView_MouseClick);
                this.listViewWords.MouseDoubleClick += new MouseEventHandler(listView_MouseDoubleClick);
            }
            else
            {
                listViewWords.Items.AddRange(lvi);
            }
        }

随机字母短语

“生成随机字母”短语的选项使用了 Juraj Borza 在他之前提到的 CodeProject 文章“Creating a Nickname Generator”中开发的那个方法,即像 tmxoitrdyariqefoauhuatyni 这样的随机字符串不是好名字,并且会创建难以记忆的名字。我使用了他的建议来交替元音和辅音,因此我们将得到类似 ZobonaOsavirEcumolObunu 的结果,正如他在文章中所讨论并如下所示。

        public NameGenerator()
        {
            random = new Random();
            vowels = new char[] { 'a', 'e', 'i', 'o', 'u', 'y' };
            consonants = new char[] { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm',
            'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' };
        }

        public string Generate(int length, string startsWith)
        {
            StringBuilder sb = new StringBuilder();
            //initialize our vowel/consonant flag
            bool flag = (random.Next(2) == 0);
            for (int i = 0; i < length; i++)
            {
                sb.Append(GetChar(flag));
                flag = !flag; //invert the vowel/consonant flag
            }
            return startsWith+sb.ToString();
        }

商标和谷歌搜索

我还包含了一个多标签网页浏览器,允许用户谷歌搜索名称,并对他们创建的可用域名进行商标搜索。我曾尝试自动化商标搜索,但您不允许运行脚本访问该网站,因此这些搜索仍必须手动完成。

关注点

电视直销能否让域名出名?答案是不能。仍然需要一个易于记忆的名称,否则无论有多少电视曝光都无法使其出名。有趣的是,研究表明,在电视直销播出 90 天后,95% 的观众至少看过一次该电视直销。但即使有如此高的曝光度,电视观众也只会记住产品或域名,如果它能与某种视觉图像相关联并且易于记忆的话。对于那些好奇的读者来说,一个半小时的电视直销节目每花费 1 美元的电视时间就能为网站带来 1000 名独立访客。事实很简单,任何人都可以录制并播出自己的电视直销节目,因为家用摄像机具有广播级质量(它们都符合 CRC-601 规范),并且在任何电视网络上购买半小时的电视时间最低只需 15 美元。大多数人将电视广告(TV Spot)和电视直销(Infomercial)这两个术语混淆。电视广告时长为 2 分钟或更短,而电视直销时长为 26 分钟或更长。这个区别很重要,因为当电视广告在电视上出现时,人们会起身去洗手间或冰箱,或者他们会使用 TIVO 跳过广告。而半小时的电视直销时间花费的成本低于 60 秒的电视广告,这令大多数人感到惊讶。

结论

总而言之,如今拥有一个好的域名的网站已成为您业务的必需品。总的来说,要创建一个好的域名,它应该是令人难忘的、简短的、.com 的、全球性的、听起来悦耳的、无连字符的、押头韵的、描述性的,并且应该能够为您的产品品牌化。名称应该自动出现在访问者的脑海中,并且易于记忆。因此,在为该程序创建单词列表时,您应该只包含令人难忘的单词。名称越短越好。这就是为什么我在示例程序中包含设置短语长度的选项。更短的域名减少了拼写错误的可能性,并且访问者更有可能输入较短的域名。

尽量只使用 .com 后缀。押头韵的单词听起来更悦耳,更容易发音、记忆和拼写。您的域名应该描述网站活动,以便访问者立即了解网站的内容。您的域名应该是全球性的名称,以便来自不同国家、种族和宗教的访问者都能对其产生共鸣。全球名称似乎更优雅,更能吸引更多访问者。使用此程序生成新域名时,我发现一次创建和测试数百个域名效果最好。此外,使用头韵有助于生成听起来更令人愉悦的域名。

Bill SerGio,电视购物之王
www.GeminiGroupTV.com
www.StationBreak.net

© . All rights reserved.