作者 主題: 如何回應伺服器要求輸入帳號密碼  (閱讀 37782 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何回應伺服器要求輸入帳號密碼
« 回覆 #30 於: 2007-05-07 22:54 »
練功嗎? 把 http 的 RFC 文件看一看吧.
不是練功的話, 拿 wget/curl 出來用吧. 又簡單又快.
一定要用 C 來做? wget/curl 也都有 source code, 拿出來改也不是難事.

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
如何回應伺服器要求輸入帳號密碼
« 回覆 #31 於: 2007-05-08 14:23 »
hoyo大收到pm了嗎???
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
如何回應伺服器要求輸入帳號密碼
« 回覆 #32 於: 2007-05-08 14:47 »
抓到了抓到了^^!

發現是我之前的GET下錯了,所以用之前改curl範例的函數下去做GET的部分,結果就可以抓到他們的首頁了

而POST的部分還是用一搬上傳動作,照抄封包即可

發現他這個眉角只在於剛進去的時候會發下來一個封包,裡面含了我上傳去的帳號密碼的編碼

以後在每次有要GET或POST都必須帶這一個經過編碼的uid或mid(mid不是每次需要)

從失敗的地方開始:
代碼: [選擇]

strcat(str,"POST /app/member/index_header.php HTTP/1.1\r\n");
.....
.....
strcat(str,"uid=");
strcat(str,getuid);
strcat(str,"&langx=zh-tw&mid=");
strcat(str,getmid);
strcat(str,"&Submit=%26nbsp%3B%26nbsp%3B%26nbsp%3B%A7%DA%A6P%B7N%26nbsp%3B%26nbsp%3B%26nbsp%3B\n");

在POST回去"我同意"以後應該要再一個GET取得一個封包,不過之前的做法(照抄抓下來的封包)
很像怎麼改都不行,於是從頭第一個封包開始研究起來發現,之前兩個動作都是用cURL官網
的範例修改出的函數去抓取,不過實際上在開始時是有很多GET動作的,所以昨晚將原本的
GET改成範例改的函數去做POST完的GET就抓到在首頁與該POST中間的那一個封包了
而之前失敗猜想是因為SERVER呆掉(我沒向它完整的GET要求)
代碼: [選擇]

printf("\n*-*-*-*-*-*-*-*-*-* 接 收 server 的 封 包 *-*-*-*-*-*-*-*-*-*\n");
/*有需要GET的部份用範例005比較容易*/
memset(str,'\0',4096);
sprintf(str,"http://xxxxx.com/app/member/index_header.php");
curl_examp_005(str,NULL);
printf("\n*-*-*-*-*-*-*-*-*-* 封 包 接 收 完 畢 *-*-*-*-*-*-*-*-*-*\n");

printf("\n*-*-*-*-*-*-*-*-*-* 接 收 server 的 封 包 *-*-*-*-*-*-*-*-*-*\n");
/*有需要GET的部份用範例005比較容易*/
memset(str,'\0',4096);
sprintf(str,"http://xxxxx.com/app/member/header_mem.php?langx=zh-tw&uid=%s&session=BK",
        getuid);
curl_examp_005(str,NULL);
printf("\n*-*-*-*-*-*-*-*-*-* 封 包 接 收 完 畢 *-*-*-*-*-*-*-*-*-*\n");

上面那個就是收到神秘封包的,下面這個就取到首頁了

這個是修改cURL官網範例的函數
http://curl.haxx.se/lxr/source/docs/examples/getinmemory.c
說是修改其實完全沒改到,只是加一些東西進去而已^^!
代碼: [選擇]

int curl_examp_005(char *urlstr,char *dafph)
{
  CURL *curl_handle;
  struct MemoryStruct chunk;


  int i;
  char *s;

printf("\n=.=[005] 以範例getinmemory.c將取得的網頁放在記憶體內 [005]=.=\n");
  chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
  chunk.size = 0;    /* no data at this point */
printf("頁面取得自%s [%s]\n",urlstr,dafph);
  curl_global_init(CURL_GLOBAL_ALL);

  /* init the curl session */
  curl_handle = curl_easy_init();

  /* specify URL to get */
  curl_easy_setopt(curl_handle, CURLOPT_URL,/*"http://curl.haxx.se/"*/urlstr);

  /* send all data to this function  */
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

  /* we pass our 'chunk' struct to the callback function */
  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);

  /* some servers don't like requests that are made without a user-agent
     field, so we provide one */
  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,/*"libcurl/c/example.html"*/dafph);
printf("....向伺服器要求資料取得中,請稍待.....\n");
  /* get it! */
  curl_easy_perform(curl_handle);

  /* cleanup curl stuff */
  curl_easy_cleanup(curl_handle);

  /*
   * Now, our chunk.memory points to a memory block that is chunk.size
   * bytes big and contains the remote file.
   *
   * Do something nice with it!
   *
   * You should be aware of the fact that at this point we might have an
   * allocated data block, and nothing has yet deallocated that data. So when
   * you're done with it, you should free() it as a nice application.
   */
printf("========== chunk.size=%d ==========\n",chunk.size);

  for(i=0;i<chunk.size;i++)
    printf("%c",*(chunk.memory+i));

  if(chunk.memory)
    free(chunk.memory);

printf("\n=.=[005] 以範例getinmemory.c將取得的網頁放在記憶體內 [005]=.=\n");
  return(1);
}


非常感謝大家熱心的解答,萬分感謝^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4047
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
如何回應伺服器要求輸入帳號密碼
« 回覆 #33 於: 2007-05-08 18:52 »
引述: "stlee"
hoyo大收到pm了嗎???


沒收到,不過看起來你已經解決了,解決了就好 ^^
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
如何回應伺服器要求輸入帳號密碼
« 回覆 #34 於: 2007-05-08 18:59 »
現在好像在玩game的感覺...一關一關過^^!

雖然現在已經解決到這裡了,感覺下面還好多關卡^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼