zoukankan      html  css  js  c++  java
  • 如何使用C#实现QQ号码的申请

    腾讯向大众提供了申请QQ的界面,方便很多潜在用户加入QQ大军中,注册页面是http://reg.qq.com ,为了限制用户的过度使用,设置了验证码、IP限制等手段,一般用户默认一天只能申请几个QQ号码,号码是随机生成的,当然好的号码是不会有的,这些是腾讯的资源,需要付费才能获取到。

    本文主要介绍如何利用C#来实现QQ号码的快速、批量申请操作,以及考虑如何加入宽带拨号的方式实现IP的限制,尽可能的申请到更多的QQ号码,以供他用。

    先看看演示程序的界面效果:

     =====》

    上面是我使用C#实现QQ号码申请的演示程序,是应用的雏形。其中为了方便,把用户需要填写的信息封装起来,用户开通QQ号码后,再自行修改即可,只需要输入验证码即可快速申请到QQ。

    1、首先需要获取验证码,然后供用户输入并提交申请,这里我使用了后台线程进行处理,提高用户界面的响应效果。

         public partial class Form1 : Form

        {
            
    private CookieContainer cookieReg = new CookieContainer();
            
    private BackgroundWorker worker = new BackgroundWorker();
            
    private WebProxy proxy;


            
    public Form1()
            {
                InitializeComponent();

                worker.DoWork 
    +=new DoWorkEventHandler(worker_DoWork);
                worker.RunWorkerCompleted 
    += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

                
    //proxy = new WebProxy("120.203.214.184", 80);
            }

            
    private void GetVerifyImage()
            {
                worker.RunWorkerAsync(
    "GetImage");
            }

            
    void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                
    string newverifyUrl = "http://captcha.qq.com/getimage?aid=1007901&" +
                    
    new Random().NextDouble() + new Random().Next(10+ new Random().Next(10);

                cookieReg 
    = new CookieContainer();
                HttpHelper httpHelper 
    = new HttpHelper();
                
    string regurl = "http://reg.qq.com";
                httpHelper.GetHtml(regurl, cookieReg, regurl, proxy);

                
    using (Stream s = httpHelper.GetStream(newverifyUrl, cookieReg, regurl, proxy))
                {
                    
    if (s == null)
                    {
                        MessageUtil.ShowWarning(
    "获取登陆码错误,请检查您的网络!");
                        
    return;
                    }
                    e.Result 
    = Image.FromStream(s);
                }
            }

            
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                Image image 
    = e.Result as Image;
                
    if (image != null)
                {
                    
    this.pictureBox1.Image = image;
                }
            }

    2、 处理申请操作结果显示。申请QQ的处理操作相对比较繁琐,我把它封装在一个处理函数中,这样我们在事件处理的时候,先宏观处理结果,然后在进一步细化具体的操作,如下所示:

            private void btnApplyNumber_Click(object sender, EventArgs e)
            {
                
    if (this.txtVerifyCode.Text.Length < 4)
                {
                    SetTips(
    "请输入验证码");
                    
    this.txtVerifyCode.Focus();
                }

                
    string qqnumber = ApplyQQ();
                
    if (!string.IsNullOrEmpty(qqnumber))
                {
                    SetTips(
    string.Format("恭喜您,申请到QQ {0}", qqnumber));
                    LogTextHelper.WriteLine(
    string.Format("{0}----{1}", qqnumber, "123abc"));
                }
                
    else
                {
                    
    if (getnumHtml.Contains("此IP申请的操作过于频繁"))
                    {
                        SetTips(
    "IP操作过于频繁");
                    }
                    
    else
                    {
                        SetTips(
    "申请失败,请重试");
                    }
                }
                GetVerifyImage();
            }

     以上先对申请的操作进行处理,并记录最后申请结果页面,如果页面有一些特殊的如IP操作频繁的信息,则提示用户IP操作的问题,方便采取如“手工拨号”等方式进行处理,实现IP的变化,从而可以申请更多的QQ号码。如果一切正常,返回QQ号码,那么记录到相关的媒介并显示即可。

    3、 详细QQ申请操作处理逻辑。申请QQ的处理,不是一般的麻烦,为了不给用户识别相应的提交内容,腾讯把申请的资料进行乱码化处理,并把顺序打乱,把相应的名称处理成0f2b4766321c2d6a4c7a61515324这样不可识别的字符串,然后统一提交,一般人是识别不了这些字符串的,字符串不是加密串,是随机按照规则组合而成,很变态。这里我提供大致的思路,就是先获取Cookie的相关信息,把里面的变量作为基础,对数据进行处理,然后作为相应的字段名称,混合提交的内容,一起POST到服务器,如果成功,则返回QQ号码,否则提示相应的错误信息。

            private string getnumHtml = "";//最后申请的网页内容
            private string ApplyQQ()
            {
                
    string html = "";// "g_dataArray=new Array(new Array(\"0f2b4766321c2d6a4c7a61515324\",\"4621587a340437624e71315a5a2b\",\"23755a6a29192c7b506d73474536\",\"4f21596e22043464537b774b493a\",\"2d2d5b6a01163078567072577102\",\"4121587a340437624e7130525223\",\"4f2d486122002679117b65555728\",\"047548612200267910736d5d5f30\",\"306d4a6024193779584b55656718\",\"2574486122002679136b75454738\",\"33344a66250e703f1429370b0970\",\"252348683412256c49766a585c2d\",\"161059673e192645547262564206\"),new Array(9796,9806,9807,9803,9797,9795,9793,9798,9802,9801,9800,9799,9792),\"/cgi-bin/getnum\");";
                string regurl = "http://reg.qq.com/";
                HttpHelper helper 
    = new HttpHelper();

                
    int BaseNum = 0;
                BaseNum 
    = GetBaseNumByCookieSkey(cookieReg);     

                
    string nick = "test";
                
    string pass = "123abc";
                
    string repass= pass;
                
    string year = "2009";
                
    string month = "12";
                
    string day = "13";
                
    string sex =  "1";
                
    string verifycode = this.txtVerifyCode.Text;
                
    string province = "11";
                
    string city = "1";
                List
    <string> ElementsArrName = GetElementArray(nick, pass, repass, year, month, day, sex, verifycode, province, city);
                List
    <short> DataArrayShort = new List<short>();
                List
    <string> DataArrayLong = new List<string>();

                Thread.Sleep(
    100);
                
    string regurl2 = "http://reg.qq.com/cgi-bin/checkconn?seed" + new Random().NextDouble() + new Random().Next(10);

                html 
    = helper.GetHtml(regurl2, cookieReg, regurl, proxy);
                
    // html = "g_dataArray=new Array(new Array(\"0f2b4766321c2d6a4c7a61515324\",\"4621587a340437624e71315a5a2b\",\"23755a6a29192c7b506d73474536\",\"4f21596e22043464537b774b493a\",\"2d2d5b6a01163078567072577102\",\"4121587a340437624e7130525223\",\"4f2d486122002679117b65555728\",\"047548612200267910736d5d5f30\",\"306d4a6024193779584b55656718\",\"2574486122002679136b75454738\",\"33344a66250e703f1429370b0970\",\"252348683412256c49766a585c2d\",\"161059673e192645547262564206\"),new Array(9796,9806,9807,9803,9797,9795,9793,9798,9802,9801,9800,9799,9792),\"/cgi-bin/getnum\");";
                GetDataArray(html, ref DataArrayShort, ref DataArrayLong);

                
    string postData = GetPostData(ElementsArrName, BaseNum, DataArrayShort, DataArrayLong);
                
    //MessageBox.Show(postData);

                Thread.Sleep(
    100);
                
    string regurl3 = "http://reg.qq.com/cgi-bin/getnum";
                html 
    = helper.GetHtml(regurl3, cookieReg, postData, true, regurl, proxy);
                getnumHtml 
    = html;//记录最后分析的内容,以便进一步分析操作

                Regex re 
    = new Regex("var\\s*xyz=\"(.*?)\";", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                Match mc 
    = re.Match(html);
                
    if (!mc.Success)
                {
                    
    return "";
                }
                
    string qqnumber = mc.Groups[1].Value;
                
    return qqnumber;
            }   

    上面注释的部分,就是获取到的相关信息,乱码一片,不过既然是本地处理,也是有规律可循的,本文只是介绍相关的规则,详细实现不在一一呈现,主要的处理逻辑就是获取本地Cookie的某项内容,并把内容进行截断,作为一个BaseNum,然后把获取到的数组进行乱码化,作为提交字段的名称,然后一一放置相关的内容,提交到服务处理。

    上面只是一个简单的Demo,一般情况下,申请3~10左右的号码可能就会因为IP的限制,而不能继续,需要暂停几个小时才能继续可以申请一个左右,第二天才可以继续申请更多的号码。

     为了更好的申请更多的QQ号码,一般需要加入拨号这种方式来处理IP的限制,如我的QQ搜通天中应用来批量申请QQ号码的界面如下所示:

     

     如果需要了解详细,可以下载该软件来玩玩,熟悉下QQ申请的操作模式。

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1886209.html
Copyright © 2011-2022 走看看