PDA

View Full Version : سوال: مشکل در Curl



saeedba
سه شنبه 16 بهمن 1397, 12:11 عصر
سلام خدمت اساتید بزرگوار
بنده تو استفاده از تابع Curl برای یک آدرس خاص مشکل دارم
آدرس : http://mlsrums.ir/api.php
حقیقت این که من میخام یه ربات تلگرام بنویسم اما خب مشکل ssl هست و ترجیح دادم سورس ربات روی heroku باشه اما برای ارتباط با پایگاه داده بوسیله PDO مثل این که heroku محدودیت داره
ترجیح دادم ارتباط بگیرم با سایت اصلی یه جورایی به صورت مبتدی سوکت پروگرامینگ انجام بدم
اما با وجود فعال بودن Curl نمیتونم با آدرس بالا کار کنم
نمونه کد استفاده شده:


$ur = "http://mlsrums.ir/api.php";
$ch = curl_init($ur);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, "0" );
curl_setopt($ch,CURLOPT_AUTOREFERER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
$result = curl_exec($ch);
print_r(curl_getinfo($ch));
echo $result;


ممنون میشم راهنمایی بفرمایید

ali_sed
سه شنبه 16 بهمن 1397, 12:39 عصر
سلام

با توجه به اینکه ربات باید با سرعت بالایی به درخواست ها پاسخ دهد تا دلیل مناسبی نداشته باشید بهتر است از یک سرور استفاده کنید.
بهتر است مشکل اس اس ال را رفع کنید. حتی با استفاده از self signed ssl هم می توان از ربات تلگرام استفاده کرد.

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


echo htmlspecialchars($result);

saeedba
سه شنبه 16 بهمن 1397, 13:07 عصر
ممنون از پاسختون
اما از اونجایی که هاستم رایگانه هیچ جوره نتونستم ssl براش فعال کنم (با استفاده از sslforfree.com)
خب من دو راه بیشتر ندارم
1- استفاده از همین روش مبتدی برای ارتباط با دیتابیس
2- این روش که فرمودید self signed ssl
که خب تو روش اول من برای تست متن This is a TEST for curl رو قرار دادم ، اما نمی تونم دریافتش کنم.
و تو روش دوم فک کنم باید دسترسی خاصی داشته باشم که برای هاست رایگان مقدور نیست

به نظر شما چکار کنم؟؟؟

ali_sed
چهارشنبه 17 بهمن 1397, 15:23 عصر
ممنون از پاسختون
اما از اونجایی که هاستم رایگانه هیچ جوره نتونستم ssl براش فعال کنم (با استفاده از sslforfree.com)
خب من دو راه بیشتر ندارم
1- استفاده از همین روش مبتدی برای ارتباط با دیتابیس
2- این روش که فرمودید self signed ssl
که خب تو روش اول من برای تست متن This is a TEST for curl رو قرار دادم ، اما نمی تونم دریافتش کنم.
و تو روش دوم فک کنم باید دسترسی خاصی داشته باشم که برای هاست رایگان مقدور نیست

به نظر شما چکار کنم؟؟؟

خواهش می کنم. بسته به باری که روی ربات شماست توصیه می کنم از سرور اختصاصی(از ماهانه ۸۰۰ هزار تومن)، سرور مجازی (از ماهانه ۲۰۰ تومن) و یا هاست اشتراکی (از سالانه ۲۰۰ تومن) استفاده کنید و قید هاست های رایگان را بزنید. در هاست رایگان و اشتراکی میزان منابع سیستم بسیار محدود (بخصوص تعداد درخواست های ارسالی و دریافتی) است و ممکن است پاسخگوی نیازهای شما نباشد.

اما در مورد مشکل سرور کنونی توجه داشته باشید که جهت جلوگیری از حملات DDOS روی سرور ماژول testcookie-nginx-module نصب شده است.(https://kyprizel.github.io/testcookie-nginx-module/) که با استفاده از جاوااسکریپت ابتدا یک کوکی با نام __test ایجاد می کند سپس کاربر را به صفحه مورد نظر ارجاع میدهد. می توانید با استفاده از developer tools مقدار کوکی مربوطه را یافته و در دستور زیر درج کنید. احتمال زیاد این کد وابسته به آیپی درخواست دهنده است بنابراین باید کوکی مخصوص سرور درخواست کننده را بدست آورید.



curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: __test=666666677eb8b8cd7deb42666665ca; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"));


جهت بدست آوردن کوکی مناسب سرور درخواست دهنده ابتدا کدهای خود را روی سرور اجرا کنید سپس ریسپانس را دریافت کرده و از درون آن مقادیر متغیرهای a , b , c را در کد زیر جایگزین کنید سپس کد زیر را در یک فایل html روی پی سی خود اجرا کنید مقداری که روی صفحه نمایش نشان میدهد همان کوکی مورد نظر است که با استفاده از curl باید ارسال شود لذا آن را جایگزین مقدار کوکی در قطعه کد بالا کنید.



<html>

<body>
<script type="text/javascript" src="http://mlsrums.ir/aes.js"></script>
<script>
function toNumbers(d) {
var e = [];
d.replace(/(..)/g, function(d) {
e.push(parseInt(d, 16))
});
return e
}

function toHex() {
for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0" : "") + d[f].toString(16);
return e.toLowerCase()
}
var a = toNumbers("f655ba9d09a112d4968c63579db590b4"),
b = toNumbers("98344c2eee86c3994890592585b49f80"),
c = toNumbers("7777777a79d4855dba3e7777777");
document.write("Cookie: __test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
</script>
</body>

</html>


البته می توانید تمامی این موارد را بصورت خودکار نیز انجام دهید تنها کافیست از رمزنگاری AES نسخه php استفاده کنید و تمامی مراحل بالا که به جاوااسکریپت نوشته شده است را با استفاده از php انجام دهید.