现在为止,我看到ChinaOk和MSVCer开发的与csdn助手有关的工具,ChinaOK好像是用delphi做的(http://www.ChinaOK.net/down/csdn.zip),MSVCer好像用MFC(http://cool102.top263.net/263index.html
)为了让每个人都能够开发属于自己的csdn助手,普及COM知识,提高全民COM素质,我基于COM技术开发一个小咚咚(支持多线程),任何人利用这个咚咚,使用VC/VB/Delphi, 都可以写出自己的助手小程序来解决自己遇到的问题,比如:1. 自己开的帖子需要关注是不是有人回,可以利用本程序的IOCSNDTopic接口每五分钟检测一次是否有人跟贴
2. 关注自己csdn上的好友上线和在线,使用IOCSDNOnlineUsers接口(你要枚举在线专家也是用这个接口)
3. 你要实时查看比如VC技术版面当前的最新帖子,可以用IOCSDNForumHeadPage接口
4. 我有个未完的心愿,就是把csdn上的帖子抓下来,放到自己的数据库里 (因为想等自己写完根据数据库结构自动生成访问数据库的ado代码之后再做这一步,但是... :(
5. ...csdn上的帖子都是基于xml的格式。访问95%的帖子比较容易,还有1%是下载下来的xml帖子中间含有字符零:) 3%是已经被删除的(或者更多),还有1%是我也对付不了的:xml文档里面有non-ascii字符,比如(所以如果你要按帖子ID来爬帖子的时候,记得,如果发现连续10多个帖子都不能访问,可能到了最新,或者你使用IOCSDNGetMaxTopicId接口(奇慢))让大家腾出手来做实用的界面,功能,让这个开发包来对付底层这些污七八糟的异常,是本人的目的所在我下一步想做的是封装登陆之后的那些功能的接口,比如取得自己的短消息,获得自己参与的帖子... 但是本人最近体力耗尽,所以不知道什么时候会开始,而且,写程序和发布接口不一样,写着自己玩无所谓,发布出去的话,毕竟要更负责,拿这些个接口来说,为了解决各种各样的bug, 奋战了三天才到现在的地步,而把所有的功能建立起来可以用,顶多三天(嘿嘿,这样倒符合软件工程的时间比例),另外,这部分csdn最近改版太严重,所以也不大想做(做了,一改版又要重新发布,多麻烦,所以满足最基本的要求先)----------------
我把这个开发包放在yahoo的briefcase里,可以从下面这个网址下载,后面那串不认识的东西也要加上才行:
http://us.f1.yahoofs.com/users/1105dc58/bc/sharing/CSDNDownloader.0.9.zip.zip?bc2tA88A9dnMZ5CJDoc目录下面有一个“使用手册.htm”,请一定先阅读 (肯定漏写了好多东西,比如现在想起来的,因为这个com组件使用的是wininet的函数来访问csdn服务器,所以,只要你的IE能访问csdn, 这个组件就能访问(IE用代理出去,它就用同样的代理出去),还有关于发布的问题,因为我用的都是w2k, 没有测试过,不过mfc肯定没有用到:)这个可以以后慢慢讨论)对于vc/vb/delphi,开发包里面都已经有现成的sample,可以参考欢迎任意分发上面这个开发包,提供下载;欢迎跟贴,up;欢迎短消息骚扰;欢迎QQ骚扰: 23015401(请注明csdn);欢迎email骚扰: nec211218#yahoo.com,来信请注明转几号嘉宾收,我会为你转达你真诚的...
搞笑了..本人虽然两颗红心,但可用分实在太少,只有180分,有人捐我点吧???
)为了让每个人都能够开发属于自己的csdn助手,普及COM知识,提高全民COM素质,我基于COM技术开发一个小咚咚(支持多线程),任何人利用这个咚咚,使用VC/VB/Delphi, 都可以写出自己的助手小程序来解决自己遇到的问题,比如:1. 自己开的帖子需要关注是不是有人回,可以利用本程序的IOCSNDTopic接口每五分钟检测一次是否有人跟贴
2. 关注自己csdn上的好友上线和在线,使用IOCSDNOnlineUsers接口(你要枚举在线专家也是用这个接口)
3. 你要实时查看比如VC技术版面当前的最新帖子,可以用IOCSDNForumHeadPage接口
4. 我有个未完的心愿,就是把csdn上的帖子抓下来,放到自己的数据库里 (因为想等自己写完根据数据库结构自动生成访问数据库的ado代码之后再做这一步,但是... :(
5. ...csdn上的帖子都是基于xml的格式。访问95%的帖子比较容易,还有1%是下载下来的xml帖子中间含有字符零:) 3%是已经被删除的(或者更多),还有1%是我也对付不了的:xml文档里面有non-ascii字符,比如(所以如果你要按帖子ID来爬帖子的时候,记得,如果发现连续10多个帖子都不能访问,可能到了最新,或者你使用IOCSDNGetMaxTopicId接口(奇慢))让大家腾出手来做实用的界面,功能,让这个开发包来对付底层这些污七八糟的异常,是本人的目的所在我下一步想做的是封装登陆之后的那些功能的接口,比如取得自己的短消息,获得自己参与的帖子... 但是本人最近体力耗尽,所以不知道什么时候会开始,而且,写程序和发布接口不一样,写着自己玩无所谓,发布出去的话,毕竟要更负责,拿这些个接口来说,为了解决各种各样的bug, 奋战了三天才到现在的地步,而把所有的功能建立起来可以用,顶多三天(嘿嘿,这样倒符合软件工程的时间比例),另外,这部分csdn最近改版太严重,所以也不大想做(做了,一改版又要重新发布,多麻烦,所以满足最基本的要求先)----------------
我把这个开发包放在yahoo的briefcase里,可以从下面这个网址下载,后面那串不认识的东西也要加上才行:
http://us.f1.yahoofs.com/users/1105dc58/bc/sharing/CSDNDownloader.0.9.zip.zip?bc2tA88A9dnMZ5CJDoc目录下面有一个“使用手册.htm”,请一定先阅读 (肯定漏写了好多东西,比如现在想起来的,因为这个com组件使用的是wininet的函数来访问csdn服务器,所以,只要你的IE能访问csdn, 这个组件就能访问(IE用代理出去,它就用同样的代理出去),还有关于发布的问题,因为我用的都是w2k, 没有测试过,不过mfc肯定没有用到:)这个可以以后慢慢讨论)对于vc/vb/delphi,开发包里面都已经有现成的sample,可以参考欢迎任意分发上面这个开发包,提供下载;欢迎跟贴,up;欢迎短消息骚扰;欢迎QQ骚扰: 23015401(请注明csdn);欢迎email骚扰: nec211218#yahoo.com,来信请注明转几号嘉宾收,我会为你转达你真诚的...
搞笑了..本人虽然两颗红心,但可用分实在太少,只有180分,有人捐我点吧???
我想以后的CSDN客户端会更加丰富多彩,不仅是各种编程语言可以实现,在功能上也将更贴近大家。可能在不远的时候,会有用.net平台开发的类似组件出来,用C#开发COM组件的感觉简直太棒了。(运行时需要.net的FrameWork支持)
你真厉害!
Q号记下,有时间能帮帮我吧!关于COM技术
+-CCSDNMaxTopicId ---> IOCSDNMaxTopicId (解析html页面)
+-CCSDNOnlineUsers ---> IOCSDNOnlineUsers(解析html页面)
+-CWebPageXml ---> 下载并分析任意的xml页面
+-CCSDNForumHeadPage ---> IOCSDNForumHeadPage (解析xml数据)
+-CCSDNTopic ---> IOCSDNTopic (解析xml数据)F:\lylong\MyProjects\followmeexample>findstr /R /S class *.h
Include\ArrayPP.h:class CArrayPP
Include\BonusBuffer.h:class CBonusBuffer
Include\CSDNForumHeadPage.h:class CCSDNForumHeadPage : public CWebPageXml
Include\CSDNMaxTopicId.h:class CCSDNMaxTopicId : public CWebPageRaw
Include\CSDNOnlineUsers.h:class CCSDNOnlineUsers : public CWebPageRaw
Include\CSDNReply.h:class CCSDNReply
Include\CSDNTopic.h:class CCSDNTopic : public CWebPageXml
Include\CSDNTopicBrief.h:class CCSDNTopicBrief
Include\CSDNUser.h:class CCSDNUser
Include\FileTools.h:class CFileTools
Include\HttpTools.h:class CHttpTools
Include\Str.h:class CStr;
Include\WebPageRaw.h:class CWebPageRaw
Include\WebPageXml.h:class CWebPageXml : public CWebPageRaw
pEle = pNode->selectSingleNode( L"PostUserNickName" ); // 这里的L"PostUserNickName"
我想这个字段名字一般不会改的,顶多我这个XPATH前面多加点路径限定
//////////////////////////////////////////////////////////////////
// Function name : CCSDNReply::FetchReplyElements
// Description :
// Creator : Long Lin Yu
// TimeStamp : 2002-3-24 9:31:04
//
// Return type : void
// Argument : msxml::IXMLDOMNodePtr& pNode 给出指向如下数据的DOMNode指针
// <Reply>
// <PostUserNickName>猫仔</PostUserNickName>
// <rank>一级(初级)</rank>
// <ranknum>user1</ranknum>
// <credit>100</credit>
// <ReplyID>3563543</ReplyID>
//
// <TopicID>526898</TopicID>
// <PostUserId>12076</PostUserId>
// <PostUserName>Garfield</PostUserName>
// <Point>0</Point>
// <Content>....石沉大海</Content>
// <PostDateTime>2002-2-17 15:54:46</PostDateTime>
//
// </Reply>
//////////////////////////////////////////////////////////////////
void CCSDNReply::FetchReplyElements( msxml::IXMLDOMNodePtr& pNode )
{
msxml::IXMLDOMElementPtr pEle;
pEle = pNode->selectSingleNode( L"PostUserNickName" );
if( pEle != NULL ) PostUserNickName = pEle->text;
pEle = pNode->selectSingleNode( L"rank" );
if( pEle != NULL ) rank = pEle->text;
pEle = pNode->selectSingleNode( L"ranknum" );
if( pEle != NULL ) ranknum = pEle->text;
pEle = pNode->selectSingleNode( L"credit" );
if( pEle != NULL ) credit = pEle->text;
pEle = pNode->selectSingleNode( L"ReplyID" );
if( pEle != NULL ) ReplyID = pEle->text;
pEle = pNode->selectSingleNode( L"TopicId" );
if( pEle != NULL ) TopicId = pEle->text;
pEle = pNode->selectSingleNode( L"PostUserId" );
if( pEle != NULL ) PostUserId = pEle->text;
pEle = pNode->selectSingleNode( L"PostUserName" );
if( pEle != NULL ) PostUserName = pEle->text;
pEle = pNode->selectSingleNode( L"Point" );
if( pEle != NULL ) Point = pEle->text;
pEle = pNode->selectSingleNode( L"Content" );
if( pEle != NULL ) Content = pEle->text;
pEle = pNode->selectSingleNode( L"PostDateTime" );
if( pEle != NULL ) PostDateTime = pEle->text;
}如何获取html里面的数据,如果csdn改版,我只需要修改下面这个字符串
"([-._A-Za-z0-9]+)\(([-]?[0-9]+)\)"是一个规则表达式,它表示一个有效的字符串,形如:
"karma(50559)", 大家可以参考:
http://www.csdn.net/dev/Visual%20C++/source%20code/String/下面的:
1. Using Regular Expressions for Search/Replace
2. An alternative Regular Expression Class 在Doc目录下,我已经下载了两个html页面:
---------------------------------------------
F:\Temp\Doc>match OnlineUsers.html "([-._A-Za-z0-9]+)\(([-]?[0-9]+)\)"
karma 50559
masterz 34801
chechy 33284
Jneu 27611
skyyoung 24074
windindance 21107
KingSunSha 20379
nononono 17366
strip 13609
y1g1y1 7523
torble 7114
alphagx 7042
qiubolecn 6820
halfdream 6793
...---------------------------------------------
F:\Temp\Doc>match GetMaxTopicId.txt ">([0-9]+)"
599583
597204
3971107
3957704found 4(注:上面的match.exe是我写的一个测试程序)
对于一个容易维护的软件来说,时间空间的效率往往和可维护性是矛盾的(不是绝对),至少我的理念是我需要的可维护,易维护的软件,所以在内存使用效率上没有多大特殊的考虑,但是,我保证我的内存使用都是用完就释放的,只要你不占着我传出来的com对象的句柄。(因为这样它就没有办法release)另外还有一点可能是,我的例子里面都有GetOnlineUsers的演示,大家可以同时访问一下这个页面:
http://www.csdn.net/expert/Online.asp
记得在页面上按鼠标右键看属性,看看这个页面有多大,我刚看了一下,当1690个人在线的时候,是320799bytes,也就是300K左右:
1. 访问上面这个asp有多慢,我的程序就有多慢
2. 我的程序的内核都是用unicode来处理字符串的,另外COM Library内部也是用unicode,所以把这个页面下载下来会用掉我的程序300K*2的内存
3. 如果你使用的sample是delphi/vb/mfc的话,这300K的数据需要全部载入一个text/edit控件里面,这也会吞噬很多内存(相信大家都试着用notepad打开一个10M的文件,看看它的内存使用情况:它会占用你20M的内存,因为w2k的notepad是一个unicode的应用程序)另外,大家不要给我卷分了,昨天一天我的可用分快超过我的专家分了 :)
54852.636019 <-------- 这是(分析数据)的时间
113652.295473 <-------- 这是(下载+分析数据)的时间press any key to exit下一版可以改进这个方面
谢谢
54852.636019 <-------- 这是(分析数据)的时间
113652.295473 <-------- 这是(下载+分析数据)的时间press any key to exit下一版可以改进这个方面
谢谢
光说个“GOOD”顶什么用?给他点实际的帮助啊!to strip:
你应该去找找webmaster,让他给你提供interface,就不会“一改版就白做”了。
5663.906167 <-------- 这是(分析数据)的时间
1577 user(s) online
42780.960988 <-------- 这是(下载+分析数据)的时间
press any key to exit
http://www.csdn.net/expert/Rooms/2/Forum_2_2.xml
http://www.csdn.net/expert/Rooms/2/Forum_2_3.xml
http://www.csdn.net/expert/Rooms/2/Forum_2_4.xml
格式http://www.csdn.net/expert/Rooms/(roomid)/Forum_2_(roomtype).xmlroomid是论坛ID,可以从论坛列表的URL里找到roomtype有如下四个值,分别代表:1、非技术区,2技术区,3已解决 4精华区
http://www.csdn.net/expert/Rooms/2/Forum_2_1.xml
已经封装在IOCSDNForumHeadPage::get_TopicBriefs和get_TopicBriefCount里了IE解析xml页面慢我倒是没有发现,我的解析是xml dom, 而ie要解析xml dom还要从繁忙的csdn服务器上取xsl(至少要判断是否更新),然后在"解释"输出成html,所以可能比较慢
做到ie band里面去,没有体力了,不过我以前做过,和以前的同事
http://it.sohu.com/download/banlu/default.html最近在研究boost,想从里面扣点出来用(巧的是,今天收到csdn寄来的过期《程序员》,里面也再介绍boost,不过介绍得跟好像很...)
111222[哈尔滨,好城市]
其实ie解析xml并不慢吧。主要是现在csdn的帖子的页面是用的表格嵌套,
整个页面几乎全套在了一个大的table中。
如果帖子回复较多,解析会非常的耗时,在我的论坛助手里,我去掉了外面的table,使每个回复都解析成一个独立的表格。速度就变的快的多了。这个问题我象hcat1999提过,只不过又是因为左边的广告位置,而没有结果。
[email protected]
>在功能上也将更贴近大家。可能在不远的时候,会有用.net平台开发的类似
>组件出来,用C#开发COM组件的感觉简直太棒了。(运行时需要.net的>FrameWork支持)
.Net FrameWork的安装程序要20多M,我的程序只有几百K……
★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]
★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子
★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。
可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip