我一直在为Jessecar的SteamBot制作一个自定义用户处理程序,这与我遇到的问题无关,但基本上我所做的是,我是'我做了它,所以你可以设置机器人按照应用程序ID玩一个特定的游戏,我一直在使用这个来为Steam交易卡的游戏闲置,唯一的问题是,我能检查它的唯一方法&# 39;完成后,通过检查它的库存以及应该丢弃多少张牌,这不是太麻烦,但我创造这个的主要原因是效率,并且这样做每次失败它的目的。
正因为如此,我尝试从它正在玩的游戏的机器人徽章页面获取数据,这是我到目前为止所拥有的......
else if (message.StartsWith(".updateidle"))
{
var webGet = new HtmlWeb();
var SteamID64 = Bot.SteamClient.SteamID.ConvertToUInt64();
string htmlget = "http://www.steamcommunity.com/profiles/" + SteamID64 + "/gamecards/" + newgame;
var doc = webGet.Load(htmlget);
HtmlNode hoursNode = doc.DocumentNode.SelectSingleNode("//div[@class=\"badge_title_stats_playtime\"]");
string hours = Regex.Match(hoursNode.InnerText, @"[0-9\.,]+").Value;
var cards = doc.DocumentNode.SelectSingleNode("div[@class='badge_title_stats_drops']/span").InnerText;
if (hours == string.Empty)
{
hours = "0.0";
}
Bot.SteamFriends.SendChatMessage(OtherSID, type, "I have been idling for " + hours + " hours on game " + newgame + " and have " + cards + " card drops remaining.");
}
让小时工作正常,如果机器人没有时间在那个游戏上,它就不会出现,所以我只检查它是否为空,然后将其设置为0.0,但是,使用这些卡,它看起来像是"没有卡片掉落"或"卡片丢弃剩余"它也没有得到,我尝试使用与小时相同的方法,只有得到它,如果它是一个数字,它仍然返回" 0",同样的结果为此...
我再次尝试检查字符串是否为空,因为这可能意味着没有卡片丢失,因为没有数字,我也在网上查看获取范围内的数据的方法div或span数据一般,并且两种方法都不起作用,它们只是返回" 0"。如果你还不能说,我确实有HTML Agility Pack。
答案 0 :(得分:1)
您需要更具体地了解要选择的节点。我强烈反对你不要使用正则表达式来尝试导航htmldocument的innertext或innerhtml。 查找HTmlNodes,了解是否还有卡片要丢弃。尝试使用这个xpath:
"//span[@class='progress_info_bold']"
这些节点将包含文本:
"没有卡丢失"
或
数+"卡片丢弃剩余"
答案 1 :(得分:1)
因此,在我之前的回答中,我决定不编辑,因为这里的后续工作会很大。我为此欢乐使用Selenium和Html Agility Pack。首先我使用Selenium登录(我使用的是Mono btw)。之后我输入手动授权我的电脑(如果您已经授权,然后跳过此步骤),然后转到控制台并按任意键继续获取卡信息。在这种情况下,我会收集所有游戏的卡片信息。我无法确定哪个游戏仍有卡片掉落,因为它还没有实现。
class MainClass
{
public static void Main(string[] args)
{
string userName = "username";
string password ="password";
string steamProfile = "steamprofile";
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
using (var driver = new FirefoxDriver())
{
// Go to the home page
driver.Navigate().GoToUrl("https://store.steampowered.com//login/?redir=0");
// Get the page elements
var userNameField = driver.FindElementById("input_username");
var userPasswordField = driver.FindElementById("input_password");
//var loginButton = driver.FindElementById("login_btn_signin");
var loginButton = driver.FindElementByXPath("//button[@class='btnv6_blue_hoverfade btn_medium']");
// Type user name and password
userNameField.SendKeys(userName);
userPasswordField.SendKeys(password);
// and click the login button
loginButton.Click();
System.Threading.Thread.Sleep(5000);
//Type authorization code and enter manually.
System.Console.ReadKey();
driver.Navigate().GoToUrl("http://steamcommunity.com/profiles/"+steamProfile+"/badges");
driver.GetScreenshot().SaveAsFile(@"screen.png", ImageFormat.Png); //Debuggin purposes, as I was first using PhantomJS
htmlDoc.LoadHtml(driver.PageSource);
Console.Clear();
}
HtmlNodeCollection col = htmlDoc.DocumentNode.SelectNodes("//span[@class='progress_info_bold']");
foreach (HtmlNode n in col)
{
Console.WriteLine(n.InnerText);
}
}
}
}
我案例中的输出
5 of 29 tasks completed
No card drops remaining
No card drops remaining
No card drops remaining
4 card drops remaining
3 card drops remaining
此代码还为您提供徽章进度。你必须弄清楚如何在Html Agility Pack中过滤你的数据(阅读xpath)。我还建议您使用Selenium,因为您可以使用它从您的网页开始一个蒸汽游戏。
记住我在第一个答案中给你的xpath,也用在上面的代码中找到ALL(" //"),它的类等于" progress_info_bold&#34 ;