我试图使用boost beast登录该站点,但在结果中只能得到字段已更改的页面
#include <iostream>
#include "boost/asio.hpp"
#include "boost/beast.hpp"
namespace beast = boost::beast;
namespace http = beast::http;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;
int main() {
asio::io_context context;
beast::tcp_stream stream(context);
stream.connect(tcp::resolver(context).resolve("site.com", "http"));
http::request<http::string_body> request;
request.version(11);
request.method(http::verb::post);
request.target("/login.php?redirect=somepage");
request.set(http::field::host, "site.com");
request.set(http::field::content_type, "application/x-www-form-urlencoded");
request.body() = "fusername=USERNAME&fpassword=PASSWORD";
request.prepare_payload();
boost::beast::http::write(stream, request);
boost::beast::flat_buffer buffer;
boost::beast::http::response<boost::beast::http::dynamic_body> res;
boost::beast::http::read(stream, buffer, res);
std::cout << res;
}这个站点的方法部分看起来像这样
<form action="./login.php" method="post">
<input type="hidden" name="redirect" value="somepage">
<div><b>Enter your username and password to log in.</b></div>
<div class="input-prepend">
<span class="add-on" style="width:100px;text-align:right;">Username:</span>
<input type="text" class="post input" name="fusername" size="25" maxlength="40" value="" tabindex="101">
</div>
<div class="input-prepend">
<span class="add-on" style="width:100px;text-align:right;">Password:</span>
<input type="password" class="post input" name="fpassword" value="" tabindex="102" size="25" maxlength="32">
</div>
<input type="submit" name="login" class="bold long btn" value="Log in" style="margin:0 auto;">
</form>res与页面相同,只是值字段看起来像value="USERNAME"
发布于 2020-07-31 15:01:50
重定向实际上也是在正文中发送的输入值,而不是用作URL参数。尝试更改:
request.target("/login.php");和
request.body() = "fusername=USERNAME&fpassword=PASSWORD&redirect=somepage";发布于 2020-07-31 16:51:30
好了,我找到答案了,希望能对你有所帮助。
在作为参数发送时,您需要对字符串“
是的,如果你不能创建HTTP请求,你可以直接在浏览器(比如Firefox)中登录,然后从浏览器中获取原始请求。
#include <iostream>
#include <fstream>
#include "boost/asio.hpp"
#include "boost/beast.hpp"
namespace beast = boost::beast;
namespace http = beast::http;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;
static std::string const host = "site.com";
static std::string const redirected = "/somepage=1";
static std::string const redirected_escaped = "somepage%3D1";
static std::string const username = "USERNAME";
static std::string const password = "PASSWORD";
int main() {
try {
std::ofstream output("../output.html");
asio::io_context context;
beast::tcp_stream stream(context);
stream.connect(tcp::resolver(context).resolve(host, "http"));
std::string cookie;
{
http::request<http::string_body> request(http::verb::post, "/login.php", 11);
request.set(http::field::host, host);
request.set(http::field::content_type, "application/x-www-form-urlencoded");
request.body() =
"redirect=" + redirected_escaped +
"&login_username=" + username +
"&login_password=" + password +
"&login=Log+in";
request.prepare_payload();
std::cout << request << std::endl;
boost::beast::http::write(stream, request);
boost::beast::flat_buffer buffer;
boost::beast::http::response<boost::beast::http::dynamic_body> res;
boost::beast::http::read(stream, buffer, res);
cookie = std::string(res.base().at(http::field::set_cookie));
std::cout << "Cookie: " << cookie << std::endl;
}
{
http::request<http::string_body> request(http::verb::get, redirected, 11);
request.set(http::field::host, host);
request.set(http::field::cookie, cookie);
std::cout << request << std::endl;
boost::beast::http::write(stream, request);
boost::beast::flat_buffer buffer;
boost::beast::http::response<boost::beast::http::dynamic_body> res;
boost::beast::http::read(stream, buffer, res);
output << beast::buffers_to_string(res.body().data());
}
} catch (boost::wrapexcept<boost::system::system_error> const &wrapexcept) {
std::cout << wrapexcept.what();
}
}https://stackoverflow.com/questions/63186448
复制相似问题