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

隨筆-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>
            国产精品99久久久久久宅男| 久久天堂成人| 亚洲私人影吧| 在线观看精品一区| 国产精品久久久久久五月尺| 欧美激情亚洲精品| 久久一区二区三区四区| 久久aⅴ国产欧美74aaa| 欧美一区二区三区在线播放| 亚洲一区二区视频| 亚洲美女色禁图| 久久一区激情| 久久精品国内一区二区三区| 欧美亚洲免费| 欧美在线播放| 在线亚洲精品| 亚洲专区免费| 欧美一区二区在线| 亚洲乱码国产乱码精品精可以看| 亚洲精品国产精品国自产在线| 亚洲福利视频一区| 亚洲人成网站999久久久综合| 精品999久久久| 亚洲春色另类小说| 亚洲免费成人av| 亚洲一区二区三区高清 | 亚洲视频网在线直播| 一本色道久久综合亚洲精品按摩 | 亚洲影音一区| 麻豆精品精华液| 国产精品视频福利| 亚洲人屁股眼子交8| 亚洲视频观看| 蜜桃av噜噜一区| 亚洲无限乱码一二三四麻| 久久久久久欧美| 欧美婷婷久久| 亚洲欧洲日产国产网站| 久久国产精品毛片| 在线性视频日韩欧美| 久久久久久久久久看片| 国产毛片一区| 亚洲免费视频在线观看| 亚洲国产日韩欧美在线图片| 亚洲香蕉伊综合在人在线视看| 久久综合色婷婷| 国产性天天综合网| 夜夜嗨av一区二区三区四季av| 久久久蜜臀国产一区二区| 亚洲一本大道在线| 欧美视频导航| 在线综合亚洲| 99热精品在线| 欧美精品播放| 日韩亚洲在线| 亚洲激情另类| 欧美三级乱码| 日韩视频免费观看高清完整版| 噜噜噜91成人网| 久久精品视频在线免费观看| 国产精品外国| 欧美一区二区久久久| 正在播放亚洲| 欧美一区二区三区在线免费观看| 一本色道88久久加勒比精品| 欧美成年人视频网站| 亚洲国产精选| 欧美国产精品劲爆| 欧美大学生性色视频| 日韩亚洲综合在线| 亚洲欧洲精品成人久久奇米网| 欧美成人亚洲成人日韩成人| 亚洲成人在线观看视频| 老司机亚洲精品| 欧美激情小视频| 亚洲一区精品在线| 在线亚洲免费| 国产日韩欧美麻豆| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久噜噜噜久久久| 在线看成人片| 99热这里只有精品8| 欧美精品在线观看一区二区| 亚洲一区国产| 午夜激情综合网| 亚洲国产电影| 一区二区日韩欧美| 激情文学综合丁香| 亚洲国产一区二区精品专区| 欧美日韩国产欧| 亚洲欧美精品suv| 久久人人97超碰精品888| 亚洲欧洲一级| 亚洲欧美国内爽妇网| 国产一区高清视频| 亚洲开发第一视频在线播放| 国产精品毛片a∨一区二区三区| 午夜视黄欧洲亚洲| 欧美在线亚洲在线| 亚洲视频图片小说| 久久精品国产77777蜜臀| 日韩视频在线观看一区二区| 午夜国产精品视频| 夜夜嗨av一区二区三区网站四季av| 一本色道久久88综合日韩精品| 国产欧美精品日韩区二区麻豆天美| 狂野欧美一区| 欧美欧美在线| 美日韩精品免费| 欧美日韩国产片| 欧美激情视频一区二区三区免费 | 黄色成人片子| 亚洲无吗在线| 日韩一级不卡| 久久久人成影片一区二区三区观看| 一区电影在线观看| 快she精品国产999| 久久嫩草精品久久久精品一| 欧美日韩精品国产| 欧美成人综合网站| 在线观看欧美精品| 久久精品99国产精品酒店日本| 亚洲一区三区视频在线观看| 免费亚洲一区二区| 欧美国产欧美亚州国产日韩mv天天看完整 | 最新国产の精品合集bt伙计| 国产欧美日韩一区二区三区在线观看| 欧美激情第1页| 影音先锋日韩有码| 欧美专区亚洲专区| 久久久亚洲人| 国产亚洲精品美女| 欧美有码视频| 久久综合久久久久88| 国产日韩欧美日韩大片| 欧美呦呦网站| 麻豆精品91| 亚洲日本无吗高清不卡| 欧美h视频在线| 亚洲国产日韩一区二区| 亚洲另类自拍| 欧美午夜剧场| 午夜精品理论片| 久久色在线观看| 精品999在线播放| 男人插女人欧美| 亚洲裸体俱乐部裸体舞表演av| 国产一区二区三区免费观看| 久久成人人人人精品欧| 玖玖综合伊人| 亚洲免费激情| 国产精品免费视频xxxx| 亚洲欧美日韩精品久久亚洲区| 久久www免费人成看片高清| 韩国三级电影久久久久久| 久久在线播放| 亚洲毛片在线观看| 欧美一级一区| 在线欧美日韩国产| 欧美高清视频一区二区三区在线观看 | 欧美一进一出视频| 黄色成人在线| 欧美日韩国产欧| 欧美一级黄色网| 亚洲国产成人久久综合一区| 亚洲永久免费观看| 亚洲第一狼人社区| 欧美日韩一区二区精品| 亚洲欧美日韩国产一区| 欧美大片免费观看在线观看网站推荐| 亚洲精品网站在线播放gif| 欧美日韩人人澡狠狠躁视频| 亚洲欧美www| 欧美激情亚洲综合一区| 西西裸体人体做爰大胆久久久| 亚洲第一网站免费视频| 国产精品免费看久久久香蕉| 久久综合九色九九| 亚洲一区二区在线免费观看视频| 免费高清在线一区| 性刺激综合网| 一本一本大道香蕉久在线精品| 国产有码在线一区二区视频| 欧美日韩一区免费| 免费在线国产精品| 久久av一区二区三区| 在线综合亚洲欧美在线视频| 欧美成人精品h版在线观看| 午夜精品视频一区| 99精品热视频只有精品10| 免费成人av在线| 美女免费视频一区| 一区电影在线观看| 在线精品在线| 国产丝袜一区二区| 欧美日韩精品综合| 欧美国产日韩免费| 六月天综合网| 久久久久成人精品| 欧美一激情一区二区三区|