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开发框架、WCF开发框架的研究及应用。
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
  • 相关阅读:
    错误记录 git pull
    关于file_operations结构体
    20180911-Java实例01
    20180910-Java 文档注释
    20180907-Java Applet基础
    Elastic Stack生态圈
    关于我和本博客
    雨后的春日清晨
    charles 安装https证书
    css3不同文字大小底部对齐的完美解决方案
  • 原文地址:https://www.cnblogs.com/zhihai/p/2349771.html
Copyright © 2011-2022 走看看