2017-12-27 9 views
1

私は人のツイートを受け取り、画像が含まれている場合はダウンロードします。

私はこのURLから画像をダウンロードすることができますなぜ (例1)このURLから
http://www.google.co.id/intl/en_com/images/logo_plain.png
そしてません(例2)
https://www.google.com/imgres?imgurl=https://pbs.twimg.com/media/DR-kkH4XcAAQ-vc.jpg&imgrefurl=https://twitter.com/officialmcafee/status/945655402276024320&h=1200&w=992&tbnid=0q3B6ZB_UxjRIM&tbnh=247&tbnw=204&usg=__xvjbjSSMvuImESBLVvBBrUagUe8=&docid=vdqkoUmaefYoFM

例#1libcurlでTwitterから画像をダウンロードするC++

#include <iostream> 
#include <curl/curl.h> 

using namespace std; 
int main() 
{ 
    CURL *image; 
    CURLcode imgresult; 
    FILE *fp = nullptr; 
    const char *url = "http://www.google.co.id/intl/en_com/images/logo_plain.png"; 
    image = curl_easy_init(); 
    if (image) 
    { 
     // Open file 
     fp = fopen("img.png", "wb"); 
     if (fp == NULL) cout << "File cannot be opened"; 

     curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL); 
     curl_easy_setopt(image, CURLOPT_WRITEDATA, fp); 
     curl_easy_setopt(image, CURLOPT_URL, url); 
     // Grab image 
     imgresult = curl_easy_perform(image); 
     if (imgresult) 
      cout << "Cannot grab the image!\n"; 
    } 
    // Clean up the resources 
    curl_easy_cleanup(image); 
    // Close the file 
    fclose(fp); 
    system("pause"); 
    return 0; 
} 

例2

#include <iostream> 
#include <curl/curl.h> 

using namespace std; 
int main() 
{ 
    CURL *image; 
    CURLcode imgresult; 
    FILE *fp = nullptr; 
    const char *url = "https://www.google.com/imgres?imgurl=https://pbs.twimg.com/media/DR-kkH4XcAAQ-vc.jpg&imgrefurl=https://twitter.com/officialmcafee/status/945655402276024320&h=1200&w=992&tbnid=0q3B6ZB_UxjRIM&tbnh=247&tbnw=204&usg=__xvjbjSSMvuImESBLVvBBrUagUe8=&docid=vdqkoUmaefYoFM"; 
    image = curl_easy_init(); 
    if (image) 
    { 
     // Open file 
     fp = fopen("img.png", "wb"); 
     if (fp == NULL) cout << "File cannot be opened"; 

     curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL); 
     curl_easy_setopt(image, CURLOPT_WRITEDATA, fp); 
     curl_easy_setopt(image, CURLOPT_URL, url); 
     // Grab image 
     imgresult = curl_easy_perform(image); 
     if (imgresult) 
      cout << "Cannot grab the image!\n"; 
    } 
    // Clean up the resources 
    curl_easy_cleanup(image); 
    // Close the file 
    fclose(fp); 
    system("pause"); 
    return 0; 
} 
+1

Googleから明らかに「HTTP」リダイレクトを取得している可能性が高いためです。 libcurlに精通していないが、 'HTTP'リダイレクトに自動的に従うように設定できるオプションがある可能性があります。そうでない場合は、Googleの応答から実際のURLを抽出し、実際のURLからダウンロードしようとするより多くの作業をしなければなりません。 –

+0

@SamVarshavchikしかし、元の画像のアドレスを使用しても、https://pbs.twimg.com/media/DR-kkH4XcAAQ-vc.jpgはまだ動作しません。 – user9143463

+0

私は何の問題もありませんでした。 curlコマンドラインクライアントを使用して、コメントに含まれているURLから画像をダウンロードします。私が言ったように、私はlibcurlに精通していません。簡単なGoogleの検索でlibcurlのドキュメントが見つかりました。そして、 'curl_easy_setopt()'のドキュメントを読んでコードを見ると、何もダウンロードしないのは明らかです。それはあなたがライブラリにするように言ったものです。何もダウンロードしません。 'CURLOPT_WRITEFUNCTION'を' NULL'に設定します。あなたがダウンロードしたすべてのものを無視するようにライブラリに指示したようです(書き込み機能はありません)。それで何が起こると思いますか? –

答えて

0

まず、この画像へのリンクはありません。これはhtmlページです。注:あなたのコードはページを参照していますが、のhtmlページの画像はダウンロードしていません。

第2に、リダイレクトを行っていません。 1より多くのオプションを追加します。私は両方のオプションを追加すると

curl_easy_setopt(image, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"); 

が、私はあなたのリンクをダウンロードするために管理:

curl_easy_setopt(image, CURLOPT_FOLLOWLOCATION, 1); 

第三には、ブラウザのふりをする方が良いと思います。

関連する問題