gpt4 book ai didi

c++ - 使用 WinInet C++ 发布表单数据

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:54 26 4
gpt4 key购买 nike

我试图让这个程序连接到一个网站并提交表单数据以便登录,但我不知道我做错了什么。我听说过 curl 和 Winsock 等其他库,但我选择了 WinINet 库。所以只是为了测试这个程序,我一直在使用网站 Pastebin 来发布。到目前为止,我还没有看到任何结果。如果此程序成功发布表单数据,它将给我指向该帖子在其网站上的位置的标题。

我是否正确地编写了表单数据 char*?我在其他 stackoverflow 帖子中看到,在一些数字之前有大量破折号,然后放置他们的表单数据。

我需要添加一些东西让它模拟点击提交按钮吗?
我需要为表单上的每个元素写出值吗?

我已经尝试过 HttpAddRequestHeaders,但对我没有帮助。

此外,我在 HttpOpenRequest 上收到 ERROR_INSUFFICIENT_BUFFER 错误,但它仍然返回有效的 HINTERNET。

#include <Windows.h>
#include <WinInet.h>
#include <iostream>

#pragma comment( lib,"Wininet.lib")
using namespace std;

char* getheaders(HINTERNET hRequest){
DWORD dwInfoLevel=HTTP_QUERY_RAW_HEADERS_CRLF;
DWORD dwInfoBufferLength=10;
char* pInfoBuffer=(char*)malloc(dwInfoBufferLength+1);
while(!HttpQueryInfo(hRequest,dwInfoLevel,pInfoBuffer,&dwInfoBufferLength,NULL)){
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER){
free(pInfoBuffer);
pInfoBuffer=(char*)malloc(dwInfoBufferLength+1);
}else{
fprintf(stderr,"HttpQueryInfo failed, error = %d (0x%x)\n",GetLastError(),GetLastError());
break;
}
}
pInfoBuffer[dwInfoBufferLength] = '\0';
return pInfoBuffer;
}

void readfile(HINTERNET hRequest,char** buffs,int size){
DWORD dwBytesAvailable;
DWORD dwBytesRead;
for(int i=0;i<size;i++){
if(!InternetQueryDataAvailable(hRequest,&dwBytesAvailable,0,0)) break;
buffs[i]=(char*)malloc(dwBytesAvailable+1);
bool bResult=InternetReadFile(hRequest,buffs[i],dwBytesAvailable,&dwBytesRead);
if(!bResult | dwBytesRead==0) break;
}
}


int main(int argc,char** argv){
char* hdrs="Content-Type: application/x-www-form-urlencoded";
char* frmdata="paste_code=test";
LPCSTR accept[2]={"*/*", NULL};

HINTERNET hSession = InternetOpen("http generic",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, "www.pastebin.com",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "GET","/", NULL, NULL, accept, 0, 0);
//ERROR_INSUFFICIENT_BUFFER (122) with "accept".

bool send=HttpSendRequest(hRequest, hdrs, strlen(hdrs), NULL,NULL);
if(!send){
printf("HttpSendRequest failed, code=%d",GetLastError());
system("pause>nul");
return 0;
}

char* heads=getheaders(hRequest);
printf("%s\n\n\n\n",heads);

HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST","/", NULL, NULL, accept, 0, 0);
//ERROR_INSUFFICIENT_BUFFER (122) with "accept".

send=HttpSendRequest(hRequest2, hdrs, strlen(hdrs), frmdata,strlen(frmdata));
if(!send){
printf("HttpSendRequest failed, code=%d",GetLastError());
system("pause>nul");
return 0;
}

heads=getheaders(hRequest);
printf("%s\n\n\n\n",heads);

InternetCloseHandle(hRequest);
InternetCloseHandle(hRequest2);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);

system("pause>nul");
return 0;
}

最佳答案

您的代码几乎是正确的,您必须确保以下几点:

  1. char* hdrs="Content-Type: application/x-www-form-urlencoded"; 您必须确保从 POST 消息返回的对象的类型为 x-www-form-urlencodedJSON 。如果它是 JSON 你需要定义 char* hdrs="Content-Type: application/json\r\n";注意:您必须将 \r\n 附加到 hdrs。

  2. 尝试使用大小为 10000 的缓冲区调用 readFile 方法和 print buffer ,它将响应的输出打印到连接

  3. HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST","/", NULL, NULL, accept, 0, 0); 中,您必须调用路径而不是“/”的请求的 API 例如:.
    HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST", "/users/jsonlogin", NULL, NULL, accept, 0, 0);

关于c++ - 使用 WinInet C++ 发布表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com