人人网需要天天登陆,才能获得持续的登录奖励,但是每次都登录啥的,感觉非常没意思,于是派生出用软件来自动登陆,这样既省时省事,又能获得奖励。

之前没有怎么接触过网络编程,搜索了下,找到参考文章 http://isouth.org/?p=297,这个是用java写的,无奈java不会,用c++写之。

那位博主 老兄已经把细节的东西都说了,登录过程非常简单,就是模拟浏览器发送请求,如果你需要更新状态,需要从返回的请求包中提取出get_check,然后在发送的时候使用这个值就ok了。

当然服务器返回的数据中,使用的是gzip编码,需要进行响应的解码才能得到数据。

别的不多说了,贴C++代码。

环境 Win7 + VS2010, MFC + zlib

以下是登陆代码

// 模拟FireFox4.0 登陆网页 bool CLoginDlg::OnPcWebLogin(const CString &email, // username : email const CString &password) // password: { bool ret = false; CInternetSession session; CHttpConnection* pServer; CHttpFile* pf; m_check = ""; try { CString ServerName = "www.renren.com"; INTERNET_PORT nPort = 80; //port CString suffix = "autoLogin=false&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com"; CString data = "email=" + email + "&password=" + password + "&" + suffix; pServer = session.GetHttpConnection(ServerName, nPort); //拼接头部 pf = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/PLogin.do"); pf->AddRequestHeaders("Host: www.renren.com"); pf->AddRequestHeaders("User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0"); pf->AddRequestHeaders("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); pf->AddRequestHeaders("Accept-Language: zh-cn,zh;q=0.5"); pf->AddRequestHeaders("Accept-Encoding: gzip, deflate"); pf->AddRequestHeaders("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7"); // pf->AddRequestHeaders("Keep-Alive: 115"); // pf->AddRequestHeaders("DNT: 1"); // pf->AddRequestHeaders("Connection:Keep-Alive"); pf->AddRequestHeaders("Referer: http://www.renren.com/SysHome.do"); pf->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded"); pf->SendRequest(NULL, 0, data.GetBuffer(0), data.GetLength()); DWORD statusCode = 0; if(!pf->QueryInfoStatusCode(statusCode) || statusCode != HTTP_STATUS_OK) { CString e; e.Format("PC WEB Login failed, Pls Check. status code = %d/n", statusCode); throw exception(e.GetBuffer()); } DWORD ptrLen = 100 * 1024; // 以下为读取数据 LPSTR ptr = new CHAR[ptrLen]; ZeroMemory(ptr, ptrLen); DWORD len = 0, len2 = 0; do { len = pf->Read(ptr + len2, ptrLen); len2 += len; }while(len != 0); LPSTR ptr2 = new CHAR[ptrLen]; ZeroMemory(ptr2, ptrLen); // 由gzip解压 httpgzdecompress((Byte *)ptr, len2, (Byte *)ptr2, &ptrLen); delete ptr; ptr = NULL; // 寻找校验码 LPSTR checkBeginPos = strstr(ptr2, "get_check:/'"); if(checkBeginPos != NULL) { checkBeginPos += strlen("get_check:/'"); LPSTR checkEndPos = strstr(checkBeginPos, "/'"); if(checkEndPos != NULL) { *checkEndPos = '/0'; m_check = checkBeginPos; ret = true; } } delete ptr2; ptr2 = NULL; } catch(exception e) { TRACE("[ERROR]:%s/n", e.what()); } if(pf != NULL) { pf->Close(); delete pf; pf = NULL; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } session.Close(); return ret; }

以下是发送状态的代码

这里面的状态要求是utf8编码,务必请自己转换,

bool CLoginDlg::OnPcWebStatus(const CString &status) // status for update { bool ret = false; if(m_check == "") { TRACE("Pls Login First!/n"); return ret; } CInternetSession session; CHttpConnection* pServer; CHttpFile* pf; CString ServerName = "status.renren.com"; INTERNET_PORT nPort = 80; //port CString data = "c=" + status + "&raw=" + status + "&isAtHome=1&publisher_form_ticket=" + m_check + "&requestToken=" + m_check; pServer = session.GetHttpConnection(ServerName,nPort); //拼接头部 pf = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/doing/update.do?"); pf->AddRequestHeaders("Host: status.renren.com"); pf->AddRequestHeaders("User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0"); pf->AddRequestHeaders("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); pf->AddRequestHeaders("Accept-Language: zh-cn,zh;q=0.5"); pf->AddRequestHeaders("Accept-Encoding: gzip, deflate"); pf->AddRequestHeaders("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7"); // pf->AddRequestHeaders("Keep-Alive: 115"); // pf->AddRequestHeaders("DNT: 1"); // pf->AddRequestHeaders("Connection:Keep-Alive"); pf->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded; charset=UTF-8"); pf->AddRequestHeaders("Referer: http://status.renren.com/ajaxproxy.htm"); pf->SendRequest(NULL,0,data.GetBuffer(0), data.GetLength()); ret = true; DWORD statusCode = 0; if(!pf->QueryInfoStatusCode(statusCode) || statusCode != HTTP_STATUS_OK) { TRACE("Fuck for error %d/n", statusCode); ret = false; } if(pf != NULL) { pf->Close(); delete pf; pf = NULL; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } session.Close(); return ret; }

转换代码如下:

DWORD ucs2Len = MultiByteToWideChar(CP_ACP, 0, status.GetBuffer(0), status.GetLength(), NULL, 0); PWCHAR ucs2 = new WCHAR[ucs2Len + 1]; ZeroMemory(ucs2, (ucs2Len + 1) * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, status.GetBuffer(0), status.GetLength(), ucs2, ucs2Len + 1); DWORD utf8Len = WideCharToMultiByte(CP_UTF8, 0, ucs2, ucs2Len, NULL, 0, 0, 0); PCHAR utf8 = new CHAR[utf8Len + 1]; ZeroMemory(utf8, (utf8Len + 1) * sizeof(CHAR)); WideCharToMultiByte(CP_UTF8, 0, ucs2, ucs2Len, utf8, utf8Len, 0, 0); CString newStatus = utf8; delete [] utf8; utf8 = NULL; delete [] ucs2; ucs2 = NULL;

最后还有最重要的是,gzip解码代码,这部分代码时参考某位大神提供的gzip的测试代码,具体是哪位大神,没有记录下来,非常的不好意思。

/* HTTP gzip decompress */ int httpgzdecompress(Byte *zdata, uLong nzdata, Byte *data, uLong *ndata) { int err = 0; z_stream d_stream = {0}; /* decompression stream */ static char dummy_head[2] = { 0x8 + 0x7 * 0x10, (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF, }; d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = zdata; d_stream.avail_in = 0; d_stream.next_out = data; if(inflateInit2(&d_stream, 47) != Z_OK) return -1; while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) { d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break; if(err != Z_OK ) { if(err == Z_DATA_ERROR) { d_stream.next_in = (Bytef*) dummy_head; d_stream.avail_in = sizeof(dummy_head); if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) { return -1; } } else return -1; } } if(inflateEnd(&d_stream) != Z_OK) return -1; *ndata = d_stream.total_out; return 0; }

至此,当前时间2011/4/1,这段代码是可以登录校内,并且发状态,部分代码与http://isouth.org/?p=297有所差别,因为他的文章较早,校内部分协议做过修改。

本文首发于CSDN http://blog.csdn.net/sdoat/archive/2011/04/01/6294123.aspx,转载务必标明出处。

人人网登陆之C++版(MFC)相关推荐

  1. 登陆QQ手机版,免费拿精品靓号

    好久不发文章了,今天就分享一个福利给大家吧~ 登陆QQ手机版,免费拿精品靓号 填写信息后,需要登陆QQ手机版激活. 每天上限人数1000000人,注册后需要验证手机号,并于1周内激活. 试着去注册了一 ...

  2. DEV-C++双人抢滩登陆1.1版推出了

    女士们,先生们,我亲爱的粉丝们,你们梦寐以求的DEV-C++双人抢滩登陆1.1版我写好了!!! 下面,开始教程! 1.回顾 上次我们写了1.0版,在次给大家看下代码: #include<bits ...

  3. 客户端登陆 T3标准版,已停止工作

    服务器没有问题,可以登陆可以正常操作,但是在客户端就是这个提示, 试过畅捷通的提供的方法---以下是用友畅捷通官方提示解决方法,但是还是不行. 登录T3提示[T3标准版已停止工作]一般是兼容或者网络连 ...

  4. Webtop Html5 桌面App开发 -- 整合人人网登陆

    为什么80%的码农都做不了架构师?>>>    Webtop 既然是用html+css+js来开发桌面APP,那么在做一些娱乐社交应用的时候,去整合一些开放平台的时候也是十分方便的. ...

  5. vs2013版MFC按钮为灰色

    在vs2013MFC编程中,相信多半人使用的是破解版的软件,各种问题不断,其中大家可能会遇到程序运行界面的按钮为灰色.根据笔者的经验,对于这个问题多半是由于该按钮底层的属性值错误.下面笔者举个例子对于 ...

  6. Web html5 app ,桌面,Webtop Html5 桌面App开发 -- 整合人人网登陆

    Webtop 既然是用html+css+js来开发桌面APP,那么在做一些娱乐社交应用的时候,去整合一些开放平台的时候也是十分方便的.我们直接可以使用jQuery的ajax来和开放平台交互就可以. 昨 ...

  7. PHPcms 把盛大登陆换成人人网登陆

    首先要确保你的 phpcms是比较新的版本, v9.3以后的吧 这里说明一个函数 rawurlencode() 本函数将字符串编码成 URL 的字符串专用格式,特殊的字符会转换成百分比符号后面加上二个 ...

  8. 利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版

    2019独角兽企业重金招聘Python工程师标准>>> 这个方法最开始用在还没有"微信开放平台"的时候,现在也有不少网站在用,简单说就是生成一个临时二维码放到服务 ...

  9. python爬虫人人网登陆

    Day1:人人网登录第一种方式 #导入模块 from urllib import request,parse from http import cookiejar #保存cookie,实例化cooki ...

最新文章

  1. C# 开启及停止进程
  2. 使用PixelLib来实现图像分割
  3. 牛客华为机试第1题python
  4. 不用临时变量,交换两个变量的值
  5. microsoft word中在公式后插入可交叉引用的公式编号
  6. 【bzoj3442】学习小组 费用流
  7. html js 浏览器语言,js 判断浏览器语言的方法
  8. java中随机数彩票练习_基于javascript实现彩票随机数生成(简单版)
  9. sqlserver字符串分割
  10. 胡祖六回应“低价转让蚂蚁股权”一事:有误会 之后择时澄清
  11. HTTP之Range
  12. 全网通小区专家全自动做
  13. Kali安装AWVS
  14. 山峰Mac动态桌面壁纸
  15. ps cc 生成html,Photoshop自定义工具扩展面板(支持PS CC 2019)
  16. 约束优化方法_2_——Frank-Wolfe方法
  17. 神舟Z8-SP7D1驱动安装
  18. 程序读写时间内存 硬盘 cache 访问速度数级对比
  19. 找出符合要求的字符串子串
  20. 白平衡,及白平衡调节过程

热门文章

  1. 主次干道红绿灯设计(数电综设)
  2. 免费舆情监控工具有哪些,TOOM加强舆情监控提高应对能力
  3. 晶振能提供高速时钟,你知道其工作原理吗?
  4. 白鲸影视大全android版,白鲸影视app最新版本
  5. python课堂笔记手抄图片报_读书报手抄报图片大全
  6. 可靠信号与不可靠信号
  7. IDEA中打jar包的两种方式
  8. 小程序开发时openid和unionid
  9. 数十倍的数据量增长,传统 OLAP 还能应对吗?
  10. X210刷机经验总结