我的代码中有问题我确实向Facebook服务器发送了HTTP请求,但问题是我得到HTTP / 1.1 301永久移动 信息。 我想要做的是允许按照标题响应链接,并给我重定向的页面HTML, 此外,我尝试发送另一个HTTP请求,但我得不到任何响应,所以我认为有功能选项,允许我按照标题链接。
所以基本上我正在尝试做的是这个发送http发送请求到facebook服务器用我的用户和密码登录跟随标题重定向链接给我回复。
如果可能的话,请指导我做正确的方法。 PS:我已经阅读了一些RFC,但仍然不清楚。 谢谢你的时间。
我的代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
int sockid, status;
unsigned strSize;
ssize_t count; //
struct sockaddr_in addr; // struct
ssize_t size = sizeof(addr);
sockid = socket(PF_INET, SOCK_STREAM, 0); // create socket
if(sockid < 0) //if error
{
cout<<"Cannot create sucket\n";
close(sockid);
exit(EXIT_FAILURE);
}
// access struct
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
if(inet_aton("31.13.90.36",&addr.sin_addr) == 0)
{
cout << "Wrong address";
close(sockid);
exit(-1);
}
status = connect(sockid, (sockaddr*)&addr, sizeof(addr)); // attempt to establish a connection
// check
if(status < 0)
{
cout << "failed to establish a connection";
close(sockid);
exit(EXIT_FAILURE);
}
// sending HTTP request
char msg[] = "POST /login.php HTTP/1.1\r\n"
"HOST: m.facebook.com\r\n"
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-Length: 147\r\n"
"Connection: Keep-Alive\r\n"
"\r\n"
"lsd=AVp5UV4F&version=1&ajax=0&width=0&pxr=0&gps=0&dimensions=0&m_ts=1481464104&li=KFlNWFL78UFJkrUnTV_sFFDQ&email=Minglixe&pass=test123&login=Log+In";
const int bufSize = 4000;
char * buf;
buf = new char [bufSize];
//unsigned bufSize = strlen(buf);
strSize = strlen(msg);
send(sockid, msg, strSize, 0); // send request
while((count = recv(sockid, buf, bufSize, 0)) > 0)// receive the request
{
buf[count] = '\0';
cout << buf << flush;
}
if(count < 0 )
{
cout << "error" ;
exit(EXIT_FAILURE);
}
delete[] buf;
close(sockid);
}
答案 0 :(得分:4)
您必须向301响应中指定的重定向网址发出另一个HTTP请求GET
请求。
您需要关闭此套接字,并为新请求创建一个新套接字。如果重定向的URL是针对同一个域的,那么您可以实现HTTP / 1.1流水线操作并省去拆除一个套接字并创建一个新套接字的麻烦,但这样就太过分了。
此外,几乎可以肯定的是,301响应还在重定向的请求中为您提供了一些Cookie,Facebook的服务器将指望您返回它。否则你所做的一切都没有任何工作机会。
不幸的是,这里没有捷径,也没有即时的满足感。为了正确地执行此操作,您需要了解并熟悉HTTP的全部内容。 HTTP的规范参考由RFC 7230和RFC 7231组成(还有RFC 7232,RFC 7233,RFC 7234,RFC 7235,RFC 7236和RFC 7237,但我不相信你需要它们用于你的特定目的)。我将在RFC 7230和7231中将您引导至权威来源,而不是在此处复制粘贴块。
HTTP并不是那么复杂,但它不是几个小时内可以吸收的东西,比如POP3。准备投入几天时间来审查HTTP的技术规范并进行研究。当我实现我自己的全功能HTTP 1.1客户端时,花了我几个月的时间(通过我的业余时间)通过RFC 2616的前身工作,并破解了支持cookie的HTTP 1.1客户端。
此外,为了让您的HTTP客户端处理cookie,有关如何处理cookie的规范参考是RFC 6265。你也需要了解它。
P.S。希望重定向的URL不是https
URL,或者Facebook允许非加密连接在登录后获取内容。否则,我担心,您需要引入平台的SSL库,并编写代码整个事情之上的TLS / SSL会话。