我一整天都没有成功。请帮助解决问题。在谷歌上搜索我发现很多用户都有这个问题,但我无处可寻找解决方案。
我正在尝试在QT C ++&我已经尝试过在python中执行此操作(我的问题不是python问题,所以Qt专业人员请帮助)..我知道,我在处理cookie和所有问题时出错了,所以请帮忙。请提供可能的解决方案。
在python中,代码简洁明了。我已经删除了错误处理和所有额外的事情以使其变得简单。
url = 'http://www.example.com/'
data = 'username=abc&password=passwd'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
usock = opener.open(url, data)
#>>>>>> NOW, I have the cookiejar <<<<<<<<<
opener.addheaders = [('Referer','http://www.example.com/xyz.php'),('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]
data_to_send = 'ABCDEFGH'
url_send = "http://www.example.com/xyz.php"
send = opener.open(url_send,data_to_send)
我做的QT等效: -
void SmsSender::sendToMyCantos()
{
manager = new QNetworkAccessManager(this);
manager->setCookieJar(new QNetworkCookieJar(manager));
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
request.setUrl(QUrl("http://www.mycantos.com"));
postData.append("username=abc&password=passwd");
manager->post(request,postData);
//>>>>>> So, I feel that I have CookieJar now to make POST <<<<<<<
request.setRawHeader("Referer","http://www.example.com/xyz.php");
request.setRawHeader("User-Agent","Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0");
postData.clear();
postData.append("ABCDEFGH");
request.setUrl(QUrl("http://www.example.com/xyz.php"));
manager->post(request,postData);
}
现在的问题是我无法在QT中做同样的事情。我面临的问题:
所有这些都是在python中自动完成的。 下面,代码没有直接关联,但我将其编码为允许POST中的重定向..代码为very similar to the link I used to make it..
QUrl SmsSender::redirectUrl(const QUrl& possibleRedirectUrl,
const QUrl& oldRedirectUrl) const {
//Checking infinite resursions
QUrl redirectUrl;
if(!possibleRedirectUrl.isEmpty() &&
possibleRedirectUrl != oldRedirectUrl) {
redirectUrl = possibleRedirectUrl;
}
return redirectUrl;
}
void SmsSender::replyFinished(QNetworkReply *reply)
{
QVariant possibleRedirectUrl =
reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
QVariant data_size = reply->header(QNetworkRequest::ContentLengthHeader);
qDebug()<<data_size.toFloat();
qDebug()<<manager->cookieJar()->cookiesForUrl(QUrl("http://www.example.com"));
/* We'll deduct if the redirection is valid in the redirectUrl function */
_urlRedirectedTo = this->redirectUrl(possibleRedirectUrl.toUrl(),
_urlRedirectedTo);
/* If the URL is not empty, we're being redirected. */
if(!_urlRedirectedTo.isEmpty()) {
QString text = QString("SmsSender::replyFinished: Redirected to ")
.append(_urlRedirectedTo.toString());
qDebug(text.toAscii());
// Do again in case we have more redirections
this->_qnam->get(QNetworkRequest(_urlRedirectedTo));
}
else
{
QString text = QString("SmsSender::replyFinished: Arrived to ")
.append(reply->url().toString());
qDebug(text.toAscii());
_urlRedirectedTo.clear();
}
}
QNetworkAccessManager* SmsSender::createQNAM() {
QNetworkAccessManager* qnam = new QNetworkAccessManager(this);
/* We'll handle the finished reply in replyFinished */
connect(qnam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
return qnam;
}
答案 0 :(得分:7)
我用它来获取cookie:
SomeDialog::SomeDialog(QWidget *parent)
: QDialog(parent)
, urlSearch("www.someotherurlyoumightneed.com")
, urlCookie("www.urltogetcookie.from")
{
ui.setupUi(this);
//manager is a QNetworkAccessManager
manager.setCookieJar(new QNetworkCookieJar);
connect(&manager, SIGNAL(finished(QNetworkReply*)),
SLOT(slotReplyFinished(QNetworkReply*)));
//this is a QNetworkRequest
//here i tell how the post methods are encoded
searchReq.setUrl(urlSearch);
searchReq.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
//get cookie
manager.get(QNetworkRequest(urlCookie));
lblStatus->setText("Getting cookie");
}
void SomeDialog::slotReplyFinished(QNetworkReply* reply){
reply->deleteLater();
if(reply->error() != QNetworkReply::NoError){
QMessageBox::warning(this,QString(), tr("Error while downloading information!\n%1").arg(reply->errorString()));
return;
}
//Here i check if there is a cookie for me in the reply and extract it
QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie>>(reply->header(QNetworkRequest::SetCookieHeader));
if(cookies.count() != 0){
//you must tell which cookie goes with which url
manager.cookieJar()->setCookiesFromUrl(cookies, urlSearch);
}
//here you can check for the 302 or whatever other header i need
QVariant newLoc = reply->header(QNetworkRequest::LocationHeader);
if(newLoc.isValid()){
//if it IS a reloc header, get the url it points to
QUrl url(newLoc.toString());
_req.setUrl(url);
_pendingReq.insert(_manager.get(_req));
return;
}
//if you have multiple urls you are waiting for replys
//you can check which one this one belongs to with
if(reply->url() == urlSearch){
//do something
}
}
void SomeDialog::slotSearch(){
//Here we set the data needed for a post request
QList<QNetworkCookie> cookies = manager.cookieJar()->cookiesForUrl(urlSearch);
for(auto it = cookies.begin(); it != cookies.end(); ++it){
searchReq.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(*it));
}
QUrl post;
post.addQueryItem("firstParameter", s);
post.addQueryItem("secondParameter", "O");
QByteArray ba;
ba.remove(0,1); //must remove last &
searchReq.setUrl(urlSearch);
pendingReq.insert(manager.post(searchReq, ba));
}
希望这有帮助。
答案 1 :(得分:0)
我认为Cookie与其获取的网址相关联。因此,在您使用不同URL的第二个POST中,第一个POST中的cookie不会随请求一起发送。