数日間、画像を画像ホスト (imgur.com) にリモートアップロードするプログラムを作成しようとしました。Wireshark を使用して、ブラウザーから送信された http 要求をスニッフィングし、同様のヘッダーとパラメーターを使用して HttpWebRequest を作成しました。しかし、サーバーはいつも何か奇妙なものを私に送り返してきます。コードを見てください (このコードは単純化されています):
static void Main(string[] args)
{
ServicePointManager.Expect100Continue = false;
CookieContainer cc = new CookieContainer();
List<string> formData = new List<string>();
//The first request - login
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://imgur.com/signin");
configRequest(request, cc);
//add POST params
add(formData, "username", "abcdefgh"); //this is a working account,
add(formData, "password", "abcdefgh"); //feel free to use it if you
add(formData, "remember", "remember"); //want to test
add(formData, "submit", "");
writeToRequestStream(request, formData);
//send request
request.GetResponse();
//The second request - remote upload image
request = (HttpWebRequest)WebRequest.Create("http://imgur.com/upload?sid_hash=9efff36179fef47dc5e078a4575fd96a");
configRequest(request, cc);
//add POST params
formData = new List<string>();
add(formData, "url", "http://img34.imageshack.us/img34/8425/89948070152259768406.jpg");
add(formData, "create_album", "0");
add(formData, "album_title", "Optional Album Title");
add(formData, "album_layout", "b");
add(formData, "edit_url", "0");
writeToRequestStream(request, formData);
//send request
Stream s = request.GetResponse().GetResponseStream();
StreamReader sr = new StreamReader(s);
string html = sr.ReadToEnd();
sr.Close();s.Close();
Console.WriteLine(html + "\n\n");
}
static void add(List<string> formData, string key, string value)
{
formData.Add(HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value));
}
static void configRequest(HttpWebRequest request, CookieContainer cc)
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.CookieContainer = cc;
request.Credentials = CredentialCache.DefaultCredentials;
request.Accept = "*/*";
request.KeepAlive = true;
request.Referer = "http://imgur.com/";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15";
request.Headers.Add("Accept-Language", "en-us,en;q=0.5");
request.Headers.Add("Accept-Encoding", "gzip,deflate");
request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
request.Headers.Add("Keep-Alive", "115");
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
request.Headers.Add("Pragma", "no-cache");
request.Headers.Add("Cache-Control", "no-cache");
}
static void writeToRequestStream(HttpWebRequest request, List<string> formData)
{
//build request stream
string queryString = String.Join("&", formData.ToArray());
byte[] byteArray = Encoding.UTF8.GetBytes(queryString);
//write to stream
request.ContentLength = byteArray.Length;
Stream rs = request.GetRequestStream();
rs.Write(byteArray, 0, byteArray.Length);
rs.Close();
}
ここで、アップロード リクエスト (2 番目のリクエスト) をスニッフィングし、ブラウザのリクエストと比較します。違いは 2 つだけです。
ブラウザの「接続」ヘッダー =「キープアライブ」ですが、私のものは存在しません (request.Keep-alive が「true」に設定されていますが、理由はわかりません)
一部のブラウザの Cookie は、私のブラウザには表示されません。
応答は、次のような JSON である必要があります。
{"hashes":"[\"QcvII\"]","hash":"QcvII","album":false,"edit":false}
しかし、サーバーは特殊文字の山によって私の要求に応答します...上記の2つの違いのどれが私のコードを機能させないのかわかりません。このコードを機能させるのを手伝っていただければ、非常に感謝しています。私は初心者なので、私のコードや式がばかげている場合でも、私を責めないでください。
このコードを機能させるのを手伝ってくれる人はいますか?
P/S: 私は .net フレームワーク 4 を使用しています