青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0

在S1死程群@kula的鼓勵下,我開始使用kula提供的api來操作那個傻逼的“鳥窩”網站(https://www.niaowo.me)。不過由于我自己在業余時間寫的程序都喜歡用C++和Windows API,因此我琢磨了幾天,真的讓我用C++給寫了出來。

我寫了一個HttpUtility庫來實現C++操作http/https服務的功能,這份代碼可以在這里獲得:

HttpUtility.h:http://gac.codeplex.com/SourceControl/changeset/view/95641#2295555
HttpUtility.cpp:http://gac.codeplex.com/SourceControl/changeset/view/95641#2295554

使用的時候很簡單,只需要HttpRequest里面填滿了參數,然后就可以用HttpQuery參數獲得一個HttpResponse類型,這個類型里面寫滿了http服務器的返回值、返回內容和cookie等的數據。譬如說用來post來登陸鳥窩,然后拿到cookie之后查詢首頁的所有帖子,大概就可以這么寫:

WString NestleGetSession(const WString& username, const WString& password, const WString& apiKey, const WString& apiSecret)
{
    WString body=L"api_key="+apiKey+L"&api_secret="+apiSecret+L"&username="+username+L"&password="+password;

    HttpRequest request;
    HttpResponse response;

    request.SetHost(L"https://www.niaowo.me/account/token/");
    request.method=L"POST";
    request.contentType=L"application/x-www-form-urlencoded";
    request.SetBodyUtf8(body);
    HttpQuery(request, response);

    if(response.statusCode==200)
    {
        return response.cookie;
    }
    else
    {
        return L"";
    }
}

WString NestleGetXml(const WString& path, const WString& cookie)
{
    HttpRequest request;
    HttpResponse response;

    request.SetHost(L"https://www.niaowo.me"+path+L".xml");
    request.method=L"GET";
    request.cookie=cookie;
    request.acceptTypes.Add(L"application/xml");
    HttpQuery(request, response);
   

    if(response.statusCode==200)
    {
        return response.GetBodyUtf8();
    }
    else
    {
        return L"";
    }
}

于是我們終于獲得了一個保存在vl::WString的xml字符串了,那怎么辦呢?這個時候需要出動IXMLDOMDocument2來解析我們的xml。只要裝了IE的計算機上都是有IXMLDOMDocument2的,而不裝IE的Windows PC是不存在的,因此我們總是可以大膽的使用。當然,用IXMLDOMDocument直接來遍歷什么東西特別的慢,所以我們需要的是xpath。xpath對于xml就跟regex對于字符串一樣,可以直接查詢出我們要的東西。首先看一下如何操作IXMLDOMDocument2接口:

IXMLDOMNodeList* XmlQuery(IXMLDOMNode* pDom, const WString& xpath)
{
    IXMLDOMNodeList* nodes=0;
    BSTR xmlQuery=SysAllocString(xpath.Buffer());
    if(xmlQuery)
    {
        HRESULT hr=pDom->selectNodes(xmlQuery, &nodes);
        if(FAILED(hr))
        {
            nodes=0;
        }
        SysFreeString(xmlQuery);
    }
    return nodes;
}

WString XmlReadString(IXMLDOMNode* node)
{
    WString result;
    BSTR text=0;
    HRESULT hr=node->get_text(&text);
    if(SUCCEEDED(hr))
    {
        const wchar_t* candidateItem=text;
        result=candidateItem;
        SysFreeString(text);
    }
    return result;
}

void XmlReadMultipleStrings(IXMLDOMNodeList* textNodes, List<WString>& candidates, int max)
{
    candidates.Clear();
    while((int)candidates.Count()<max)
    {
        IXMLDOMNode* textNode=0;
        HRESULT hr=textNodes->nextNode(&textNode);
        if(hr==S_OK)
        {
            candidates.Add(XmlReadString(textNode));
            textNode->Release();
        }
        else
        {
            break;
        }
    }
}

IXMLDOMDocument2* XmlLoad(const WString& content)
{
    IXMLDOMDocument2* pDom=0;
    HRESULT hr=CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDom));
    if(SUCCEEDED(hr))
    {
        pDom->put_async(VARIANT_FALSE);
        pDom->put_validateOnParse(VARIANT_FALSE);
        pDom->put_resolveExternals(VARIANT_FALSE);

        BSTR xmlContent=SysAllocString(content.Buffer());
        if(xmlContent)
        {
            VARIANT_BOOL isSuccessful=0;
            hr=pDom->loadXML(xmlContent, &isSuccessful);
            if(!(SUCCEEDED(hr) && isSuccessful==VARIANT_TRUE))
            {
                pDom->Release();
                pDom=0;
            }
            SysFreeString(xmlContent);
        }
    }
    return pDom;
}

有了這幾個函數之后,我們就可以干下面的事情,譬如說從鳥窩首頁下載第一頁的所有topic的標題:

WString xml=NestleGetXml(L”/topics”, cookie);
IXMLDOMDocument2* pDom=XmlLoad(xml);
List<WString> titles;
IXMLNodeList* nodes=XmlQuery(pDom, L”/hash/topics/topic/title/text()”);
XmlReadMultipleStrings(nodes, titles, 100);

為什么上面的xpath是hash/topics/topic/title/text()呢?因為這個xml的內容大概類似于:
<hash>
    <topics>
        <topic>
            <title>TITLE</title>

剩下的大家就去看代碼吧。這個故事告訴我們,只要有一個合適的封裝,C++寫起這些本來應該讓C#來寫的東西也不是那么的煩人的,啊哈哈哈哈。

posted on 2012-10-26 23:19 陳梓瀚(vczh) 閱讀(3926) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 使用C++和Windows API操作基于http協議的xml service 2012-10-27 05:50 | huliang
牛逼~~ 一開始還真看成是C#的 HttpResponse 了  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉久久国产| 国产精品成人午夜| 亚洲美女av黄| 亚洲人成在线观看网站高清| 久久先锋影音av| 美女视频网站黄色亚洲| 欧美高清成人| 亚洲精品综合| 亚洲免费影视| 久热精品视频在线观看一区| 老色鬼久久亚洲一区二区| 另类激情亚洲| 欧美日韩一区二区视频在线| 国产精品日日摸夜夜添夜夜av| 国产一区香蕉久久| 日韩系列欧美系列| 欧美日韩免费观看一区二区三区| 欧美精品久久天天躁| 欧美视频官网| 精品av久久久久电影| 99热这里只有精品8| 久久gogo国模裸体人体| 欧美高清视频一区二区三区在线观看 | 欧美成人网在线| 欧美日韩在线三区| 极品日韩久久| 亚洲免费一级电影| 亚洲电影免费观看高清完整版| 亚洲视频在线观看| 狼人天天伊人久久| 国产日韩欧美在线播放| av成人免费在线| 美女国产一区| 久久激情久久| 国产欧美日韩视频| 亚洲尤物精选| 亚洲精品永久免费| 美乳少妇欧美精品| 激情综合自拍| 久久亚洲图片| 久久精品国产欧美亚洲人人爽| 国产精品hd| 中日韩美女免费视频网址在线观看 | 久久国产精品亚洲77777| 亚洲激情视频在线| 久久免费偷拍视频| 国产亚洲永久域名| 欧美在线免费视频| 性做久久久久久久久| 欧美亚州韩日在线看免费版国语版| 亚洲精品色图| 最近中文字幕mv在线一区二区三区四区| 久久精品国产一区二区三| 国产一区二区久久| 久久精品国产亚洲a| 亚洲在线观看| 国产欧美在线播放| 久久精品视频一| 久久av资源网站| 狠狠爱综合网| 欧美电影免费网站| 美日韩精品视频| 亚洲美女视频在线观看| 亚洲精品网站在线播放gif| 欧美高清在线视频观看不卡| 最新69国产成人精品视频免费| 欧美激情1区2区3区| 欧美激情亚洲激情| 亚洲视频在线观看网站| 亚洲香蕉网站| 亚洲乱码精品一二三四区日韩在线| 裸体女人亚洲精品一区| 亚洲精品1区2区| 亚洲日本中文字幕| 国产精品国产三级国产aⅴ无密码| 亚洲欧美日韩一区二区三区在线观看 | 欧美日韩亚洲另类| 亚洲视频在线看| 午夜视频精品| 亚洲精品日韩欧美| 亚洲天堂成人在线视频| 国产揄拍国内精品对白| 欧美成人免费va影院高清| 欧美精品免费播放| 校园春色综合网| 老巨人导航500精品| 亚洲图片欧洲图片日韩av| 亚洲免费视频中文字幕| 黄色成人精品网站| 亚洲精品乱码久久久久久| 国产精品亚发布| 欧美激情一二三区| 国产精品日韩欧美一区二区| 久久在精品线影院精品国产| 欧美成人日本| 久久精品日韩欧美| 欧美精选午夜久久久乱码6080| 欧美一区91| 免费影视亚洲| 久久国产加勒比精品无码| 农村妇女精品| 久久精品欧美日韩精品| 欧美日韩国产成人| 久久免费国产| 欧美午夜电影在线| 欧美二区不卡| 国产亚洲在线| 亚洲一区二区三区乱码aⅴ| 91久久国产精品91久久性色| 亚洲欧美日韩精品在线| 一区二区久久久久| 美女视频黄免费的久久| 久久精品国亚洲| 国产精品激情偷乱一区二区∴| 欧美黄色成人网| 激情六月综合| 欧美一级视频一区二区| 亚洲永久精品大片| 欧美精品色一区二区三区| 美乳少妇欧美精品| 国产色视频一区| 亚洲欧美久久久久一区二区三区| 日韩视频精品在线观看| 久久一二三四| 免费日韩成人| 在线日韩精品视频| 久久尤物电影视频在线观看| 欧美影院午夜播放| 国产欧美一区二区三区久久人妖 | 久久野战av| 国产视频一区免费看| 午夜欧美视频| 国产精品乱码久久久久久| 99精品视频免费观看视频| 亚洲精品综合| 欧美日本国产| 亚洲靠逼com| 一本一道久久综合狠狠老精东影业| 老司机精品视频一区二区三区| 久久久视频精品| 极品裸体白嫩激情啪啪国产精品 | 欧美特黄a级高清免费大片a级| 亚洲国产精品精华液网站| 亚洲电影免费观看高清完整版在线观看 | 一区二区三区在线视频免费观看| 欧美一级视频免费在线观看| 久久久久一区二区三区| 黄色成人小视频| 母乳一区在线观看| 亚洲人成网在线播放| 在线视频日韩| 国产精品视频导航| 欧美在线关看| 亚洲电影免费在线观看| 一区二区三区精密机械公司| 国产精品xxxxx| 欧美中文日韩| 亚洲第一区色| 亚洲欧美日韩久久精品| 国内精品久久久久久久97牛牛| 久久视频一区二区| 日韩视频二区| 久久久久久久久伊人| 亚洲黄色尤物视频| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲伊人伊色伊影伊综合网| 久久久久久久一区二区三区| 91久久综合| 国产精品视频一二三| 久久精品综合网| 日韩视频免费| 久久综合九色99| 99综合精品| 一区二区三区在线免费视频| 欧美国产日韩一区二区三区| 亚洲一区二区黄| 亚洲高清在线视频| 久久精品国产69国产精品亚洲| 亚洲人成亚洲人成在线观看图片| 国产精品久久久久免费a∨| 久久免费高清| 亚洲一二三区在线观看| 亚洲福利一区| 久久久久国产精品厨房| 一区二区三区精密机械公司 | 亚洲一区二区3| 在线播放亚洲| 国产精品青草久久| 欧美久久久久免费| 久久精品国产99国产精品澳门| 日韩午夜电影在线观看| 久久在线免费视频| 国产视频一区二区在线观看| 欧美va天堂| 久久国产综合精品| 亚洲女爱视频在线| 一区二区三区福利| 亚洲精品少妇30p| 亚洲福利专区| 欧美国产日本|