読者です 読者をやめる 読者になる 読者になる

たった80行のコードでひたすらアイドル水着画像をあつめる(C言語だよ)

こないだたった3行のコードでひたすらアイドル水着画像をあつめる(Rubyだよ)というネタエントリを書いたのだけど、これC言語で書いたらどうなるのだろうと思ったのでやってみた。ということで、今年最後のエントリはC言語で締めくくる!やだカッコいい!漢!

・でも、C言語触るの初めてなので、ちょっと自信ない。。。
ここを参考にというか、ほぼまるパクリで書いた。。。
C言語正規表現使うのに挫折したので、シェルで逃げた。。。
macでないと動かない(openコマンドでhtml表示するので)。。。

fetch_naver.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

#define MAX_BUF 524288

char res[MAX_BUF + 1]; /* 取得した文字を格納する文字配列 */
int  res_i; /* 取得した文字配列のカレントインデックス */

size_t
handle_response(char *curl_ptr, size_t size, size_t nmemb, void *userdata)
{
  /* curl_ptrが指すデータのサイズ */
  int segsize = size * nmemb;

  /* 規定サイズより大きくなった場合 */
  if (res_i + segsize > MAX_BUF) {
    *(int *)userdata = 1; //wr_errorを1に
    return 0;
  }

  /* 取得データを文字配列に追加 */
  memcpy((void *)&res[res_i], curl_ptr, (size_t)segsize);

  /* 文字配列のカレントサイズをインクリメント */
  res_i += segsize;

  /* 文字配列の現在のインデックスが指し示す文字を0に。文字列の終端の処理? */
  res[res_i] = 0;
 
  /* libcurlにバイト数を返す。データが取り込まれたことが伝えられ、libcurlはそのデータを破棄する */
  return segsize;
}

int
main(void)
{
  CURL *curl;
  CURLcode res_status;
  int  wr_error;

  wr_error = 0;
  res_i = 0;

  /* curl初期化 */
  curl = curl_easy_init();
  if (!curl) {
    printf("curlの初期化に失敗しました\n");
    return 0;
  }

  /* curlのオプションをセット */
  curl_easy_setopt(curl, CURLOPT_URL, "http://matome.naver.jp/odai/2135350364969742801");
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&wr_error);
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, handle_response);

  /* 取得 */
  res_status = curl_easy_perform( curl );

  /* 結果ステータス表示 */
  printf( "res_status = %d (write_error = %d)\n", res_status, wr_error );

  /* 正常に読み込んだ場合、パイプでシェルにつないで置換処理をした後、htmlとして保存し、ブラウザで開く */
  if (res_status == 0) {
    char *cmd;
    FILE *pipe;
    cmd = "grep 'MTMItemThumb' | sed -e 's/<\\/a>//g' > naver.html | open naver.html";
    pipe = popen(cmd, "w");
    fputs(res, pipe);
    pclose(pipe);
  }

  /* curlをクリーンアップ */
  curl_easy_cleanup( curl );

  return 0;
}

ビルド&実行

$ gcc fetch_naver.c -lcurl
$ ./a.out

うほ!


にしても...

長い!

やっぱRubyだお(^ω^)

ということで、来年もよろしくお願いしますm(__)m