Witajcie, ostatnio piszę z użyciem Qt internetowego bota, który ma podbijać ocenę danego obrazka używając do tego darmowych serwerów proxy. Aby mieć 100% pewności, że będzie działał jak trzeba muszę jeszcze dodać usuwanie ciastek z managera w odpowiednim momencie, ale nie w tym problem. Otóż metoda do_requests() nigdy nie dochodzi do ostatniego etapu, w którym wstawia wynik do przeglądarki tekstu, czyści tymczasowe zmienne i zamyka plik z listą serwerów proxy. To jedyne co udało mi się wywnioskować po bawieniu się debugerem. Przez to zapytania się nie wykonują, a cały program się w końcu prędzej czy później wywala. Byłbym wdzięczny za pomoc ;)
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::do_requests()
{
if(proxyPtr == ProxyList.end())
{
ui->textBrowser->setText(result);
result.clear();
serwery.close();
ProxyList.clear();
return;
}
manager.setProxy(*proxyPtr);
++proxyPtr;
QNetworkRequest request(QUrl("www.chamsko.pl"));
auto reply = manager.get(request);
connect(reply, &QNetworkReply::finished, [&](void)mutable{
QNetworkRequest request2(QUrl(link.toStdString().c_str()));
auto reply2 = manager.get(request2);
connect(reply2, &QNetworkReply::finished, [&](void)mutable{
result+=reply2->readAll();
//for (auto &x : Cookies.allCookies()) Cookies.deleteCookie(x);
//++proxyPtr;
do_requests();});
});
}
void MainWindow::on_pushButton_ok_clicked()
{
serwery.setFileName("C:\\AMB\\projekty\\C_C++\\build-chamskopl_bot-Desktop_Qt_5_9_0_MinGW_32bit-Release\\release\\serwery.txt");
serwery.open(QIODevice::ReadOnly);
if(!serwery.isOpen())
{
ui->textBrowser->setText("Błąd podczas otwierania pliku.\n");
return;
}
if(ui->lineEdit_id->text() == "")
{
ui->textBrowser->setText("Nie podano numeru obrazka.\n");
return;
}
//manager.setCookieJar(&Cookies);
QString id = ui->lineEdit_id->text(), ocena = (ui->checkBox_ocena->isChecked())? "5":"1";
link = "http://www.chamsko.pl/front/resource/rating/resource_id/"+id+"/rating/"+ocena+"/";
while(!serwery.atEnd()) ProxyList.push_back(QNetworkProxy(QNetworkProxy::HttpProxy, serwery.readLine(), 80, "", ""));
proxyPtr = ProxyList.begin();
do_requests();
}
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkProxy>
#include <QNetworkCookieJar>
#include <QFile>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QByteArray content;
private slots:
void on_pushButton_ok_clicked();
void do_requests();
private:
Ui::MainWindow *ui;
QNetworkAccessManager manager;
QList<QNetworkProxy>ProxyList;
QByteArray result;
QNetworkCookieJar Cookies;
QFile serwery;
QString link;
QList<QNetworkProxy>::iterator proxyPtr;
};
#endif // MAINWINDOW_H