PDA

View Full Version : به یک class یا تابع برای لیست کردن فایل های یک صفحه html



kabootar_y
دوشنبه 13 مهر 1394, 01:13 صبح
با سلام

من به یه کلاس یا تابع php یا javascript نیاز دارم که آدرس یک صفحه html که روی یک سایت و سرور دیگه هست رو بهش بدیم و در خروجی لیستی از همه فایل هایی که از طریق این فایل html آدرس دهی شدند رو بهم بده
حتی آدرس تصویر هایی که در فایل هایی css لینک شده در این فایل html رو در لیست بهم بده

اگه کسی سراغ داره ممنون میشم معرفی کنید

خیلی جستجو کردم ولی به نتیجه ای نرسیدم

برای مثال تابعی اینطوری:









function list_files($url){
php codes...
return $list;
}


$list = list_files('http://domain.com');

print_r($list);

خروجی:


Array( [0] => http://domain.com/images/example1.png [1] => http://domain.com/images/example2.gif [2] => http://domain.com/images/example3.jpg [3] => http://domain.com/css/example4.css [4] => http://domain.com/js/example5.js [5] => http://domain.com/images/css/example6.png [6] => http://domain.com/images/css/example7.png)

Unique
دوشنبه 13 مهر 1394, 01:38 صبح
در مورد html parsing تحقیق کنید و میتونید از این کلاس (http://simplehtmldom.sourceforge.net/) هم استفاده کنید.
اما چه کاری میخواین دقیقا انجام بدین ؟

kabootar_y
دوشنبه 13 مهر 1394, 02:36 صبح
در مورد html parsing تحقیق کنید و میتونید از این کلاس (http://simplehtmldom.sourceforge.net/) هم استفاده کنید.
اما چه کاری میخواین دقیقا انجام بدین ؟

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

Unique
سه شنبه 14 مهر 1394, 01:57 صبح
می خوام مثلا آدرس یه صفحه رو که دادم لیست تمام فایل ها رو بده بعد فایل ها رو توسط php و توی یه حلقه کپی کنم. همین
از طریق کلاسی که معرفی کردم میشه اما باز هم نفهمیدم چرا میخواین این کار را بکنید ؟ چه فایده ای داره ؟

kabootar_y
سه شنبه 14 مهر 1394, 12:49 عصر
از طریق کلاسی که معرفی کردم میشه اما باز هم نفهمیدم چرا میخواین این کار را بکنید ؟ چه فایده ای داره ؟

کلاسی که شما معرفی کردید رو من کم و بیش باهاش آشنا هستم ولی با اون نمیشه بعضی از فایل ها رو پیدا کرد
مثلا تصاویری که در فایل های css آدرس دهی شدن
فایل های css که در یک فایل css دیگه import شده
فایل های جاوا اسکریپتی که در یک فایل جاوا اسکریپت دیگر فراخوانی شده

ببین دوست عزیز من میخوام لیست کامل فایل هایی که به صفحه (مثلا http://domain.com/gallery.html) مرتبط هستند و در این صفحه مورد استفاده قرار گرفتن رو بدست بیارم
بعد که لیست رو گرفتم حالا تک تک این فایل ها رو به هر نحوی کپی کنم

فکر نمی کنم خیلی پیچیده باشه

مثلا در آدرس http://tools.pingdom.com/fpt وقتی یک سایت رو آنالیز میکنی لیستی از کل فایل ها رو با عنوان Requests done to load this page نمایش میده. من همچین چیزی می خوام

Unique
سه شنبه 14 مهر 1394, 22:36 عصر
قبل از هر چیز خوشحالم دوباره یکنفر توی انجمن پیدا شده که سوال چالشی و با حال میپرسه ! نه اینکه بگه من توی خروجی پایگاه داده برای فارسی مشکل دارم یا خطای headers already sent میگیرم یا خطای resource و object و این چیزا که خسته شدم از بس خودم و دوستان جواب دادیم و متاسفانه حتی به خودشون زحمت نمیدن جستجو کنند.

در جواب باید خدمتتون بگم اگه php کلاس یا کدی برای پیدا کردن فایل ها توی سورس ها داشته باشه یا حتی یک browser کامل قطعا نمیتونه راه حل مناسبی برای این کار باشه.
برای پیدا کردن این فایل ها و بدست آوردن حجمشون و اینکه فایل هست یا نه شبیه به کاری که سایت مورد نظرتون انجام میده باید از نرم افزار های دیگه استفاده کرد و خروجیشون را با php خیلی تر و تمیز به کاربر نشون داد.

برای پیدا کردن این فایل ها شما باید http response هایی که مرورگر روی پورت 80 میگیره را آنالیز کنید. توی اونها هم مسیر کامل فایل هست ، هم اینکه فایل وجود داشته یا نه و هم اینکه حجمش چقدره. اگه فقط مسیر براتون مهمه با http request ها هم مشکلتون حله. اما چطوری میشه فهمید ؟

قطعا از نرم افزار های زیادی میشه استفاده کرد اما اگه من قرار بود این پروژه را انجام بدم از tcpdump لینوکس استفاده میکردم. خیلی راحت tcpdump را با یک فیلتر که http header ها را روی پورت 80 و دامنه مورد نظر توی فایل Log بنویسه صدا میزدم. بعدش با lynx یا w3m یا حتی firefox سایت را فراخونی میکردم و بعدش tcpdump را قطع میکردم و خروجی log را بررسی میکردم ببینم چه خبره و به کاربر نشون میدادم. همین.

این کار را با هر http sniffer یا tcp sniffer و حتی نرم افزار های proxy که Log بگیرن میشه انجام داد ،‌حتی میشه دستور را به شکلی نوشت که Log توی فایلی به نام همون دامنه ذخیره بشه.

اصل قضیه اینه اما اینجا انجمن php هست و بحث در موردش خیلی به کار انجمن نمیاد در ضمن نیاز به کمی معلومات از لینوکس و پروتوکل http و از همه مهمتر وقت داره که متاسفانه وقت ندارم براتون کل پروسه را انجام بدم و بگدارم. ولی امیدوارم اگه ارزشش را داره انجام بدین. کافیه توی گوگل دنبال tcpdump و دستورات اجرایی php مثل exec بگردین و این را بدونین روی هاست shared نمیشه این تیپ کار ها را انجام داد و نیاز به دسترسی های بیشتری هست و باید سرویس اختصاصی مجازی یا واقعی بگیرین./

موفق باشین.

djtrex
چهارشنبه 15 مهر 1394, 15:15 عصر
کلاسی که شما معرفی کردید رو من کم و بیش باهاش آشنا هستم ولی با اون نمیشه بعضی از فایل ها رو پیدا کرد
مثلا تصاویری که در فایل های css آدرس دهی شدن
فایل های css که در یک فایل css دیگه import شده
فایل های جاوا اسکریپتی که در یک فایل جاوا اسکریپت دیگر فراخوانی شده

ببین دوست عزیز من میخوام لیست کامل فایل هایی که به صفحه (مثلا http://domain.com/gallery.html) مرتبط هستند و در این صفحه مورد استفاده قرار گرفتن رو بدست بیارم
بعد که لیست رو گرفتم حالا تک تک این فایل ها رو به هر نحوی کپی کنم

فکر نمی کنم خیلی پیچیده باشه

مثلا در آدرس http://tools.pingdom.com/fpt وقتی یک سایت رو آنالیز میکنی لیستی از کل فایل ها رو با عنوان Requests done to load this page نمایش میده. من همچین چیزی می خوام

شما اول باید بگید کدوم از این دو حالت رو نیاز دارید:
۱ . لیست لینک ها (تگ a) و فایل های css و import ها و url() های داخل فایل های css و عکس ها (تگ img) و ...

برای اینکارها باید فایل html رو بگیرید و پارس کنید مثلا با استفاده از کامپوننت symfony crawler میتونید کل تگ های a رو اینجوری بگیرید:



use Symfony\Component\DomCrawler\Crawler;


// Todo fetch html contents ...


$crawler = new Crawler($html);


$urls = $crawler->filter('a')->each(function(Crawler $crawler) {
return $crawler->attr('href');
});


اطلاعات بیشتر:
http://symfony.com/doc/current/components/dom_crawler.html

همچنین برای پارس کردن فایل های css:
https://github.com/sabberworm/PHP-CSS-Parser

2. مانیتور کردن نتورک و پیدا کردن ریسورس ها
اگه به این نیاز دارید که لیست ریسورس هایی که موقع لود صفحه دریافت می شود را پیدا کنید (مثل فایل های css / عکس ها و ...) می تونید خیلی راحت با phantomjs اینکارو انجام بدید و نتیجه ای مشابه به pingdom دریافت کنید:



var page = require('webpage').create();
page.onResourceRequested = function(request) {
console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {
console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);


اطلاعات بیشتر:
http://phantomjs.org/network-monitoring.html

همچنین میتونید کاری که با symfony crawler هم انجام دادید، با phantomjs هم انجام بدید.

در روش دوم فقط لیست فایل هایی به شما داده می شود که کاربر هنگام مشاهده صفحه آن ها را لود می کند. مثلا اگر display یک تصویر none باشد مرورگر درخواستی هم به سرور ارسال نمی کند. یا هنگامی برای اندازه صفحه موبایل یک resource خاص لود می شود ولی برای دسکتاپ خیر (responsive / adaptive design)

kabootar_y
چهارشنبه 15 مهر 1394, 16:01 عصر
شما اول باید بگید کدوم از این دو حالت رو نیاز دارید:

من به همین حالت دوم رو که فرمودید میخوام یعنی وقتی آدرس یک صفحه مثلا http://domain.com/news/page/12 رو بهش دادم لیست تمام فایل هایی که نقش داشتن تا صفحه این شکلی به نمایش در بیاد رو بهم بده.



در روش دوم فقط لیست فایل هایی به شما داده می شود که کاربر هنگام مشاهده صفحه آن ها را لود می کند. مثلا اگر display یک تصویر none باشد مرورگر درخواستی هم به سرور ارسال نمی کند. یا هنگامی برای اندازه صفحه موبایل یک resource خاص لود می شود ولی برای دسکتاپ خیر (responsive / adaptive design)

مهم نیست که مثلا اگه عکسی برای بکگراند در حالت نمایش در موبایل در نظر گرفته شده رو توی لیست قرار نده


ولی من متوجه نشدم که باید چی کار کنم اگه با یه مثال بهم بفهمونید خیلی عالی میشه

به هرحال از لطفتون بسیار متشکرم

Unique
چهارشنبه 15 مهر 1394, 21:30 عصر
روشی که djtrex با استفاده از phantomjs پیشنهاد داده خیلی خوبه ! حواسم کلا به phantomjs نبود.


ولی من متوجه نشدم که باید چی کار کنم اگه با یه مثال بهم بفهمونید خیلی عالی میشه
phantomjs یک webkit با api ی جاوااسکریپتی هست که برای تست وب سایت ، thumbnail گرفتن از سایت ، دسترسی به DOM و اعمال تغییرات توی محتوای صفحات و Network Monitoring که من اصلا حواسم بهش نبود کاربرد داره. من توی این پست وبلاگم (http://www.geekfarsi.com/%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%B9%DA%A9%D8%B3-%D8%A7%D8%B2-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D8%A8-%DB%8C%D8%A7-%D9%87%D9%85%D9%88%D9%86-webshot-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-php/66) در مورد Webshot گرفتن با phantomjs توضیحاتی دادم که میتونی روش استفاده را متوجه بشی. فقط از کد های مربوط به Monitoring باید استفاده کنی.