QML에서 Open Graph 메타 태그를 얻는 방법

9989 단어 cppqmlqttags
어느 날 입력 라인에서 메타 그래프 태그를 구문 분석하고 제목과 아이콘을 생성할 수 있는 솔루션이 필요했습니다.

물론 jsoup을 사용하는 라이브러리는 무궁무진했지만 그게 필요한 것이 아니었습니다. qt와 C++를 사용하고 싶었습니다.
"C++ 파서 메타 태그"쿼리를 입력하자마자 찾고 있던 모든 솔루션을 볼 수 있을 것이라고 생각했습니다.
그러나 실제로 모든 것이 조금 더 복잡합니다.
제가 한:
1) 단계를 준비하고 입력을 구문 분석하고 유효한 URL이 있는지 또는 텍스트만 있는지 결정합니다.
이 단계는 비용이 많이 드는 것 같습니다(입력에서 모든 것을 로드하는 것이 아니라
하지만 너무 추가 작업이라고 생각합니다)

static bool checkIsContainsHyperlink(QString line) {
    static QRegularExpression regex(web_pattern);
    QRegularExpressionMatch match = regex.match(line);
    return match.hasMatch();
}


2) 리디렉션을 처리하는 기능으로 다운로드
많은 사이트에서 간단한 웹 페이지에 태그를 제공하지 않으며 내가 모르는 이유로 리디렉션을 사용하는 경우가 많습니다.

connect(&m_WebCtrl, SIGNAL (finished(QNetworkReply*)), this, SLOT (fileDownloaded(QNetworkReply*)));
QNetworkRequest request(url);
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, true);
m_WebCtrl.get(request);


3) 다운로드한 페이지를 저장하는 것이 이상해 보입니다. 이 페이지를 저장하는 이유는 아마도 당신을 놀라게 할 것입니다.
문제는 일부 사이트에서 특정 IP를 차단할 수 있어 많은 요청이 발생한다는 것입니다.
저에게는 URL 라인에서 3-5개의 기호를 변경하는 것으로 충분했고 몇 분 동안 금지되었습니다.
다운로드한 페이지를 캐싱하면 이 문제가 해결되었습니다.

connect(m_downloader_image, &FileDownloader::downloaded, [&, imagePathName]() {
    QByteArray array = m_downloader_image->downloadedData();
    if(!array.isEmpty()) {
        QFile imageFile(imagePathName);
        if(imageFile.open(QIODevice::WriteOnly)) {
            imageFile.write(array);
            m_result.og_image_local_path = imagePathName;
        }
    }
    emit signalParserDone(m_result);
});


4) 파싱
이제 로컬 폴더에 웹 페이지가 있으므로 이를 구문 분석하고 필요한 것을 얻을 시간입니다.
불행히도 나에게 검보 파서는 매우 비우호적이었습니다.
그래서 먼저 정규식을 사용하기로 결정했고 나중에 다른 것으로 변경하기를 희망합니다.

QRegularExpression site_name_regex(og_site_name);
QRegularExpression title_regex(og_title);
QRegularExpression description_regex(og_description);
QRegularExpression url_regex(og_url);
QRegularExpression image_regex(og_image);
QRegularExpressionMatch match;

match = site_name_regex.match(html);
if (match.hasMatch()) {
    res.og_site_name = match.captured(1);
}
match = title_regex.match(html);
if (match.hasMatch()) {
    res.og_title = match.captured(1);
}
match = description_regex.match(html);
if (match.hasMatch()) {
    res.og_description = match.captured(1);
}
match = url_regex.match(html);
if (match.hasMatch()) {
    res.og_url = match.captured(1);
}
match = image_regex.match(html);
if (match.hasMatch()) {
    res.og_image = match.captured(1);
}


마지막으로 URL 주소를 입력하고 미리보기와 제목을 즐길 수 있습니다.



here is the complete example (github)

좋은 웹페이지 즐겨찾기