Проблема с получением списка городов из LS

Я пытаюсь получить массив городов LS … file_get_contents () возвращает пустой раскрывающийся список на своем блокпосте, требуя от вас выбрать города. К сожалению, он пуст … поэтому я подумал, что это происходит из запроса ajax. Но, глядя на страницу, я не вижу никаких аякс-запросов на странице. Затем я попробовал CURL, думая, что, возможно, симуляция браузера поможет … ниже код не повлиял.

$ch = curl_init("http://www.URL.com/"); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'); $result=curl_exec($ch); var_dump($result); 

Есть ли у кого-нибудь идеи о том, как я могу получить солидный список доступных областей?

Возможно, немного поздно, но вам не нужно связываться с нашим JavaScript, чтобы получить список городов. Для этого у нас есть API:

https://sites.google.com/a/hungrymachine.com/livingsocial-api/home/cities

Я узнал, как они заполняют список городов и создает пример кода, который вы можете использовать.

Список городов хранится как строка JSON в одном из файлов javascript, и список фактически заполняется из другого файла javascript. Имена файлов выглядят несколько случайными, но имя корня остается неизменным.

Примером JS-файла с городом JSON является hXXp: //a3.ak.lscdn.net/deals/system/javascripts/bingy-81bf24c3431bcffd317457ce1n434ca9.js. Сценарий, который заполняет список, – hXXp: //a2.ak.lscdn .net / deals / system / javascripts / confirm_city-81bf24c3431bcffd317457ce1n434ca9.js, но для нас это несущественно.

Нам нужно загрузить свою домашнюю страницу с новой сессией curl, искать уникальный URL-адрес JavaScript, который является скриптом bingy, и извлекать его с помощью curl. Затем нам нужно найти JSON и декодировать его на PHP, чтобы мы могли его использовать.

Вот сценарий, который я придумал, который работает для меня:

 <?php error_reporting(E_ALL); ini_set('display_errors', 1); // debugging // set up new curl session with options $ch = curl_init('http://livingsocial.com'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13'); $res = curl_exec($ch); // fetch home page // regex string to find the bingy javascript file $matchStr = '/src="(https?:\/\/.*?(?:javascripts)\/bingy-?[^\.]*\.js)"/i'; if (!preg_match($matchStr, $res, $bingyMatch)) { die('Failed to extract URL of javascript file!'); } // this js file is now our new url $url = $bingyMatch[1]; curl_setopt($ch, CURLOPT_URL, $url); $res = curl_exec($ch); // fetch bingy js $pos = strpos($res, 'fte_cities'); // search for the fte_cities variable where the list is stored if ($pos === false) { die('Failed to locate cities JSON in javascript file!'); } // find the beginning of the json string, and the end of the line $startPos = strpos($res, '{', $pos + 1); $endPos = strpos($res, "\n", $pos + 1); $json = trim(substr($res, $startPos, $endPos - $startPos)); // snip out the json if (substr($json, -1) == ';') $json = substr($json, 0, -1); // remove trailing semicolon if present $places = json_decode($json, true); // decode json to php array if ($places == null) { die('Failed to decode JSON string of cities!'); } // array is structured where each country is a key, and the value is an array of cities foreach($places as $country => $cities) { echo "Country: $country<br />\n"; foreach($cities as $city) { echo ' ' ."{$city['name']} - {$city['id']}<br />\n"; } echo "<br />\n"; } 

Некоторые важные примечания:

Если они решат изменить имена файлов javascript, это не сработает. Если они переименуют имя переменной, в которой хранятся города, это не сработает. Если они изменят json для охвата нескольких строк, это не сработает (это маловероятно, потому что оно использует дополнительную пропускную способность). Если они изменяют структуру объекта json, это не сработает.

В любом случае, в зависимости от их модификаций, может быть тривиально снова работать, но это потенциальная проблема. Они также вряд ли могут внести эти логистические изменения, потому что это потребует внесения изменений в несколько файлов, а затем потребует большего тестирования.

Надеюсь, это поможет!