web-dev-qa-db-ja.com

PHPおよび正規表現でSteamコミュニティマーケットのアイテムの価格を取得する

PHPを使用して、アイテムのSteamコミュニティマーケット価格を取得しようとしています。URLを取得します(例: http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29 )そして、file_get_contents()でコンテンツをダウンロードしました。これを使って :

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>

しかし、何も返しません。

誰にもアイデアはありますか?

12
Thomas Kowalski

JSONを返す完全に機能する呼び出しがあるときに、なぜこれを難しい方法で行い、HTMLで正規表現するのかが完全にはわかりません。元の答えは正しく、OPの質問に直接答えますが、これにより、アイテムの市場価値を取得するはるかに簡単で効率的な方法が提供されます。

[〜#〜] get [〜#〜]

http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%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] pendedを含む文字列値。アイテムが販売された平均価格。中央値がどのように計算されるかについてのより良い理解については、 Steam marketplace アイテムグラフを参照してください。

クエリパラメータ

appid:ゲーム/アプリの一意の(静的に定義された)SteamアプリケーションID。この場合、Counter-Strike:Global Offensiveの場合は730です。他のappidのリストについては、Valveの開発Wikiを参照してください。ただし、新しいアプリが頻繁にプラットフォームに追加されるため、このリストは常に最新のものではありません。

market_hash_name:外部を含むクエリ対象のアイテムの名前。これらの名前の取得は、ユーザーインベントリに対してクエリを実行したときに検出できますが、これはまったく別のAPI呼び出しです。

currency:整数値。市場価値を返すための通貨価値と形式。ここではあまり詳細に説明できないので、これらの数値を微調整して試してみる必要があります。通常、私は米ドルをグローバル価格として使用し、独自の通貨APIを使用して他の通貨に換算します。

36
Stephen Lake

このタスクには正規表現を使用しないでください( 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="..."]は、予想されるクラス属性を持つドキュメント内のすべてのspanタグを選択することを意味します。

4
Robin

Cs:goマーケット用にnpm経由でnode.jsモジュールを作成しました。 https://www.npmjs.com/package/csgo-market 現時点では単一の価格しか取得できませんが、追加したい追加機能がある場合はお知らせください。

0
httpNick