PDA

View Full Version : گرفتن مقادیر از یک وب سایت دیگر به وسیله file_get_contents



haniye70
سه شنبه 01 اسفند 1391, 22:14 عصر
با سلام به دوستان و اساتید محترم

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





$html = file_get_contents('http://www.sahelabi.com/Ticket.asp');
$DOM = new DOMDocument("1.0","UTF-8");
libxml_use_internal_errors(true);
$DOM->loadHTML($html);
$domXPath = new DOMXPath($DOM);
$items = $domXPath->query("id='tblshade4']");
echo $items->item(0)->C14N();




حالا دوستان بفرمایند و راهنمایی بفرمایند چه روشی و پیشنهادی دارند که بتونم بخش بلیط این وبسایت رو درون وب سایت خودم نمایش بدم :لبخندساده:

dousti_design
سه شنبه 01 اسفند 1391, 22:38 عصر
من هم اوایل برای این سایت خبری (http://gholbang.ir/) م که کلا کارش همینه از همین کلاسی که شما استفاده میکنید استفاده میکردم اما بعد از یه مدت دیدم که یه سری ایرادات داره.
از کلاسی که اتچ کردم میتونید استفاده کنید. این هم کدش:


include('simple_html_dom.php');
$html = file_get_html('http://www.sahelabi.com/Ticket.asp');
$e = $html->find('table[id=tblshade4]');
echo $body = $e[0]->innertext ;

haniye70
سه شنبه 01 اسفند 1391, 22:48 عصر
بسیار بسیار عالی تشکرهم کمه مرسی مرسی
فقط زمانی که فیلدها شیفت پیدا میکنه کار نمیکنه می تونید این مشکل رو هم حل کنید
اگر این رو حل کنید کمک بزرگی به من کردید خیلی خیلی مرسی دوست عزیز

dousti_design
سه شنبه 01 اسفند 1391, 22:55 عصر
بسیار بسیار عالی تشکرهم کمه مرسی مرسی
فقط زمانی که فیلدها شیفت پیدا میکنه کار نمیکنه می تونید این مشکل رو هم حل کنید
اگر این رو حل کنید کمک بزرگی به من کردید خیلی خیلی مرسی دوست عزیز
خاهش میکنم. کدوم فیلدها؟ لطفا بیشتر توضیح بدین

haniye70
سه شنبه 01 اسفند 1391, 23:16 عصر
فیلد
:کشور مقصد را انتخاب کنید

رو که انتخاب میکنی باید قیمت بلیط همون کشور رو نشون بده

haniye70
سه شنبه 01 اسفند 1391, 23:29 عصر
البته نمی دونم شاید من این مشکل رو داشته باشم
ولی وقتی یکی از کشورهای لیست باکس کشور مقصد رو انتخاب میکنم عمل نمی کنه

dousti_design
سه شنبه 01 اسفند 1391, 23:54 عصر
خب باید هم عمل نکنه! وقتی لیست رو تغییر میدی این اطلاعات رو به صفحه Ticket.asp ارسال(پست) میکنه:


COUNTRYSELECT=آرژانتین

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


function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}

که این رو باید با کدی که داریم ترکیب کنیم که همچین چیزی درمیاد ازش:



include('simple_html_dom.php');
$str = key($_POST) . "=" . $_POST[key($_POST)];
$html = do_post_request("http://www.sahelabi.com/Ticket.asp", $str);
$e = $html->find('table[id=tblshade4]');
$body = $e[0]->innertext ;
$body = str_replace("Ticket.asp", "", $body);

echo $body."<hr>";
print_r($str);
echo "<hr>";



function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
$dom = new simple_html_dom(null);
$dom->load($response);
return $dom;
//return $response;
}

یکم دستکاریش کنید راهتون رو پیدا میکنید.
اگرمبخاید اون لیست رو بردارید یا باشه اما کار نکنه از str_replace استفاده کنید

haniye70
چهارشنبه 02 اسفند 1391, 00:06 صبح
:لبخند:

متشکر از کمک خوبتون
ولی نمی دونم چرا هنوز همینجوری هست
من یک فایل php ساختم به اسم Ticket.asp.php
اونو توی ریشه قرار میدم اینکلودش هم درسته صفحه کار میکنه ولی هنوز اون بخش لیست کشور ها کار نمیکنه نمیدونم مشکل کار من کجاست

dousti_design
چهارشنبه 02 اسفند 1391, 11:43 صبح
:لبخند:

متشکر از کمک خوبتون
ولی نمی دونم چرا هنوز همینجوری هست
من یک فایل php ساختم به اسم Ticket.asp.php
اونو توی ریشه قرار میدم اینکلودش هم درسته صفحه کار میکنه ولی هنوز اون بخش لیست کشور ها کار نمیکنه نمیدونم مشکل کار من کجاست

ببینید این کار یکم وقت میخاد باید وقت بذارید. من توضیح دادم بهتون که چیکارا باید بکنید.
اولا اکشن فرم مربوط به اون لیست رو تغییر میدید و خالی میذارید( یعنی همین صفحه بشه)
خب حالا با تغییر اون لیست اطلاعات به صفحه ما که الان توش هستیم ارسال میشه.
دوم با استفاده از تابعی که بالا گذاشتم میایید و اطلاعاتی که با متد POST به این صفحه ارسال شده رو عینا به صفحه

http://www.sahelabi.com/Ticket.asp
ارسال میکنید و نتیجه اش رو میگیرید و چاپ میکنید.

$ M 3 H R D A D $
چهارشنبه 02 اسفند 1391, 15:31 عصر
add one فایرفاکس به نام live http header و نصب کن
هدر ها و چک کن میبینید که با تغییر کمبو چه داده ای به صفحه ارسال میشه
حکات اینو داره که شما همین صفحه که دارید با file_get_content درخواست میدید تا خروجی و بگیرید حالا یک داده متغییر ورودی داره که اسمش کشور هست
http://barnamenevis.org/showthread.php?378354-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%82%DB%8C%D9%85%D8%AA-%D8%A7%D8%B1%D8%B2-%D8%A7%D8%B2-%D8%B3%D8%A7%DB%8C%D8%AA-%D9%87%D8%A7-%D8%A8%D8%A7-%D8%A7%D9%85%DA%A9%D8%A7%D9%86-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%BE%DB%8C%D8%A7%D9%85-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%D9%88-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%85%D8%B4%D8%AA%D8%B1%DB%8C%D8%A7%D9%86-%D8%A8%D8%A7-%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86


http://barnamenevis.org/showthread.php?274822-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%A7%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D8%A8-%D8%A8%D8%A7-PHP-%D8%AF%D8%B1%D9%88%D9%86-%D8%B3%D8%B1%D9%88%D8%B1

$ M 3 H R D A D $
چهارشنبه 02 اسفند 1391, 19:29 عصر
مشکل مشا پیه دقیقا ؟به آیدی یاهو من پیغام دهید چون با ج دوستان میبینم که مشکل شما حل شده اما..

haniye70
چهارشنبه 02 اسفند 1391, 19:45 عصر
متشکر از شما
مشکل اینه که وقتی لیست باکس که مقدار هر کشور رو ارسال میکنه و بلیط همون کشور رو نشون میده
درون برنامه ای که دوست عزیز راهنمایی فرمودن کار نمیکنه فقط یکی از کشور ها رو نشون میده و وقتی هم که از لیست باکس کشوری رو انتخاب میکنم باز همون کشور اولی هست

من در ارسال به صورت post گیر کردم که چگونه مقادیر لیست باکس رو ارسال کنم و مقدار جدیید همون صفحه رو بگیرم
مشکل من اینه اقا مهرداد

shahriyar3
چهارشنبه 02 اسفند 1391, 20:43 عصر
خیلی سخت نیست
اول این کلاس ها رو دانلود کنید
http://pear.php.net/package/HTTP_Request2/download
http://pear.php.net/package/Net_URL2/download
فایل ها را از حالت فشرده اگر هست خارج کنید 2 کلاس فولدر هاش باید بالاتر از فایل برنامه شما باشند
بعد از این کد استفاده کنید


$site = 'http://www.sahelabi.com/Ticket.asp';
require_once 'Request2.php';
$request = new HTTP_Request2($site);
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->addPostParameter(array(
'country' => 'iran'
));
$response = $request->send();
echo $response->getBody();


به همین راحتی :لبخندساده:
فقط یک نکته اینکه باید در هر request که ارسال میکنید name این input و هم چنین مقدار value و تنظیم کنید.
از سورس سایت اصلی بگیرید
این مقادیری که من گذاشتم همینجوری هست
'country' => 'iran'

amir001
شنبه 05 اسفند 1391, 14:09 عصر
باید مقادیر زیر را به اون صفحه تیکت ارسال کنید.
COUNTRYSELECT=%D8%A2%D8%B0%D8%B1%D8%A8%D8%A7%DB%8C %D8%AC%D8%A7%D9%86

مقدارش نام کشور به فارسی هست که URLEncode شده

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

موفق باشید

amir001
شنبه 05 اسفند 1391, 14:15 عصر
از کد زیر استفاده کنید:


<?php
include_once("browser.class.php");

$URL = "http://www.sahelabi.com/Ticket.asp";
$DATA = "COUNTRYSELECT=". urlencode("یونان");

$ff = new Browser();
$ff->Open($URL,$DATA);
echo $ff->Open($URL,$DATA);
?>

کلاسی که استفاده شده را هم از آدرس زیر دریافت کن:
http://barnamenevis.org/showthread.php?274822-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%A7%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D8%A8-%D8%A8%D8%A7-PHP-%D8%AF%D8%B1%D9%88%D9%86-%D8%B3%D8%B1%D9%88%D8%B1

$ M 3 H R D A D $
شنبه 05 اسفند 1391, 17:32 عصر
باید مقادیر زیر را به اون صفحه تیکت ارسال کنید.
COUNTRYSELECT=%D8%A2%D8%B0%D8%B1%D8%A8%D8%A7%DB%8C %D8%AC%D8%A7%D9%86

مقدارش نام کشور به فارسی هست که URLEncode شده

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

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

haniye70
شنبه 05 اسفند 1391, 21:10 عصر
Wow
عالیه دستتون درد نکنه عالی متشکر

فقط حالا چه طوری فقط همون بخش


find('table[id=tblshade4]');

رو نشون بدم

$ M 3 H R D A D $
شنبه 05 اسفند 1391, 21:46 عصر
تو لیکنکهایی که گذاشتم کلاس پردازش html هست با دستوراتی مثل query
سوا از اون با domdocument راحت میتونید رو الکنت ها html قدم روو کنید !