بينما أكتب هذه السطور، فقد مر ما يقرب من عامين منذ الإصدار الأخير من PuPHPeteer. على الرغم من الحماس حول هذا المشروع، لم يعد لدي الدافع لدعم تطويره، ويرجع ذلك أساسًا إلى أنه لم يكن مفيدًا لي أبدًا. لذا حان الوقت لنكون صادقين معك، لم يعد PuPHPeteer يخضع للصيانة.
ومع ذلك، إليك قائمة بالشوكات التي يحتفظ بها المجتمع:
إذا قمت بإنشاء شوكة وتخطط لصيانتها، فأخبرني بذلك وسأقوم بربطها هنا.
جسر محرك الدمى لـ PHP، يدعم واجهة برمجة التطبيقات (API) بأكملها. مبنية على Rialto، وهي حزمة لإدارة موارد Node من PHP.
فيما يلي بعض الأمثلة المستعارة من وثائق Puppeteer وتم تكييفها مع بناء جملة PHP:
مثال - الانتقال إلى https://example.com وحفظ لقطة الشاشة بتنسيق example.png :
use Nesk Puphpeteer Puppeteer ;
$ puppeteer = new Puppeteer ;
$ browser = $ puppeteer -> launch ();
$ page = $ browser -> newPage ();
$ page -> goto ( ' https://example.com ' );
$ page -> screenshot ([ ' path ' => ' example.png ' ]);
$ browser -> close ();
مثال - تقييم البرنامج النصي في سياق الصفحة:
use Nesk Puphpeteer Puppeteer ;
use Nesk Rialto Data JsFunction ;
$ puppeteer = new Puppeteer ;
$ browser = $ puppeteer -> launch ();
$ page = $ browser -> newPage ();
$ page -> goto ( ' https://example.com ' );
// Get the "viewport" of the page, as reported by the page.
$ dimensions = $ page -> evaluate (JsFunction:: createWithBody ( "
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio
};
" ));
printf ( ' Dimensions: %s ' , print_r ( $ dimensions , true ));
$ browser -> close ();
تتطلب هذه الحزمة PHP >= 7.3 والعقدة >= 8.
قم بتثبيته باستخدام سطري الأوامر هذين:
composer require nesk/puphpeteer
npm install @nesk/puphpeteer
بدلاً من طلب محرك الدمى:
const puppeteer = require ( 'puppeteer' ) ;
يجب عليك إنشاء مثيل لفئة Puppeteer
:
$ puppeteer = new Puppeteer ;
سيؤدي هذا إلى إنشاء عملية عقدة جديدة يتم التحكم فيها بواسطة PHP.
يمكنك أيضًا تمرير بعض الخيارات إلى المُنشئ، راجع وثائق Rialto. يقوم PuPHPeteer أيضًا بتوسيع هذه الخيارات:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
' log_browser_console ' => false ,
]
إذا كنت تستخدم بعض المهلات التي تزيد مدتها عن 30 ثانية، فسيتعين عليك تعيين قيمة أعلى لخيار read_timeout
(الافتراضي: 35
):
$ puppeteer = new Puppeteer ([
' read_timeout ' => 65 , // In seconds
]);
$ puppeteer -> launch ()-> newPage ()-> goto ( $ url , [
' timeout ' => 60000 , // In milliseconds
]);
await
".مع PuPHPeteer، يكون كل استدعاء أسلوب أو الحصول على/إعداد خاصية متزامنًا.
تم تسمية الطرق التالية باسم مستعار لأن PHP لا يدعم الحرف $
في أسماء الطرق:
$
=> querySelector
$$
=> querySelectorAll
$x
=> querySelectorXPath
$eval
=> querySelectorEval
$$eval
=> querySelectorAllEval
استخدم هذه الأسماء المستعارة تمامًا كما كنت تستخدم الطرق الأصلية:
$ divs = $ page -> querySelectorAll ( ' div ' );
JsFunction
يجب كتابة الوظائف التي يتم تقييمها في سياق الصفحة باستخدام فئة JsFunction
، ويجب كتابة نص هذه الوظائف بلغة JavaScript بدلاً من PHP.
use Nesk Rialto Data JsFunction ;
$ pageFunction = JsFunction:: createWithParameters ([ ' element ' ])
-> body ( " return element.textContent " );
->tryCatch
إذا حدث خطأ في Node، فسيتم طرح NodeFatalException
وإغلاق العملية، وسيتعين عليك إنشاء مثيل جديد لـ Puppeteer
.
لتجنب ذلك، يمكنك أن تطلب من Node اكتشاف هذه الأخطاء عن طريق إضافة تعليماتك مسبقًا باستخدام ->tryCatch
:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
بدلاً من ذلك، سيتم طرح NodeException
، وستظل عملية Node نشطة وقابلة للاستخدام.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.
يتكون شعار PuPHPeteer من:
شكرًا لـ Laravel News على اختيار أيقونات وألوان الشعار.