آموزش کار با CURL در PHP

درود دوستان عزیز با آموزش کار باد توابع CURL در PHP در خدمتتون هستم .

در اینجا تلاش می کنم که آموزش هارو از مبتدی تا پیشرفته آماده کنم و قرار بدم .

در واقع Curl یک بسته به صورت اکستنش هست که روی php نصب میشه.

اگر در ویندوز هستید این بسته با نام php_curl.dll و اگر در لینوکس هستید با نام curl.so موجود می باشد .

از طریق php.ini می تونید این بسته رو فعال کنید که بتونید ازش استفاده کنید .

در آخر هم سعی می کنم چند برنامه کاربردی بنویسیم.

سپاس

در واقع CURL یک اکستنشن پر سرعت و قوی موجود در php است که با استفاده از اون می تونیم اطلاعات رو مانند یک مرورگر بفرستیم و بگیرم , تغییرات درونش بدیم , فیلتر کنم و …. .

با استفاده از CURL میشه برنامه هایی مثل اسکنر ها و اکسپلویت ها و … بنویسیم .

می تونم بگم که درواقع CURL 3 بخش عمده و اصلی داره .

1 – تعریف و مقدار دهی اولیه initialize

2 – بدنه curl که شامل اپشن ها و فیلتر ها و … میشه

3 – بستن و اتمام CURL

که هر یک رو به صورت مفصل توضیح خواهم داد .

نکته : برای آموزش CURL باید php رو بلد باشد 😉

خب حالا بریم سراغ کد نویسی .

خب برای مقدار دهی اولیه از تابع

1 curl_init()

استفاده میشه

این تابع یک کد منبع رو بر میگردونه

و می تونه آدرس لینکی که قرار هست باهاش رو کار کنیم بگیره یعنی این آرگومان اختیاری هست و میتونه چیزی داخلش نباشه

مثال :

1$ch = curl_init();
1Or
1$ch = curl_init(“http://google.com”);

هر دو درست هست .

قسمت بدنه که شامل آپشن های curl می باشه با تابع

1 curl_setopt(resoure,option,value)

صورت میگیرید

1curl_setopt() 

3 پارامتر رو دریافت میکنه

پارامتر اول کد منبعی که توسط تابع curl_init() ساخته شده

پارامتر دوم آپشن مورد نظر

و پارامتر سوم مقدار

برای مثال :

1$ch = curl_init("http://google.com");
1curl_setopt($ch,CURLOPT_HEADER,1);

که ما در اینجا بهش میگیم که ما هدر لینک رو میخوایم دریافت کنیم . مقدار 1 رو بهش دادیم

خب بعد از اینکه آپشن های مورد نظر اضافه شد باید برنامه رو اجرا کنیم که برای اجرای curl از تابع

1curl_exec(resource)

استفاده میشه .

این تابع کد منبع رو گرفته و آپشن هاشو اجرا میکنه و همچنین موارد مورد نیاز رو بر می گردونه

برای مثال :

1$ch = curl_init("http://google.com");
1curl_setopt($ch,CURLOPT_HEADER,1);
1$result = curl_exec($ch);

کد بالا درخواست به سایت گوگل می فرسته و هدر هار میگیره و میریزه توی متغییر $result

حال اگر echo $result بنویسیم میتونیم هدر رو مشاهده کنیم .

مر حله آخر هم اتمام کار curl است که با

1curl_close(resource)

انجام میگیره

این تابع کد منبع رو بع عنوان آرگومان دریافت میکنه و به اون خاتمه میده .

خب اگر امتحان کرده باشید اگر کد بالا رو به صورت زیر هم می نوشتیم باز هم همون نتیجه رو می داد

1$ch = curl_init("http://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1 curl_exec($ch);
1curl_close($ch);

اما چرا ؟ دلیلش همون آپشن های موجود در curl هست که باید رعایت کنید.

اگر می خواهید این اتفاق نیوفته باید مقدار CURLOPT_RETURNTRANSFER را در آپشن true قرار بدید . اینطور خروجی به صورت رشته در میاد به جای اینکه مستقیم در خروجی شما ظاهر بشه.

پس کد بالا رو به کد زیر تغییر می دیم

1$ch = curl_init("http://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1$result = curl_exec($ch);
1curl_close($ch);

حال اگر کد بالا رو اجرا کنید خرجی صفحه سفید هست . دلیلش هم اینه که دیگه مقدار بازگشی به صورت رشته شده و داخل متغییر$result ریخته شده و حالا اگر مایل باشید روی صفحه نمایش نشان بدید باید اونو echo کنید.

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

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

خب باید از آپشن CURLOPT_NOBODY کمک بگیرید . اگر مقدار این آپشن رو true قرار بدید باعث میشه دیگه صفحه سایت (بدنه سایت) لود و بازگردانده نشود. به کد زیر توجه کنید

1$ch = curl_init("http://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_NOBODY,1);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

اگر کد بالا رو اجرا کنید خروجی شبیه خروجی زیر مشاهده می کنید

1HTTP/1.1 200 OK Date: Sun, 02 Aug 2015 08:47:45 GMT Server: Apache X-Powered-By: PHP/5.3.29 Cache-Control: private Pragma: private Set-Cookie: bb_lastvisit=1438505265; expires=Mon, 01-Aug-2016 08:47:45 GMT; path=/cc/ Set-Cookie: bb_lastactivity=0; expires=Mon, 01-Aug-2016 08:47:45 GMT; path=/cc/ Connection: close Content-Type: text/html; charset=UTF-8  

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

این همون چیزی هست که مثلا برای ادیمن فایندر ها و یا اسکنر ها استفاده می شود (برای برخی اهداف از این روش استفاده می شود و چون بحث ما در مورد اسکنر ها نیست توضیح بیشتر نمیدم)

خب کد بالا یعنی چه ؟ یعنی آقای curl برو به سایت ۱- هدرش رو برام بیار ۲- مقدار بازگشتیت به صورت رشته باشه و مستقیم توی خروجی من چاپ نکن ۳ – بدنه سایت رو بهش نیاز ندارم و برام لود نکن

اگر از echo $result; استفاده نمی کردم خروجی چاپ نمیشد چون مقدار بازگشتی الان توی اون متغییر هست و هر کاری که با رشته های دیگه میشه کرد با اینم میشه انجام داد.

خب اگر دقت کرده باشید سایت ما با http:// شروع می شد اگر کد بالا رو با سایتی که https:// هست اجرا کنید با کمال تعجب در خرجی چیزی نمی بینید.

برای اجرای سایت های دارای https:// باید از ۲ آپشن CURLOPT_SSL_VERIFYPEER و CURLOPT_SSL_VERIFYHOST کمک بگیریم.

در واقع CURLOPT_SSL_VERIFYHOST اگر مقدار ۱ رو بدیم بهش فقط گواهی ssl رو چک میکنه و اگر ۲ رو بدیم هم گواهی رو چک میکنه و هم چک میکنه که بانام میزبان منطبق باشه.(اگر برای قسمت مهمی استفاده می کنید این گزینه رو ۲ بزارید)

CURLOPT_SSL_VERIFYPEER

اگرfalse باشه برای گواهی تاییده نمی گیره

خب چون بحث ما در باره نحوه کارکرد این هاست فقط در همین حد اشاره می کنیم و برای اطلاعات بیشتر درمورد این ۲ آپشن به سایت php.net رجوع کنید.

خب حال کد بالا که برای http:// بود رو به کد زیر تغییر می دیم

1$ch = curl_init("https://google.com");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_NOBODY,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

حال اگر کد بالا رو اجرا کنید خرجی شبیه زیر خواهید داشت.

1HTTP/1.1 301 Moved Permanently Location: https://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 02 Aug 2015 09:00:33 GMT Expires: Tue, 01 Sep 2015 09:00:33 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 220 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Alternate-Protocol: 443:quic,p=1  

خب حالا به کد زیر توجه کنید.

1$ch = curl_init("https://google.com");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

اگر کد بالا رو اجرا کنید خرجی شبیه خروجی زیر خواهید داشت

1HTTP/1.1 301 Moved Permanently Location: https://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 02 Aug 2015 09:09:49 GMT Expires: Tue, 01 Sep 2015 09:09:49 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 220 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Alternate-Protocol: 443:quic,p=1  
1301 Moved
1The document has moved here. 

همانطور که میبینید صفحه سایت گوگل رو برای ما باز نکرد و دلیلش هم همون ریدارکتی بود که با هدر داشت انجام می شد. برای رفع مشکل از آپشن CURLOPT_FOLLOWLOCATION کمک می گیریم

اگر مقدار این آپشن true باشه هر تعداد ریدایرکت وجود داشته باشه curl اون هارو دنبال میکنه.

پس برای مشاهده صفحه اول گوگل باید کد بالا رو به کد زیر تغییر بدیم

1$ch = curl_init("https://google.com");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);
1curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
1curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

با اجرای کد بالا صفحه اول گوگل قابل مشاهده هست. ( nobody رو از آپشن برداشتم که بتونم بدنه سایت رو ببینم)

حال اگر مایل باشید یک تعداد خواص ریدایرکت رو دنبال کنید باید CURLOPT_MAXREDIRS رو هم مقدار دهی کنید.

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

1$ch = curl_init("https://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
1curl_setopt($ch,CURLOPT_MAXREDIRS,3);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

حال اگر در کد بالا سایت مورد نظر ۴ بار ریدایرکت انجام بده خروجی شما سفید خواهد بود (چون شما در curl_setopt($ch,CURLOPT_MAXREDIRS,3); گفتید حداکثر ۳ بار لینک هارو دنبال کن)

برای رفع مشکل و مشاهده کامل سایت مورد نظر باید یکی از ۲ کد زیر را بنویسید

1$ch = curl_init("https://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
1curl_setopt($ch,CURLOPT_MAXREDIRS,4);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

و یا

1$ch = curl_init("https://virgool.io/@alirezamn93");
1curl_setopt($ch,CURLOPT_HEADER,1);
1curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
1$result = curl_exec($ch);
1echo $result;
1curl_close($ch);

خب برخی از سایت ها لینک ارجاع سایت رو هم نگاه می کنند (مثلا برای صفحه ورود لینک ارجاع رو چک می کنند) وقتی می بینید از یک سایت دیگه لینک اومده نشانگر یک عملیات غیر عادی میشند و اجرا ورود رو نمی دهند (این یکی از روش ها برای جلوگیری هست) برای رفع این مشکل 3 روش وجود دارد

روش اول استفاده از CURLOPT_AUTOREFERER هست . اگر مقدار true رو بدید فیلد Referer شما به صورت اتوماتیک برابر با سایتی میشه که اونو دنبال می کنید.

1curl_setopt($ch,CURLOPT_AUTOREFERER,1)

روش دوم اگر مایلید خودتون دستی رف لینک بدید باید از آپشن CURLOPT_REFERER استفاده کنید مانند قطعه کد زیر

1curl_setopt($ch,CURLOPT_REFERER,"http://www.google.com.com/")

روش سوم استفاده از آپشن CURLOPT_HTTPHEADER هست . (کمی جلوتر کامل این دستور رو توضیح میدم)

خب خیلی وقت ها پیش میاد که شما برای کار با یک سایت (ورود یا پرس و جو کردن و یا …) نیاز به کوکی دارید.

خب آپشن CURLOPT_COOKIESESSION اگر true قرار بدید تمامی کوکی یا سشن های قبلی رو ایگنور میکنه به صورت پیشفرض کوکی و سشن ها ذخیره و اجرا می شوند.

آپشن CURLOPT_COOKIE می تونید خودتون کوکی بدید بهش که با اون کوکی اجرا بشه .

و آپشن CURLOPT_COOKIEFILE که آدرس فایل ذخیره کوکی ها هست اگر رشته خالی بدید بهش هیچ کوکی لود نمیشه ولی ذخیره می شوند.

خب برخی از سایت ها مدل مرورگر هم چک می کنند (حالا برای یک سری کارا یا استایل و…) برای دادن این مشخصات می توانید از آپشن CURLOPT_USERAGENT استفاده کنید. به قطعه کد زیر توجه کنید

1curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"])

و یا

1curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13")

دیگه بستگی به خودتون و سایت مورد نظر داره که چکار کنید.

خب شاید بعضی از سایت هارو مثل فیس بوک با این روش باز کرده باشید و بهتون اررو مبنی بر غیرفعال بودن کوکی بده . برای کار باکوکی هم می تونید از آپشن های موجود استفاده کنید (بالا گفتم)

به قطعه کد زیر توجه کنید:

1    $ch = curl_init("https://www.facebook.com/login.php?login_attempt=1");
1   // curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
1    curl_setopt($ch,CURLOPT_AUTOREFERER,1);
1    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
1    curl_setopt($ch,CURLOPT_HEADER,0);
1    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
1    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
1    curl_setopt($ch,CURLOPT_POST,1);
1    curl_setopt($ch,CURLOPT_ENCODING, 'UTF-8');
1    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
1    curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
1    curl_setopt($ch,CURLOPT_REFERER,"https://www.facebook.com/");
1    $cookie_file = "cookie1.txt";
1    curl_setopt($ch, CURLOPT_COOKIESESSION, true);
1    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
1    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
1    curl_exec($ch);
1    curl_close($ch);

(چیزایی که یاد ندادم رو بعد توی آموزش یاد میگیرید فقط خواستم نحوه کارش رو ببینید)

خب اگر هم می خواید کوکی ست کنید اپشن CURLOPT_COOKIE رو مقدار دهی کنید

برای مثال :

12$cookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; 
 curl_setopt( $ch, CURLOPT_COOKIE, $cookie );  

خب حالا که یک سری ابزار ها رو یاد گرفتیم نظرتون چیه سایت های رو یک سرور با برنامه در بیاریم ؟

برای این کار خیلی روش وجود داره یکی از روش ها استفاده از bing.com هست.اگر در سایت bing.com آی پی یک سرور رو وارد کنیم مثلا بنویسیم ip:192.168.1.1 سایت های سرورو بهمون نشون میده (احتمالن اونایی که ایندکس شدن) خب به کد زیرتوجه کنید:

1$ip =  "193.252.114.13";
1$cnt=1;
1$nextpage=true;
1while($nextpage==true)
1{
1    if($cnt==1)
1        $url="http://www.bing.com/search?q=ip%3A$ip&qs=n&form=QBRE&pq=ip%3A$ip&sc=0-0&sp=-1&sk=";

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
2 نظرات
  1. nafis1390 می گوید

    Hi Big like for you.

نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.