Problem z internetowym botem.

0

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

0

Jak możesz to podaj plik z serwerami proxy oraz projekt QT, spakowany.

Pisanie tego w tym języku przy użyciu tych narzędzi to trochę dziwny pomysł.

0

Ok, ja wrócę do domu, to wrzucę wszystko.

0

Zamieszczam archiwum z plikami projektu.
Plik serwery.txt:

80.1.116.80
106.3.129.107
62.210.51.150
128.199.138.78
210.35.171.4
169.54.191.246
128.199.75.123
210.35.171.5
74.201.86.22
0

Rozwiązałem problem, temat do zamknięcia. Szkoda, że na tym forum nie ma nikogo, kto by dobrze znał Qt.

0
amb00 napisał(a):

Szkoda, że na tym forum nie ma nikogo, kto by dobrze znał Qt.

Przesadzasz, kojarzę co najmniej dwie osoby, które się znają na Qt. Wakacje są, wiec ruch na forum mniejszy.

manager.cookieJar()->deleteLater();
manager.setCookieJar(new QNetworkCookieJar(&manager));
0

@MarekR22: No nie wiem. Już wcześniej zadawałem pytania dotyczące Qt i większość odpowiedzi mi nie pomogła. Jeden gość znaleziony na jakieś grupie na fb pomógł mi dużo bardziej z Qt niż kilku programistów z tego forum razem wziętych, teraz niestety jak na razie nie odzywa się.
A co do ciastek, to rozumiem, że użycie kodu jaki mi podałeś w ten sposób jest prawidłowe?

void MainWindow::do_requests()
{
    manager.setCookieJar(new QNetworkCookieJar(&manager));
    if(proxyPtr == ProxyList.end())
    {
        ui->textBrowser->setText(result);
        result.clear();
        ProxyList.clear();
        return;
    }
    manager.setProxy(*proxyPtr);
    ++proxyPtr;
    QNetworkRequest request(QUrl("www.chamsko.pl"));
    reply = manager.get(request);
    connect(reply, &QNetworkReply::finished, [&](void)mutable{
        QNetworkRequest request2(QUrl(link.toStdString().c_str()));
        reply2 = manager.get(request2);
        connect(reply2, &QNetworkReply::finished, [&](void)mutable{
            result+=reply2->readAll();
            manager.cookieJar()->deleteLater();
            do_requests();});
    });
}
0

błąd tutaj nie leżał po stronie Qt, problem w tym, iż zmienna wychodziła Ci poza zasięg funkcji - później jej nie było, wszystkie funkcje które podpinasz na connect wykonywane są "asynchronicznie", więc w zasięgu tych funkcji nie masz już uchwytów np. "reply" (którego nie potrzebujesz bo wewnątrz nie wywołujesz) ani "reply2", które widzę, że wywołujesz...

na szybkiego rozwiązanie w funkcji anonimowej to: [&, reply2]... - po prostu musisz przekazać kopię adresu lub gdzieś indziej go przechowywać ;)

następnym razem jeśli korzystasz np. z git'a to w jakiejś gałęzi po prostu hamsko nawal np qDebug() << "JAKIŚ KOMUNIKAT"; - w ten sposób będziesz mógł zawęzić problem ;)

0

@zegarek84: Właśnie udało mi się do tego dojść i po prostu odpowiedzi są polami w klasie, a nie zmiennymi metody. Pozostał mi tylko jeszcze problem usuwania ciastek z managera w odpowiednim momencie.

0

z błedów jakie jeszcze widzę to używanie \\ jako separatora katalogu.
Nawet jak to jest windows możesz, a nawet powinieneś używać /.
Qt samo wykona konwersje gdy to jest potrzebne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1