使用PHP和Regex在Steam社区市场上获取商品的价格



我正在尝试使用PHP来获取物品的Steam社区市场价格。我获取一个url(例如:http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29)然后我用CCD_ 1下载内容。我试着使用这个:

function getInnerHTML($string, $tagname, $closetagname) {
    $pattern = "/<$tagname ?.*>(.*)</$closetagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

使用

getInnerHTML($str, 'span class="market_listing_price market_listing_price_with_fee"', 'span');

我可以使用file_get_contents的一个例子是:

<span class="market_table_value">
    <span class="market_listing_price market_listing_price_with_fee">
        $1.92               </span>
    <span class="market_listing_price market_listing_price_without_fee">
        $1.68               </span>
    <br/>
</span>

但它一无所获。

有人有主意吗?

当有一个返回JSON的完美工作调用时,不完全确定为什么要用困难的方式和通过HTML的regex来实现这一点。尽管最初的答案是正确的,并且直接回答了OP问题,但这提供了一种更容易、更有效的获取物品市场价值的方法。

获取

http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=StatTrak%E2%84%A2%20P250%20%7C%20钢铁%20中断%20%28工厂%20新%29

JSON响应

{
  "success": true,
  "lowest_price": "1,43&#8364; ",
  "volume": "562",
  "median_price": "1,60&#8364; "
}

响应定义

success:布尔值,如果调用成功则为true,如果出现问题则为false或Steam市场上没有该商品的列表

lowest_price:根据指定的查询参数,挂起货币符号[pre-ap]的字符串值。请参阅下面的一些附加参数。

volume:以字符串形式返回的整数值(?)-该特定物品已售出/已购买的总数。

median_price:挂起货币符号[pre-ap]的字符串值。商品的平均售价。请参阅Steam市场项目图,以更好地了解如何计算中位数。

查询参数

appid:游戏/应用程序的唯一(静态定义的)Steam应用程序ID,在我们的案例730中是《反恐精英:全球攻势》。有关其他应用程序的列表,请参阅Valve的开发Wiki,尽管随着新应用程序频繁添加到他们的平台上,这个列表很可能总是过时的。

market_hash_name:查询包含外部的项目的名称,检索这些名称可以在查询用户库存时找到,但这是整个其他API调用。

currency:一个整数值;货币价值和返回市场价值的格式。你需要调整这些数字,因为我在这里无法提供太多细节。一般来说,我坚持使用美元作为全球价格,并使用我自己的货币API转换为其他货币。

这是一个未记录的端点,因此可能不是永久性的,或者可能会发生更改,没有人知道

不要将regex用于此任务(请参阅regex匹配除XHTML自包含标记之外的开放标记,但SO上有一个更具解释性的链接)

您希望使用XPath根据精细的标准来选择元素。从PHP.net,这应该会给你想要的节点:

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//span[@class="market_listing_price market_listing_price_with_fee"]');

XPath //span[@class="..."]意味着选择文档中具有期望类属性的所有CCD_。

我通过npm为cs:go市场创建了一个node.js模块。https://www.npmjs.com/package/csgo-market目前它只提供单一价格,但如果您希望我添加其他功能,请告诉我。

最新更新