/**************************************************************************** ** ** Copyright (C) 2013 Jeffrey Lee. ** All rights reserved. ** Contact: vipjeffreylee@gmail.com ** Please keep the author contact information. ** 2013-10-10 ** ****************************************************************************/ #include "webqqnet.h" #include "webqq.h" #include #include #include #include #include #include WebQQNet::WebQQNet(QObject *parent) : QObject(parent) { pCookieJar=new QNetworkCookieJar(this); http=new QNetworkAccessManager(this); httpPoll=new QNetworkAccessManager(this); httpExtInfo=new QNetworkAccessManager(this); http->setCookieJar(pCookieJar); httpPoll->setCookieJar(pCookieJar); httpExtInfo->setCookieJar(pCookieJar); connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpFinished(QNetworkReply*))); connect(httpPoll,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpPollFinished(QNetworkReply*))); connect(httpExtInfo,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpExtInfoFinished(QNetworkReply*))); QTime time; time= QTime::currentTime(); qsrand(time.msec()+time.second()*1000); clientid=QString::number(qrand()); msgId=(qrand()%1000)*10000+1; timer=new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(sendMsg())); //qDebug()<<"msgId="<post(request,postData); } void WebQQNet::httpPollFinished(QNetworkReply* reply){ QByteArray replyData=reply->readAll(); reply->deleteLater(); QString replystr=QString::fromUtf8(replyData); QJsonDocument jsonDoc; QJsonObject jsonObj; QJsonArray jsonArray; int retcode=0; jsonDoc=QJsonDocument::fromJson(replyData); qDebug()<<"httpPollFinished jsonDoc="<type=1;//ÏØãáãÓ //send_uinÏØ??åëíºTXUIN£¨÷×ãö?£© msg->send_uin=QString::number(jsonObj.value("send_uin").toDouble(),'f',0); //from_uinÏØTXUIN£¨ÏØá¼ãÓ£©ûäíºû¿éÒTXUIN£¨ÞçÖý?£© msg->from_uin=QString::number(jsonObj.value("from_uin").toDouble(),'f',0); }else if(jsonObj.value("poll_type").toString()==QString("message")){ jsonObj=jsonObj.value("value").toObject(); msg->type=0;//û¿éÒãáãÓ //from_uinÏØTXUIN£¨ÏØá¼ãÓ£©ûäíºû¿éÒTXUIN£¨ÞçÖý?£© msg->from_uin=QString::number(jsonObj.value("from_uin").toDouble(),'f',0); }else{ delete msg; break; } msg->time=jsonObj.value("time").toDouble(); jsonArray=jsonObj.value("content").toArray(); for(int i=1;icontent+=jsonArray.at(i).toString(); }else if(jsonArray.at(i).isArray()){ msg->content+="[?ø¸]"; } } WebQQ::qqmsgs.append(msg); qDebug()<type<from_uin<time<time)<content<code; QNetworkRequest request; QString urlstr=QString("http://s.web2.qq.com/api/get_group_info_ext2?gcode=%1&cb=undefined&vfwebqq=%2&t=%3").arg(groupCode).arg(vfwebqq).arg(QDateTime::currentMSecsSinceEpoch()); request.setUrl(QUrl(urlstr)); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","utf-8"); request.setRawHeader("Host","s.web2.qq.com"); request.setRawHeader("Origin","http://d.web2.qq.com"); request.setRawHeader("Referer","http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=3"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); qDebug()<<"getGroupMemberInfo"<get(request); } void WebQQNet::httpExtInfoFinished(QNetworkReply* reply){ qDebug()<<"httpPollFinished"<readAll(); // replyData.replace("\xe2\x80\xae","");//í®Ý¬ÍúñéøÐùß???í®Ý¬£¬?ذ٣ÐìÙØîÜÚã??ãÆ£¬ÞªßÈÐô÷壡 // replyData.replace("\xe2\x80\xa8","");//?öÈüÞ??ú¼ //ë¦éÍêóÞÁÏØà÷?Ù£ø¸ãÀÞªÛöutf-8í®Ý¬£¬?öÈjson?Ëßú°à°??ñþû¿í»ÐùÞÅéÄreplystr.toUtf8()î¢?ìéó­ reply->deleteLater(); QString replystr=QString::fromUtf8(replyData); QQgroup*pGroup=WebQQ::qqGroups.value(currGroupTXUIN,nullptr); if(pGroup==nullptr){ qDebug()<<"httpExtInfoFinished ?Ùéó®ÏØ£¡"<txuin=QString::number(jo.value("uin").toDouble(),'f',0); f->nick=jo.value("nick").toString(); pGroup->members.insert(f->txuin,f); } jsonArray=jsonObj.value("cards").toArray(); foreach(QJsonValue jv,jsonArray){ QJsonObject jo=jv.toObject(); QString txuin=QString::number(jo.value("muin").toDouble(),'f',0);; QQfriend* f=pGroup->members.value(txuin,nullptr); if(f==nullptr) f=new QQfriend(); f->txuin=txuin; f->markname=jo.value("card").toString(); pGroup->members.insert(f->txuin,f); } }else{//êó?ý¦Ú÷üÞ {"retcode":100000}£¬ÔðÜôÓðà÷?ãáãÓ pGroup->members.insert("0",new QQfriend); } }else{ qDebug()<<"httpExtInfoFinished failure"<name) .arg(WebQQ::qqGroups.value(currGroupTXUIN)->members.size())); emit msgReceived(); currGroupTXUIN.clear(); qDebug()<<"httpExtInfoFinished /////////////////////////////////////////////////////////////////////////////"<pollMsg(); } void WebQQNet::httpFinished(QNetworkReply* reply){ QByteArray replyData=reply->readAll(); reply->deleteLater(); QString replystr=QString::fromUtf8(replyData); QJsonDocument jsonDoc; QJsonObject jsonObj; QJsonArray jsonArray; bool isok; switch(httpAction){ case HttpAction::NoAction: break; case HttpAction::CheckVerirycodeAction: if(replystr.indexOf("'0'")>-1){ emit checkVerifycodeFinished(true,replystr.mid(18,4)); httpAction=HttpAction::NoAction; }else{ emit checkVerifycodeFinished(false,""); } replystr.chop(3); uinhexstr=replystr.right(32).remove("\\x"); qDebug()<header(QNetworkRequest::ContentTypeHeader).toString(); emit getVerifyImgFinished(replyData); httpAction=HttpAction::NoAction; break; case HttpAction::LoginAction: qDebug()<-1){ ptwebqq=getCookie("ptwebqq"); qDebug()<<"get cookie ptwebqq="<getUserFriends(); } } //qDebug()<cookieJar()->cookiesForUrl(QUrl("http://www.qq.com/")); break; case HttpAction::GetFriendInfoAction: qDebug()<txuin=QString::number(jsonArray.at(i).toObject().value("uin").toDouble(),'f',0); f->markname=jsonArray.at(i).toObject().value("markname").toString(); WebQQ::qqFriends.insert(f->txuin,f); } jsonArray=jsonObj.value("info").toArray(); for(int i=0;itxuin=txuin; f->nick=jsonArray.at(i).toObject().value("nick").toString(); WebQQ::qqFriends.insert(f->txuin,f); QStandardItem *item=new QStandardItem(); item->setText(f->markname.isEmpty()?f->nick:QString("%1(%2)").arg(f->nick).arg(f->markname)); item->setData("FTX"+f->txuin,Qt::UserRole); WebQQ::qqFriendListModel->appendRow(item); } } emit sysMsg("èÇà÷û¿éÒãáãÓù»?£¡"); }else{ emit sysMsg("û¿éÒãáãÓù»?ã÷?£¡"); } this->getGroupNameList(); qDebug()<name=jsonObj.value("name").toString(); g->txuin=QString::number(jsonObj.value("gid").toDouble(),'f',0); g->code=QString::number(jsonObj.value("code").toDouble(),'f',0); WebQQ::qqGroups.insert(g->txuin,g); qDebug()<txuin<name<setText(g->name); item->setData("GTX"+g->txuin,Qt::UserRole); WebQQ::qqGroupListModel->appendRow(item); } } emit sysMsg("èÇà÷ÏØãáãÓù»?£¡?ã·ïÈâ¥Öýô¸ãáãÓ......"); }else{ emit sysMsg("ÏØãáãÓù»?ã÷?£¡??ïÈâ¥Öýô¸ãáãÓ......"); } this->pollMsg(); httpAction=HttpAction::NoAction; break; case HttpAction::SendBuddyMsgAction: //{"retcode":0,"result":"ok"} isok=false; jsonDoc=QJsonDocument::fromJson(replyData); if(jsonDoc.isObject()){ jsonObj=jsonDoc.object(); if(jsonObj.value("retcode").toDouble()==0){ isok=true; } } emit sendMsgFinished(currSendMsg.first,currSendMsg.second,isok); qDebug()<<"SendBuddyMsgAction"<quit(); }else{ WebQQ::status=QQstatus::offline; emit sysMsg("??ì«?ñ¼?Ôô?¡£"); } qDebug()<<"LoginOutAction"<error()<cookieJar()->cookiesForUrl(QUrl("http://www.qq.com/")); reply->deleteLater(); } void WebQQNet::checkVerifyCode(QString qqnum){ QNetworkRequest request; request.setUrl(QUrl(QString("http://check.ptlogin2.qq.com/check?uin=%1&appid=1003903&js_ver=10041").arg(qqnum))); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","check.ptlogin2.qq.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); httpAction=HttpAction::CheckVerirycodeAction; http->get(request); } void WebQQNet::getVerifyImg(QString qqnum){ QNetworkRequest request; request.setUrl(QUrl(QString("http://captcha.qq.com/getimage?aid=1003903&uin=%1").arg(qqnum))); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); //request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","captcha.qq.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); httpAction=HttpAction::GetVerifyImgAction; http->get(request); } void WebQQNet::login(QString qqnum,QString qqpass, QString verifyCode){ qDebug()<get(request); } void WebQQNet::check_sig(QString urlstr){ urlstr=urlstr.mid(16); urlstr=urlstr.left(urlstr.indexOf('\'')); //qDebug()<get(request); } void WebQQNet::login2(){ QNetworkRequest request; request.setUrl(QUrl("http://d.web2.qq.com/channel/login2")); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); request.setRawHeader("Host","d.web2.qq.com"); request.setRawHeader("Origin","http://d.web2.qq.com"); request.setRawHeader("Referer","http://d.web2.qq.com/proxy.html?v=20110331002&callback=2"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); QByteArray postData; postData.append("r="+QUrl::toPercentEncoding(QString("{\"status\":\"online\",\"ptwebqq\":\"%1\",\"passwd_sig\":\"\",\"clientid\":\"%2\",\"psessionid\":null}").arg(ptwebqq).arg(clientid))); postData.append(QString("&clientid=%1&psessionid=null").arg(clientid)); request.setHeader(QNetworkRequest::ContentLengthHeader,postData.size()); httpAction=HttpAction::Login2Action; qDebug()<post(request,postData); } void WebQQNet::loginout(){ emit sysMsg("ïáî¤ñ¼?Ôô?ãáãÓ..........."); QNetworkRequest request; QString urlstr=QString("http://d.web2.qq.com/channel/change_status2?newstatus=offline&clientid=%1&psessionid=%2&t=%3").arg(clientid).arg(psessionid).arg(QDateTime::currentMSecsSinceEpoch()); request.setUrl(QUrl(urlstr)); // qDebug()<get(request); } void WebQQNet::getFriendInfo(QString qqnum){ QNetworkRequest request; QString urlstr=QString("http://s.web2.qq.com/api/get_friend_info2?tuin=%1&verifysession=&code=&vfwebqq=%2&t=1377829770859").arg(qqnum).arg(vfwebqq); request.setUrl(QUrl(urlstr)); // qDebug()<get(request); } void WebQQNet::getUserFriends(){ emit sysMsg("?ö¢û¿éÒãáãÓ..........."); QNetworkRequest request; request.setUrl(QUrl("http://s.web2.qq.com/api/get_user_friends2")); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); request.setRawHeader("Host","s.web2.qq.com"); request.setRawHeader("Origin","http://s.web2.qq.com"); request.setRawHeader("Referer","http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=3"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); QByteArray postData; postData.append("r="+QUrl::toPercentEncoding(QString("{\"h\":\"hello\",\"hash\":\"%1\",\"vfwebqq\":\"%2\"}").arg(getHash(uin,ptwebqq)).arg(vfwebqq))); request.setHeader(QNetworkRequest::ContentLengthHeader,postData.size()); httpAction=HttpAction::GetUserFriendsAction; qDebug()<post(request,postData); } void WebQQNet::getGroupNameList(){ emit sysMsg("?ö¢ÏØãáãÓ..........."); QNetworkRequest request; request.setUrl(QUrl("http://s.web2.qq.com/api/get_group_name_list_mask2")); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); request.setRawHeader("Host","s.web2.qq.com"); request.setRawHeader("Origin","http://s.web2.qq.com"); request.setRawHeader("Referer","http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=3"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); QByteArray postData; postData.append("r="+QUrl::toPercentEncoding(QString("{\"vfwebqq\":\"%1\"}").arg(vfwebqq))); request.setHeader(QNetworkRequest::ContentLengthHeader,postData.size()); httpAction=HttpAction::GetGroupNameListAction; qDebug()<post(request,postData); } void WebQQNet::sendMsg(QString txuin, QString msg){ if(httpAction==HttpAction::NoAction){ QString txuinflag=txuin.left(3); currSendMsg.first=txuin; currSendMsg.second=msg; //?json ÷åâ¨í®Ý¬?ú¼ôð? qDebug()<<"?json ÷åâ¨í®Ý¬?ú¼ôð?__îñ"<sendBuddyMsg(txuin.mid(3),msg); }else if(txuinflag=="GTX"){ WebQQ::webQQNet->sendGroupMsg(txuin.mid(3),msg); } }else{ sendMsgList.append(QPair(txuin,msg)); if(!timer->isActive()){ timer->start(1000); } } } void WebQQNet::sendMsg(){ if(sendMsgList.isEmpty()){ timer->stop(); return; } if(httpAction==HttpAction::NoAction){ currSendMsg=sendMsgList.takeLast(); sendMsg(currSendMsg.first,currSendMsg.second); } } void WebQQNet::sendBuddyMsg(QString uin, QString msg){ QNetworkRequest request; request.setUrl(QUrl("http://d.web2.qq.com/channel/send_buddy_msg2")); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); request.setRawHeader("Host","d.web2.qq.com"); request.setRawHeader("Origin","http://d.web2.qq.com"); request.setRawHeader("Referer","http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=2"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); QByteArray postData; QString tmpdata=QString("{\"to\":%1,\"face\":492,\"content\":\"[\\\"%2\\\",\\\"\\\",[\\\"font\\\",{\\\"name\\\":\\\"áä?\\\",\\\"size\\\":\\\"9\\\",\\\"style\\\":[0,0,0],\\\"color\\\":\\\"FF0000\\\"}]]\",\"msg_id\":%3,\"clientid\":\"%4\",\"psessionid\":\"%5\"}").arg(uin).arg(msg).arg(msgId++).arg(clientid).arg(psessionid); qDebug()<post(request,postData); } void WebQQNet::sendGroupMsg(QString groupuin, QString msg){ QNetworkRequest request; request.setUrl(QUrl("http://d.web2.qq.com/channel/send_qun_msg2")); request.setRawHeader("Accept","*/*"); request.setRawHeader("Accept-Encoding","gzip,deflate,sdch"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); request.setRawHeader("Host","d.web2.qq.com"); request.setRawHeader("Origin","http://d.web2.qq.com"); request.setRawHeader("Referer","http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=3"); request.setRawHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"); QByteArray postData; QString tmpdata=QString("{\"group_uin\":%1,\"content\":\"[\\\"%2\\\",\\\"\\\",[\\\"font\\\",{\\\"name\\\":\\\"áä?\\\",\\\"size\\\":\\\"9\\\",\\\"style\\\":[0,0,0],\\\"color\\\":\\\"FF0000\\\"}]]\",\"msg_id\":%3,\"clientid\":\"%4\",\"psessionid\":\"%5\"}").arg(groupuin).arg(msg).arg(msgId++).arg(clientid).arg(psessionid); qDebug()<post(request,postData); } QString WebQQNet::getP(QString qqpass, QString verifyCode, QString uinhexstr){ QByteArray qqpassbyte=QCryptographicHash::hash(qqpass.toLatin1(),QCryptographicHash::Md5); QByteArray uinhexbyte = QByteArray::fromHex(uinhexstr.toLatin1()); qDebug()<<"uinhexbyte="<cookieJar()->cookiesForUrl(QUrl("http://www.qq.com/"))){ // qDebug()< r; r.append(uin>> 24 &255);r.append(uin>> 16 &255);r.append(uin>> 8 &255); r.append(uin&255); QVectorja; for(int e=0;e > e; for(e.push_back(QPair(0,ja.size()-1));e.size()>0;){ QPairc=e.takeLast(); if(!(c.first>=c.second||c.first<0||c.second>=ja.size())){ if(c.first+1==c.second){ if(ja[c.first]>ja[c.second]){ int l=ja[c.first]; ja[c.first]=ja[c.second]; ja[c.second]=l; } }else{ int l,J,f; for(l=c.first,J=c.second, f=ja[c.first];c.first=f;){ c.second--,r[0]=r[0]+(3&255); } (c.first(l,c.first-1)); e.push_back(QPair(c.first+1,J)); } } } char j[]="0123456789ABCDEF"; QString hash; for(int c=0;c>4&15]),hash.append(j[r[c]&15]); } return hash; } /* * ??ÓÛ??Ù¥: ptuiCB('7','0','','0','??Êð£¬???ïÈõó??ßÈ£¬??õªý¨î¢?¡£(612369104)'); cookieûäqq???? ptuiCB('0','0','http://aq.qq.com/cn/services/abnormal/abnormal_index? ¡£¡£¡£¡£¡£¡££¡'); ???? {"retcode":102 ,"errmsg":""} ïáßÈ?ïÈ¡¢?êóá¼ãÓ¡£ {"retcode":103,"errmsg":""} Óü? {"retcode":108,"errmsg":""} {"retcode":114,"errmsg":""} {"retcode":121,"t":"0"} Óü? {"retcode":122,"errmsg":"wrong web client3"} {"retcode":100001} ÏØ??êó?? {"retcode":100006,"errmsg":""} * * */