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

隨筆-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) 閱讀(3917) 評論(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>
            亚洲激情一区二区| 亚洲精品国产视频| 欧美在线视频免费观看| 中文精品视频| 国产九九精品视频| 久久深夜福利免费观看| 久久久久一区二区三区| 91久久久久久久久| 日韩午夜中文字幕| 国产一区二区三区在线播放免费观看| 久久精品欧美日韩| 裸体丰满少妇做受久久99精品| 亚洲欧洲偷拍精品| 在线亚洲国产精品网站| 国产欧美一区二区精品秋霞影院| 久久久久久久久久看片| 蜜桃久久av一区| 亚洲曰本av电影| 欧美制服第一页| 亚洲精品一二| 午夜精品久久久久久久99樱桃| 韩国视频理论视频久久| 亚洲精品资源| 国产一区二区三区电影在线观看| 亚洲承认在线| 国产婷婷色一区二区三区在线 | 国产精品永久免费观看| 久久乐国产精品| 欧美久久视频| 久久中文久久字幕| 国产精品福利影院| 欧美激情第二页| 国产精品一区二区黑丝| 最新国产拍偷乱拍精品| 韩国av一区二区| 亚洲午夜日本在线观看| 亚洲日本久久| 久久深夜福利免费观看| 欧美亚洲日本网站| 欧美日韩亚洲在线| 欧美电影免费网站| 国精品一区二区| 亚洲专区在线| 亚洲无亚洲人成网站77777 | 99视频+国产日韩欧美| 国产综合久久久久久| 亚洲一区二区三区视频| av成人老司机| 欧美承认网站| 欧美激情按摩| 亚洲国产天堂久久国产91| 欧美在线电影| 久久精品系列| 国产婷婷色一区二区三区四区| 一区二区三区 在线观看视| 亚洲韩国一区二区三区| 久久亚洲一区| 欧美国产在线电影| 在线观看国产一区二区| 久久精品国产精品亚洲精品| 欧美在线视频全部完| 国产精品你懂的| 亚洲专区一区| 久久深夜福利| 欧美日韩精品二区第二页| 狠狠爱成人网| 久久九九国产精品怡红院| 久久久亚洲午夜电影| 国内揄拍国内精品少妇国语| 欧美资源在线观看| 美女视频黄 久久| 亚洲大片在线| 欧美人与禽猛交乱配| 亚洲精品久久久蜜桃| 亚洲婷婷综合色高清在线| 国产精品国产自产拍高清av| 亚洲尤物在线| 久久永久免费| 亚洲国产日韩精品| 欧美日韩日本国产亚洲在线| 亚洲午夜久久久久久久久电影院| 欧美一区二区精品久久911| 国产日韩欧美精品一区| 久久国产精品网站| 亚洲黄色尤物视频| 亚洲欧美日本在线| 揄拍成人国产精品视频| 欧美激情视频在线播放| 正在播放亚洲一区| 美女999久久久精品视频| 亚洲精品乱码视频| 国产精品嫩草影院av蜜臀| 久久久久久久综合日本| 亚洲经典一区| 欧美中文字幕在线观看| 精品成人一区二区三区| 欧美日韩aaaaa| 久久不射中文字幕| 亚洲精品综合精品自拍| 久久精品亚洲一区| 日韩一级二级三级| 国模精品娜娜一二三区| 欧美精品一区二区三区很污很色的| 亚洲制服少妇| 亚洲精品1区2区| 久久久一区二区三区| 亚洲天堂黄色| 亚洲国产精品第一区二区三区 | 欧美在线日韩精品| 日韩亚洲精品视频| 欧美激情久久久| 久久久久国产精品厨房| 亚洲手机在线| 亚洲免费电影在线观看| 国产日韩一区在线| 国产精品成人一区二区三区夜夜夜 | 欧美色欧美亚洲高清在线视频| 久久久成人网| 午夜精品久久久久久久白皮肤| 91久久精品美女| 免费观看在线综合色| 欧美在线视频一区二区三区| 一区二区三区高清在线观看| 伊人婷婷欧美激情| 国产日韩欧美黄色| 国产精品久久中文| 欧美色欧美亚洲高清在线视频| 欧美~级网站不卡| 久久精品道一区二区三区| 亚洲专区国产精品| 亚洲午夜女主播在线直播| 欧美肥婆在线| 久久久久高清| 欧美综合77777色婷婷| 亚洲夜间福利| 亚洲一品av免费观看| 99成人精品| 正在播放亚洲| 亚洲天堂av图片| 亚洲一品av免费观看| 一区二区三区日韩在线观看| 99国产精品私拍| 9国产精品视频| 一区二区久久| 亚洲欧美日韩中文在线制服| 亚洲资源在线观看| 欧美一级专区| 久久青青草原一区二区| 久久男人资源视频| 牛牛国产精品| 欧美激情视频在线播放 | 久久影视三级福利片| 久久亚洲春色中文字幕| 欧美成人精品福利| 欧美色偷偷大香| 国产欧美日韩不卡免费| 国模私拍一区二区三区| 亚洲国产高清自拍| 亚洲精品一区二区网址| 亚洲一区二区三区免费观看| 午夜日韩av| 鲁大师成人一区二区三区| 欧美激情1区2区3区| 亚洲精品综合久久中文字幕| 亚洲视频在线播放| 欧美制服丝袜第一页| 欧美91视频| 国产精品第三页| 伊人久久综合| 中文在线一区| 久久全国免费视频| 亚洲精品视频二区| 久久精品国产精品亚洲| 欧美激情久久久久久| 国产精品日韩一区二区| 在线欧美小视频| 亚洲欧美日韩在线综合| 欧美成人一区二区| 亚洲一区中文| 欧美极品在线播放| 国产一区二区| 亚洲一区二区综合| 欧美超级免费视 在线| 亚洲午夜激情网站| 免费永久网站黄欧美| 国产日韩欧美高清| 国产精品99久久久久久久久久久久| 久久精品国产亚洲一区二区| 亚洲啪啪91| 久久久亚洲成人| 国产精品综合色区在线观看| 亚洲美女黄色| 老司机67194精品线观看| 这里只有视频精品| 欧美日韩国产高清| 亚洲电影有码| 狂野欧美性猛交xxxx巴西| 亚洲一区二区三区高清 | 久久精品亚洲| 国产精品久久国产三级国电话系列|