گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

گرفتن عکس از صفحات وب (یا همون Webshot) از طریق PHP

نویسنده:
22 آوریل 14

یکی از سوالاتی که بار ها توی انجمن‌های برنامه نویسی و بین دوستان خودم باهاش مواجه شدم اینه که چطور میشه یک Webshot یا همون عکس از صفحه اصلی یه سایت (یا حالا هر آدرسی) از طریق وب با استفاده از php گرفت ؟

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

به زبان ساده phantomjs یک مروگر خط فرمان با Syntax و API مشابه Javascript هست که برای خیلی موارد مانند آزمون و تست وب سایت‌ها ، عکس گرفتن ،‌ دسترسی به DOM و حتی Jquery جهت اتوماسیون کردن عملیات و همینطور مانیتور و آنالیز کردن به کار میره.ما قصد داریم برای گرفتن عکس از یک وب سایت ازش استفاده کنیم. پس ابتدا از سایت مربوطه آخرین نسخه را دانلود میکنیم و کنار فایل php که میخواهیم عکس را باهاش از سایت بگیریم ذخیره میکنیم.

Phantomjs دستوراتی را که شبیه به javascript هست میگیره و بر اساس اون تفسیر و اجرا میکنه.من اسکریپت زیر را برای phantomjs نوشتم که آدرس ، فایل خروجی ، طول و عرض عکس را میگیره و عملیات دریافت و ذخیره سازی Webshot را انجام میده :

address = phantom.args[0];

output = phantom.args[1];

wt = phantom.args[2];

ht = phantom.args[3];

page.viewportSize = { width: wt, height: ht };

page.open(address, function (status) {

  if (status !== 'success') {

     console.log('Unable to load the address!');

     phantom.exit();

  } else {

      window.setTimeout(function () {

        page.render(output);

        phantom.exit();

      }, ۲۰۰);

  }

});

بعد از دانلود phantomjs این اسکریپت را کپی و توی فایلی به نام geekfarsi.js کنار phantomjs ذخیره میکنیم.حالا کافیه خط زیر را توی فایل php بنویسیم و با مروگر اجراش کنیم :

exec('phantomjs geekfarsi.js https://www.geekfarsi.com geekfarsi.png 1024 768');

نتیجه اینکه عکس ما کنار فایل php قرار گرفته و Webshot ما آماده هستش !

نکته : اگه php شما در حالت safe_mode باشه (مدیر سیستم توی php.ini تعیین میکنه) شما نمیتونین هیچ دستوری را روی سرور اجرا کنید. بعضی از هاست ها شرایطی را برا ی این کار فراهم میکنن. در صورت عدم موفقیت کافیه یک Ticket به مسئول هاست بزنین و ازشون بپرسین.