Получить Yahoo календари

Я пытаюсь получить список календарей Yahoo, используя следующий код.

$url = "https://calendar.yahoo.com/";
$user = "****@yahoo.com";
$pwd = "*****";
$body = "<A:propfind xmlns:A='DAV:'>
<A:prop>
<A:displayname/>
</A:prop>
</A:propfind>";
$c=curl_init($url);
curl_setopt($c, CURLOPT_HTTPHEADER, array("Depth: 1", "Content-Type: text/xml; charset='UTF-8'", "User-Agent: DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)"));
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($c, CURLOPT_USERPWD, $user.":".$pwd);
curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PROPFIND");
curl_setopt($c, CURLOPT_POSTFIELDS, $body);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$data=curl_exec($c);
curl_close($c);

Но в ответ я получил 500 Ошибка.
Любая идея?

Также я пытаюсь использовать эту ссылку https://caldav.calendar.yahoo.com, но это тоже ошибка 500

0

Решение

Это довольно просто, если вы посмотрите на исходный код этой страницы, у вас есть все эти скрытые input поля:

<input type="hidden" name="sessionId" id="sessionId" value="8nPh4sVBtxEZ">
<input type="hidden" name=".tries" value="1">
<input type="hidden" name=".src" value="yc">
<input type="hidden" name=".md5" value="">
<input type="hidden" name=".hash" value="">
<input type="hidden" name=".js" value="">
<input type="hidden" name=".last" value="">
<input type="hidden" name="promo" value="">
<input type="hidden" name=".intl" value="us">
<input type="hidden" name=".lang" value="en-US">
<input type="hidden" name=".bypass" value="">
<input type="hidden" name=".partner" value="">
<input type="hidden" name=".u" value="336ng15a3fsqq">
<input type="hidden" name=".v" value="0">
<input type="hidden" name=".challenge" value="vrO9R3b_b7Qwm8roug2Ea0jjlIh022jt4w--">
<input type="hidden" name=".yplus" value="">
<input type="hidden" name=".emailCode" value="">
<input type="hidden" name="pkg" value="">
<input type="hidden" name="stepid" value="">
<input type="hidden" name=".ev" value="">
<input type="hidden" name="hasMsgr" value="0">
<input type="hidden" name=".chkP" value="Y">
<input type="hidden" name=".done" value="http://caldav.calendar.yahoo.com/">
<input type="hidden" name=".pd" value="yc_ver=0&c=&ivt=&sg=">
<input type="hidden" name=".ws" id=".ws" value="0">
<input type="hidden" name=".cp" id=".cp" value="0">
<input type="hidden" name="nr" value="0">
<input type="hidden" name="pad" id="pad" value="6">
<input type="hidden" name="aad" id="aad" value="6">

И в одном из них вы заметите

<input type="hidden" name=".challenge" value="vrO9R3b_b7Qwm8roug2Ea0jjlIh022jt4w--">

Это то, что вызывает «500 Ошибка». Зачем? Потому что вы пишете бот / скребок и форма входа использует CSRF защита среди других методов предотвращения взлома. Yahoo и все большие парни активно пишут код, чтобы помешать вам делать именно это.

Если вы действительно пытаетесь взаимодействовать с протоколом CalDAV, который предоставляет Yahoo, вам, вероятно, придется использовать совершенно другой подход, чем запросы cURL. Там наверное некоторое обсуждение клиентских библиотек CalDAV PHP там

0

Другие решения

Это мой случай

       $xml = "<A:propfind xmlns:A='DAV:'>
<A:prop>
<A:displayname/>
</A:prop>
</A:propfind>";

$url = sprintf("https://caldav.calendar.yahoo.com/dav/%s/Calendar", $email);

$headers = array(
'Depth: 1',
'Content-Type: text/xml; charset=utf-8',
'Content-Length: '.strlen($xml),
"User-Agent: DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $email.":".$password);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

$response = curl_exec($ch);
curl_close($ch);
0

По вопросам рекламы [email protected]