web-dev-qa-db-fra.com

Obtenez le prix d'un article sur Steam Community Market avec PHP et regex

J'essaie d'utiliser PHP pour obtenir le prix d'un élément du marché communautaire de Steam. Je prends une URL (par exemple: http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20C7%%Steel%20Disruption%20%28Factory%20New%29 ) puis je télécharge le contenu avec file_get_contents(). J'ai essayé d'utiliser ceci:

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

En utilisant 

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

Voici un exemple de ce que je peux avoir avec 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>

Mais ça ne retourne rien. 

Quelqu'un a une idée?

11
Thomas Kowalski

Vous ne savez pas très bien pourquoi vous voulez le faire à la dure et par regex via HTML quand un appel parfaitement opérationnel retourne JSON. Bien que la réponse initiale soit correcte et réponde directement à la question OP, cela constitue un moyen beaucoup plus simple et efficace d’obtenir la valeur marchande d’un article.

OBTENIR:

_ { 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 _

Réponse JSON:

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

Définitions de la réponse:

success: valeur booléenne, true si l'appel a abouti ou false si quelque chose s'est mal passé ou en l'absence d'annonce pour cet élément sur le marché Steam.

lowest_price: valeur de chaîne avec le symbole monétaire [pre-/ap] suspendu en fonction des paramètres de requête spécifiés. Voir ci-dessous pour quelques paramètres supplémentaires.

volume: valeur entière renvoyée sous forme de chaîne (?) - nombre total de cet article spécifique vendu/acheté.

median_price: valeur de chaîne avec le symbole monétaire [pre-/ap] en attente. Le prix moyen auquel l'article a été vendu. Reportez-vous au graphique des articles Steam marketplace pour une meilleure compréhension de la méthode de calcul de la médiane.

Paramètres de requête:

appid: L'ID d'application Steam (défini statiquement) unique du jeu/de l'application, dans notre cas 730 pour Counter-Strike: Global Offensive. Consultez le wiki de développement de Valve pour obtenir une liste des autres applications, bien que cette liste soit probablement toujours obsolète, car de nouvelles applications sont fréquemment ajoutées à leur plate-forme.

market_hash_name: Le nom de l'élément interrogé avec l'extérieur inclus, la récupération de ces noms peut être trouvée lors d'une requête sur l'inventaire des utilisateurs, mais c'est un tout autre appel d'API.

currency: une valeur entière; la valeur et le format de la devise pour renvoyer les valeurs du marché. Vous devrez modifier ces chiffres et les modifier car je ne peux pas vous donner trop de détails ici. En règle générale, je préfère utiliser l'USD comme prix global et utiliser ma propre API de devise pour convertir d'autres devises.

35
Stephen Lake

N'utilisez pas de regex pour cette tâche (voir RegEx correspond aux balises ouvertes à l'exception des balises autonomes XHTML , mais il existe un lien plus explicatif quelque part sur SO)

Vous souhaitez utiliser XPath pour sélectionner vos éléments en fonction de critères précis. De PHP.net ceci devrait vous donner les nœuds que vous voulez:

$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="..."] signifie que toutes les balises span du document ont l'attribut de classe attendu.

4
Robin

J'ai créé un module node.js via npm pour le marché cs: go. https://www.npmjs.com/package/csgo-market Il n'obtient que des prix uniques pour le moment, mais laissez-moi savoir s'il existe une fonctionnalité supplémentaire que vous souhaitez que je rajoute.

0
httpNick