关于刷屏的实现技术(代码+实例讲解)
这里不打算给出一个完整的刷屏机,只就一些实现细节讨论下:
所使用的API是这么几个
InternetOpenW
InternetConnectW
HttpOpenRequestW
HttpSendRequestW
InternetReadFile
InternetCloseHandle
依次调用就行了
如下例:
const WCHAR hdrs[] = L"Content-Type: application/x-www-form-urlencoded";
const WCHAR* verb = L"POST";
const WCHAR* accept[] = {L"Accept: */*", 0};
wstring frmdata = GetData();
HINTERNET hSession = InternetOpenW(L"MyAgent", INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
HINTERNET hConnect = InternetConnectW(hSession, L"community.csdn.net",
INTERNET_DEFAULT_HTTP_PORT, NULL,
NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequestW(hConnect, verb,
L"Expert/reply.asp", NULL, NULL,
(const WCHAR**)&accept, INTERNET_FLAG_NO_COOKIES , 1);
HttpSendRequestW(hRequest, hdrs, wcslen(hdrs), (void*) frmdata.c_str(), frmdata.size());
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
至于InternetReadFile这个使不使用属于个人爱好,使用它可能会多花费时间,也造成服务器负担,但是不使用的话你就不知道成没成功。建议刚开始的时候使用,等有信心的可以不用。
细节1:
HttpOpenRequestW的时候INTERNET_FLAG_NO_COOKIES这个标记很关键,如果没有这个标记,那么你就不能用HttpAddRequestHeaders去添加cookie了,因为这时候wininet自己管理cookie。在论坛使用cookie的时候这一点须注意。
cookie头的格式:"Cookie: name=value;name1=value1...\r\n"
不过有个更好的方法,直接用InternetGetCookie就可以得到,否则的话,需要用
HttpQueryInfo(hRequest, HTTP_QUERY_SET_COOKIE, szBuf, &length, &index);
去手工获取,然后从中解析出cookie。
细节2:
verb 可以去"POST"或者"GET",具体什么时候用那种呢?
由表单提交的(如发帖)一般就用POST,这时候数据全用"name=value&name1=value1&name2=..."这种格式,作为HttpSendRequestW的第四个参数传过去
如果直接写成url的(如帖子列表http://community.csdn.net/Expert/ForumList.asp?roomid=1404&typenum=1&whichpage=1)就用GET,注意Get的时候数据就不要放到frmdata中了,直接写入url,像上面的例子就是写成"Expert/ForumList.asp?roomid=1404&typenum=1&whichpage=1",作为HttpOpenRequestW的第三个参数直接使用。
更多问题,大家补充