# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه > سوال: دانلود لینک های پسورد دار !

## sara66

سلام بعضی از لینک دانلودها برای دانلود یوزر و پسورد لازم دارن . تو دلفی باید چکار کرد تا یوزر و پسورد هم وارد کنه خود نرم افزار و بعد دانلود کنه ؟ اگر هم یوزر و پسورد اشتباه بود متوجه بشه اگه درست بود هم همینطور.مرسی

----------


## Felony

این UserName و Password تو یک صفحه وب ازتون درخواست میشه ، پس باید فیلدهای موجود در اون صفحه رو توسط برنامتون پر کنید و بعد صفحه رو برای دریافت لینک دانلود اصلی ارسال کنید ، در مورد پر کردن فیلدهای یک صفحه وب هم بارها بحث شده .

----------


## sara66

مرسی با نرم افزارهای دانلود منیجر که اون لینک را دانلود می کنم خودشون یک صفحه باز میکنن و یوزر و پس میخوان من هم میخوام بدون اینکه کاربر صفحه وب را ببینه و بدون اینکه آدرس لینک را بدونه فقط با وارد کردن یوزر و پس بتونه دانلود کنه ، وضعیت هم نشون بده که آیا یوزر پس درسته یا نه

----------


## firststep

خب من فکر می کنم این یوزر پس از طریق ftp وارد میشه نه از طریق htp 
چون زمانایی به این مساله بر می خوردم که داشتم با پروتکل ftp کار می کردم 
<< یعنی در حقیقت این یوزر پس امنیت ftp هستش که حتا برای خواندن نیز فعال شده>>>

هم توی این سایت وسایتایی دیگه مثالا و کامپوننتایه زیادی برای کار با ftp و جود داره

----------


## Felony

اگر پرتوکولی که باهاش ارتباط بر قرار میکنید FTP هست ( که بعید میدونم ) به وسیله کامپوننت های Indy میتونید به FTP مورد نظر متصل بشید و فایل رو دریافت کنید در غیر این صورت من تا به حال برنامه DM رو ندیدم که قابلیتی که گفتید رو داشته باشه ، شاید هم من دقت نکردم .

----------


## sara66

همین IDM ، خودش پنجره را میاره و یوزر و پس میخواد

----------


## sara66

این فایل که میخوام دانلود کنم یک فایل exe هست با idftp دانلود کنم ؟ بعد یوزر و پسورد موقع دانلود میگیره ؟

----------


## alinikaein

سلام دوست عزيز؛

معمولاً براي چنين مواردي، از کوکی‌ها استفاده می‌شه فکر می‌کنم.
احتمالاً دوستانی که طراحی سایت می‌کنند، بهتر بتونند راهنمایی کنند.


یا علی... موفق باشید...

----------


## sara66

یک وب بروزر روی صفحه گذاشتم و لینک دانلود را بهش دادم و خودش یک صفحه جدید باز کرد که یوزر و پسورد میخواست اگر بشه این صفحه را مخفی کرد و با کد نویسی فیلدها را پر کرد اونوقت مشکلم حل میشه

----------


## Felony

> این فایل که میخوام دانلود کنم یک فایل exe هست با idftp دانلود کنم ؟ بعد یوزر و پسورد موقع دانلود میگیره ؟


اگر FTP اون هاست در اختیارتون هست و User و pass رو دارید بله ولی اگر فقط یه لینک دانلود دارید خیر !




> سلام دوست عزيز؛
> 
> معمولاً براي چنين مواردي، از کوکی‌ها استفاده می‌شه فکر می‌کنم.
> احتمالاً دوستانی که طراحی سایت می‌کنند، بهتر بتونند راهنمایی کنند.
> 
> 
> یا علی... موفق باشید...


ربطی نداره !




> یک وب بروزر روی صفحه گذاشتم و لینک دانلود را بهش دادم و خودش یک صفحه جدید باز کرد که یوزر و پسورد میخواست اگر بشه این صفحه را مخفی کرد و با کد نویسی فیلدها را پر کرد اونوقت مشکلم حل میشه


صفحه چی باز کرد ؟ اگر صفحه وب بود با همون روشی که گفتیم میتونید درستش کنید .

----------


## Mahmood_M

> این فایل که میخوام دانلود کنم یک فایل exe هست با idftp دانلود کنم ؟ بعد یوزر و پسورد موقع دانلود میگیره ؟


User و Pass مربوط به آدرس هاستی هست که فایل روی اون قرار گرفته ، شما اول باید به آدرس اصلی با نام کاربری و رمز عبور متصل بشید و بعد می تونید فایل رو توسط IdHttp یا IdFTP دانلود کنید ( هم اتصال و هم دانلود با IdHttp و IdFTP ) ، راه دیگه استفاده از WinInet هست که نیاز به ورود به هاست اصلی نیست و می تونید با داشتن لینک و رمز و نام کاربری فایل رو دریافت کنید ، اینجا یک نمونه قرار داده شده ...



> بعد یوزر و پسورد موقع دانلود میگیره ؟


خودتون باید در هنگام اتصال به آدرس سایت ، User و Pass رو در خصوصیات IdHttp یا IdFTP ست کنید ...



> سلام دوست عزيز؛
> 
> معمولاً براي چنين مواردي، از کوکی‌ها استفاده می‌شه فکر می‌کنم.
> احتمالاً دوستانی که طراحی سایت می‌کنند، بهتر بتونند راهنمایی کنند.
> 
> 
> یا علی... موفق باشید...


کوکی ها زمانی کاربرد دارن که یک بار شما توی سایت با User و Pass لاگین کنید و اطلاعات کاربریتون توسط مرورگر و به دستور سایت ! در کامپیوتر ذخیره بشه تا در دفعات بعدی اطلاعات کاربری شما از روی اون کوکی ها خونده بشه ، در غیر اینصورت کوکی ها کاربردی ندارن ...

موفق باشید ...

----------


## sara66

مرسی من لینکی که دادین رو نگاه گردم ، لینک دانلود من http هست نه https ، سورس همون صفحه را کپی کردم تو دلفی کلی ایراد گرفت اولیش به HInternet گیر داد.
من یوزر و پس FTP را ندارم فقط هروقت لینک دانلود را به IDM میدم یا تو IE میزنم یک پنجره کوچیک باز میشه و یوزر و پس را سوال میکنه و بعد دانلود میشه

----------


## Mahmood_M

> سورس همون صفحه را کپی کردم تو دلفی کلی ایراد گرفت اولیش به HInternet گیر داد


باید یونیت WinInet رو به قسمت Uses اضافه کنید ، بعد می تونید با دادن آدرس فایل ( URL ) و Userو Pass و مسیر ذخیره فایل ( FileName ) ، فایل مورد نظرتون رو دانلود کنید ...
البته تا زمان دانلود شدن فایل ، برنامه Freez میشه ، ولی می تونید از یک Thread جداگانه برای دانلود استفاده کنید ، یک نمونه ی ساده ضمیمه کردم ، موفق باشید ...

----------


## sara66

مرسی بازم کار نمیکنه یعنی اجرا میشه و من یوزر و پس درست را میزنم مینویسه دانلود کامل شد اما فایل را که با نوتپد باز میکنم اینارو نوشته :


<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>

----------


## vcldeveloper

> مرسی بازم کار نمیکنه یعنی اجرا میشه و من یوزر و پس درست را میزنم مینویسه  دانلود کامل شد اما فایل را که با نوتپد باز میکنم اینارو نوشته


ببینید، روش های مختلفی برای تایید مجوز دسترسی در HTTP وجود داره. اینطوری هم نیست که یکی بگه این کار رو بکن، یکی دیگه بگه اون کار رو بکن. هر سایتی مکانیزم خودش رو داره. شما باید اول تحقیق کنید، ببینید اون سایت از چه روشی برای تعیین دسترسی استفاده میکنه. یک سایت میتونه ابتدا شما رو redirect کنه به یک HTML Form، و سپس بعد از دریافت مقدار از طریق فرم، شما رو redirect کنه به لینک دانلود اصلی. یک سایت ممکنه شما به یک HTML Form تغییر مسیر بده، و داده های لازم را در یک Cookie ذخیره کنه، سپس از طریق اون Cookie دسترسی شما رو تایید کنه. یک سایت ممکنه از طریق HTTP Header این کار رو انجام بده.

در مورد شما، احتمال استفاده از HTTP Header بیشتر هست. اگر استفاده از HTTP Header باشه، شما باید در هنگام ارسال درخواست، username\password رو هم به عنوان Header ارسال کنید. 

می تونید وضعیت اون سایت رو با استفاده از ابزارهایی مثل WireShark بررسی کنید؛ با استفاده از WireShark می تونید داده های ارسالی در شبکه رو برای پروتکل های مختلف مانیتور کنید. کافی مانیتورینگ رو شروع کنید، و لینک مربوطه رو در مرورگرتون باز کنید، ببینید مرورگر شما username\password رو به چه صورت به سایت ارسال میکنه. شما هم همون رفتار رو با استفاده از کد انجام بدید.

وقتی مشخص شد که سایت شما داره با چه روشی مجوز رو بررسی میکنه، میشه شما رو راهنمایی کرد که چطور از اون روش استفاده کنید. وگرنه هر چیزی که اینجا گفته میشه، حدس و گمان هست.

----------


## Felony

> باید wireshark را نصب کنم


بله ، Wireshark یه برنامه هست که شبکه رو به وسیله WinPCap مانیتور میکنه : http://www.wireshark.org/download.html

----------


## sara66

نصب کردم اجرا هم کردم .کلی رکورد نشون میده هیچی نمیشه فهمید که کدوم مال این لینک هست !

----------


## vcldeveloper

> نصب کردم اجرا هم کردم .کلی رکورد نشون میده هیچی نمیشه فهمید که کدوم مال این لینک هست !


شما باید فعالیت های اضافی شبکه تون (مثل دانلود فایل و سایت و غیره) رو متوقف کنید، و بعد از اجرای عملیات مورد نظرتون، Capture را در WireShark غیرفعال کنید، و به بررسی log ایجاد شده بپردازید. می تونید داده های دریافتی را به شکل های مختلفی فیلتر کنید. مثلا در این مورد، شما فقط به داده های HTTP نیاز دارید، نه به داده های پروتکل های دیگه. در هر حال، باید راهنمای WireShark رو مطالعه کنید.

در این مورد خاص، من براتون بررسی اش رو انجام دادم:

وقتی یک مرورگر لینک مربوطه رو باز میکنه، یک درخواست HTTP GET صادر میکنه.
سرور در جواب این درخواست، کد 401 رو که از نظر HTTP به معنای لزوم ارائه مجوزهای مناسب هست، برگشت میده.
وقتی شما کد 401 دریافت می کنید، باید درخواست تون رو مجددا به سرور ارسال کنید، ولی این بار باید در Header درخواست HTTP تون اطلاعات مربوط به مجوز را هم درج کنید، تا سرور بتونه مجوز شما را بررسی کنه.
اطلاعات مربوط به مجوز شما باید در یک فیلد با نام Authorization در HTTP Header قرار بگیره. 

در صورتی که از IdHTTP برای دریافت فایل استفاده می کنید، خودش در صورت دریافت کد 401، یک رویداد با نام OnAuthorization رو فراخوانی میکنه. این رویداد دو پارامتر مهم داره:
Authentication؛ که اطلاعاتی درباره نوع Authentication و مقادیر پارامترهای اون رو برگشت میده، و می تونید در این رویداد مقادیر پارامترهای اون رو تغییر بدید.
Handled؛ که مشخص میکنه آیا شما پردازش تان را با موفقیت انجام دادید، یا اینکه باید عملیات مربوطه با شکست مواجه بشه.

شما باید در این رویداد به فیلدهای Username و Password از پارامتر Authorization مقدار مناسب بدید، و مقدار Handled را هم True کنید.

IdHttp تا زمان خوانده شدن متن برگشتی از سرور، درخواست جدید رو (که حاوی اطلاعات مورد نظر هست) ارسال نمیکنه. برای اینکه این کار رو به طور خودکار بعد از اجرای OnAuthorization انجام بده، باید مقدار hoInProcessAuth رو در خصوصیت HttpOptions آن True کنید. به این ترتیب، درخواست HTTP GET جدید با username\password ایی که شما دادید، به سرور ارسال میشه.

دقت کنید که همه سایت ها لزوما از این روش برای اعتبارسنجی کاربر استفاده نمی کنند. این یکی از حالت های ممکن هست.

در ضمن، اگر دلفی نوع داده TIdAuthentication رو نمیشناسه، یونیت IdAuthentication را به لیست uses یونیت خودتان اضافه کنید.

----------


## sara66

مرسی خیلی کامل بود زحمت کشیدید مرسی
من یک باتون دارم اینم کدش : 

  IdHTTP1.Get(URL);


این هم کد idhttp :




procedure TForm1.IdHTTP1Authorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
  Authentication.Username:=USER;
  Authentication.Password:=Pass;
  Handled:=True;
end;




چه یوزر و پس را درست بدم و چه اشتباه بدم هنگ میکنه hoInProcessAuth را هم True کردم 
یک جوری نیاز دارم که اگر یوزر و پس اشتباه بود یا درست بود بتونم تشخیص بدم

----------


## vcldeveloper

> چه یوزر و پس را درست بدم و چه اشتباه بدم هنگ میکنه hoInProcessAuth را هم True کردم


خب، اون مشکلش به این خاطر هست که شما دارید کد رو در Thread اصلی اجرا می کنید. وقتی این کد شروع به دریافت فایل کنه، تا زمان پایان دانلود، شما عملا نمی تونید کار دیگه ایی در اون Thread انجام بدید.

اگر میخواید هنگ نکنه، باید به فکر ایجاد یک Thread جدید و محول کردن کار دانلود فایل به اون Thread باشید.




> یک جوری نیاز دارم که اگر یوزر و پس اشتباه بود یا درست بود بتونم تشخیص بدم


اگر username\password اشتباه باشه، IdHttp خودش یک Exception ارسال میکنه. شما می تونید با یک try-except و بررسی نوع کلاس Exception تولید شده، این مورد رو مدیریت کنید.

----------


## sara66

> اگر username\password اشتباه باشه، IdHttp خودش یک Exception ارسال میکنه. شما می تونید با یک try-except و بررسی نوع کلاس Exception تولید شده، این مورد رو مدیریت کنید.


مرسی اما اگر دفعه اول یوزر و پس اشتباه وارد بشه و پیغام خطا بده دفعه دوم اگر درست هم وارد بشه باز هم همون پیغام را میده !
من رویداد OnAuthorization را چک کردم و این رویداد فقط دفعه اول فراخوانی میشه و اگر دوباره یوزر و پس درست را هم بدی باز هم این رویداد اصلا فراخوانی نمیشه 


procedure ChSerial(User:string;Pass:string);
begin
  MUser:=User;
  MPass:=Pass;
  try
    MainForm.IdHttpChSerial.Get(URL);
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ChSerial(Edit1.Text,Edit2.Text);
end;

procedure TMainForm.IdHttpChSerialAuthorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
  Authentication.Username:=MUser;
  Authentication.Password:=MPass;
  Handled:=True;
end;




این فقط یوزر و پس را برای یک بار قبول میکنه ! یعنی شما دفعه دوم که روی باتون کلیک کنید دیگه اصلا یوزر و پس چک نمیشه !

----------


## vcldeveloper

> این فقط یوزر و پس را برای یک بار قبول میکنه ! یعنی شما دفعه دوم که روی باتون کلیک کنید دیگه اصلا یوزر و پس چک نمیشه !


یک بار که اطلاعات Authorization داده میشه، تا زمانی که IdHttp.Request از بین نرفته، یا فیلدهاش پاک نشدند، از همون اطلاعات قبلی استفاده میکنه. چک کردم، دیدم به جای اینکه مستقیما از طریق OnAuthrization مقدار بدید، می تونید از خصوصیات IdHttp.Request.UserName و IdHttp.Request.Password استفاده کنید. هر بار که میخواید فایل را دانلود کنید، قبل از فراخوانی متد Get، می تونید به این خصوصیات مقدار بدید. در این حالت، مشخصات مربوط به لاگین هر بار قبل از دریافت فایل تنظیم میشه، و مشکل شما هم برطرف میشه.

----------


## sara66

مرسی اما بازم کار نمیکنه

----------


## vcldeveloper

> مرسی اما بازم کار نمیکنه


من با username\password خودتون چک کردم، و بدون مشکل کار کرد، چه در صورتی که از ابتدا اطلاعات را درست وارد کنید، و چه در زمانی که اطلاعات را ابتدا اشتباه وارد کنید، و سپس اصلاح کنید.

----------


## sara66

IdHttp.Request.UserName:=User;
  IdHttp.Request.Password:=Pass;
  try
    MainForm.IdHttp.Get(URL);
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;



من این را نوشتم باز هم مثل اول بود

----------


## vcldeveloper

> من این را نوشتم باز هم مثل اول بود


Exception های Indy را با استفاده از این نوع از try-except ها که بدون انجام کار خاصی، همه Exception ها را خفه می کنند، خفه نکنید. Indy برای بسیاری از امورش به Exception های خودش وابسته هست.

try-except شما هیچ کار خاصی انجام نمیده، صرفا یک پیغام خطا نمایش داده میشه، که بدون وجود try-except شما هم نمایش داده میشد.

----------


## tadeh2010

سلام دوستان بعد از n سال من هم همین مشکل را دارم
خوب من همه ی کدها را امتحان کردم ولی درست نشد
این خواهر محترم کارشون بدون نتیجه ماند؟
چی شد؟
لطفا کمکم بکنید :افسرده:

----------

