获取指定QQ空间标题

来源:互联网 发布:centos如何启用双网卡 编辑:程序博客网 时间:2024/05/21 07:04

我没有处理中文乱码,留给需要的人处理吧,只要转换一下编码就可以了。。。

调用代码:

#include "stdafx.h"#include "SocketHttp.h"int _tmain(int argc, _TCHAR* argv[]){    CSocketHttp skHttp;    string strWebTitle = skHttp.GetQzoneUserTitle("20156666");    printf("获取到标题:\n");    printf("%s", strWebTitle.c_str());    getchar();return 0;}

SocketHttp.h文件:

#pragma once#include <Winsock2.h>#pragma comment(lib, "Ws2_32.lib")#include <string>using std::string;class CSocketHttp{public:    CSocketHttp(void);    ~CSocketHttp(void);    bool InitSocket(void);      // 初始化socket环境       void UnInitSocket(void);    // 清理socket环境    string GetQzoneUserTitle(string strQQ); // 获取QQ空间标题public:    bool m_bIsInitSocketOk; // 标志socket是否初始化成功};

SocketHttp.cpp

#include "StdAfx.h"#include "SocketHttp.h"CSocketHttp::CSocketHttp(void){    m_bIsInitSocketOk = InitSocket();}CSocketHttp::~CSocketHttp(void){    UnInitSocket();}/**@Name:  InitSocket@Brief: 初始化socket环境@Param: void@Return:bool*/bool CSocketHttp::InitSocket( void ){    WSADATA data = {0};    if(WSAStartup(MAKEWORD(2, 2), &data))    {        return false;    }    if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2)    {        WSACleanup();        return false;    }    return true;}/**@Name:  UnInitSocket@Brief: 清理socket环境@Param: void@Return:void*/void CSocketHttp::UnInitSocket( void ){    WSACleanup();}/**@Name:  GetWebTitle@Brief: 获取指定QQ空间标题@Param: string strQQ, QQ号码@Return:成功返回空间标题,失败返回长度为0的字符窜*/string CSocketHttp::GetQzoneUserTitle(string strQQ){    string strWebTitle;    if (strQQ.length() <= 0 || !m_bIsInitSocketOk)    {        return strWebTitle;    }    struct hostent *pHost = gethostbyname("user.qzone.qq.com");    if (pHost == NULL)    {        return strWebTitle;    }    SOCKET skServer = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);    if (skServer == INVALID_SOCKET )    {        return strWebTitle;    }    sockaddr_in serverAddr;    serverAddr.sin_family = AF_INET;    serverAddr.sin_port = htons(80);    serverAddr.sin_addr.s_addr = *(DWORD*)pHost->h_addr_list[0];    int iRet = connect(skServer, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr));    if (iRet == SOCKET_ERROR)     {       return strWebTitle;    }    // 发送HTTP协议数据    // GET http://user.qzone.qq.com/QQNumber/main HTTP/1.1    // Host: user.qzone.qq.com    // Connection: keep-alive    // Cache-Control: max-age=0    // Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    // User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)     string strSend;    strSend += "GET http://user.qzone.qq.com/QQNumber/main HTTP/1.1\r\n";    strSend += "Host: user.qzone.qq.com\r\n";    strSend += "Connection: keep-alive\r\n";    strSend += "Cache-Control: max-age=0\r\n";    strSend += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";    strSend += "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)\r\n\r\n";    strSend.replace(strSend.find("QQNumber"), 8, strQQ);    iRet = send(skServer, strSend.c_str(), strSend.length(), 0);    if (iRet == SOCKET_ERROR)    {        return strWebTitle;    }    // 获取服务器返回的数据    char szBuf[1024*5] = {0};    iRet = recv(skServer, szBuf, sizeof(szBuf), 0);    if (iRet == SOCKET_ERROR)    {        return strWebTitle;    }    // 解析网页标题    // <title>xxx</title>    strWebTitle = string(szBuf);    size_t siPosStart = 0;    size_t siPosEnd = 0;    siPosStart = strWebTitle.find("<title>");    if (siPosStart != string::npos)    {        strWebTitle.erase(0, siPosStart + 7);    }    siPosEnd = strWebTitle.find("</title>");    if (siPosEnd != string::npos)    {        strWebTitle.erase(siPosEnd - 1);    }    if (siPosEnd == string::npos)    {        return "";    }    return strWebTitle;}

效果截图:








0 0