起因是某天晚上打联盟关键团被人演了,然后第二把又到了他。所以有了这个demo
简单的c#控制台应用
查找队友是否在黑名单,以及把队友添加进黑名单
主要参考:
https://www.52pojie.cn/thread-1569023-1-1.html 开发思路
https://lcu.vivide.re/#operation--lol-career-stats-v1-summoner-games--puuid--get API文档
public static string get(string url)
{
var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
//设置启动的一些参数
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.CreateNoWindow = true;
//获取Process类的新实例
var myProcess = new System.Diagnostics.Process();
myProcess.StartInfo = startInfo;
//启动 cmd.exe
myProcess.Start();
// 输入命令
myProcess.StandardInput.WriteLine("WMIC PROCESS WHERE name=\"LeagueClientUx.exe\" GET commandline");
// 此处很关键,需要输入 exit 表示命令结束,不然会一直阻塞,获取不到输出结果
myProcess.StandardInput.WriteLine("exit");
StreamReader reader = myProcess.StandardOutput;
// 读取命令执行的结果
string strOuput = reader.ReadToEnd();
reader.Close();
myProcess.WaitForExit();
myProcess.Close();
// 再使用正则表达式从读取结果中解析出 端口号 和 密码
// 规则匹配
Regex portRegex = new Regex("--app-port=([0-9]*)");
Regex tokenRegex = new Regex("--remoting-auth-token=([\\w-]*)");
var port = portRegex.Match(strOuput).Value;
var token = tokenRegex.Match(strOuput).Value;
var a = port.IndexOf("=");
var b = token.IndexOf("=");
port = port.Substring(a+1,port.Length-a-1);
token = token.Substring(b+1, token.Length-b-1);
string authorize = Convert.ToBase64String(Encoding.ASCII.GetBytes($"riot:{token}"));
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
//(重点)忽略ssl证书错误
HttpWebRequest request = (HttpWebRequest)WebRequest.Create($"https://127.0.0.1:{port}{url}");
request.UserAgent = null;
request.Method = "Get";
request.Headers.Add("Authorization", "Basic " +authorize);
request.Headers.Add("Accept","application/json");
request.Headers.Add("Content-Type","application/json");
using HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
using Stream st = resp.GetResponseStream();
using StreamReader sr = new StreamReader(st, Encoding.UTF8);
var result = sr.ReadToEnd();
return result;
}
封装的一个get请求,result是JSON格式
然后就是查API文档找想要的功能了,理论上什么什么盒子的功能都能扩展上去
下面写几个用到的API
重点API:
"/lol-champ-select/v1/session"获取当前房间信息
Regex summoner = new Regex("\"summonerId\":([0-9]*)");//从result中提取summoner
Regex summonerId = new Regex(@"[0-9]+");//获取ID
//构建正则获取team
Regex team = new Regex("\"team\":([0-9]*)");//从result中提取队伍
Regex teamId = new Regex(@"[0-9]+");//获取队伍ID
//1蓝2红貌似
"/lol-summoner/v1/summoners/{summonerId}" 通过summonerId获取玩家信息(貌似只能查队友,查敌人会报404)主要获取puuid(应该是全球玩家唯一的标识ID)
对应正则
Regex regex = new Regex("(?<=\"puuid\":\").*(?=\",\"rerollPoints\":)")//Puuid
Regex nameRegex = new Regex("(?<=\"displayName\":\").*(?=\",\"gameName\")");//玩家名字
"/lol-login/v1/session"获取自己的信息
下面是其他代码,主程序就是简单的
while(true){
控制台读取k
if(k1).....
if(k2)....
}
public static void Record(string summonersId,string reason)
{ var context1 = new Context();
var puuid = Getpuuid(summonersId);
var name = GetName(summonersId);
context1.Users.Add(new User(puuid,name,reason,DateTime.Now));
context1.SaveChanges();
}
public static string GetName(string summonersId)
{
Regex nameRegex = new Regex("(?<=\"displayName\":\").*(?=\",\"gameName\")");
var result = get($"/lol-summoner/v1/summoners/{summonersId}");
return nameRegex.Match(result).ToString();
}
public static List<Team> Getduiyou()
{
var result= get("/lol-champ-select/v1/session");
Regex summoner = new Regex("\"summonerId\":([0-9]*)");//从result中提取summoner
Regex summonerId = new Regex(@"[0-9]+");//获取ID
//构建正则获取team
Regex team = new Regex("\"team\":([0-9]*)");//从result中提取队伍
Regex teamId = new Regex(@"[0-9]+");//获取队伍ID
var summonerIds = summoner.Matches(result);
var teams = team.Matches(result);
string[] a1 =new string[summonerIds.Count];
string[] a2 =new string[summonerIds.Count];
int i = 0;
foreach (var g in summonerIds)
{
a1[i]= summonerId.Match(g.ToString()).Value;
i++;
}
int j = 0;
foreach (var h in teams)
{
a2[j] = teamId.Match(h.ToString()).Value;
j++;
}
List<Team> list = new List<Team>();
for (int k = 0; k < summonerIds.Count; k++)
{
Team s = new Team(a1[k], a2[k]);
list.Add(s);
}
var sky = get("/lol-login/v1/session");
var sky1 = summoner.Match(sky).Value;
var myId = summonerId.Match(sky1).Value;
var id = list.FirstOrDefault(p => p.SummonerId.Equals(myId)).TeamId;
List<Team> duiyou=new List<Team>();
foreach (var k in list)
{
if (k.TeamId.Equals(id))
{
duiyou.Add(k);
}
}
return duiyou;
}
public static void CheckUser(string summonersId)
{
Context context=new Context();
var puuid = Getpuuid(summonersId);
var user = context.Users.FirstOrDefault(p=>p.Id==puuid);
if (user!=null)
{
Console.Write("存在仇恨玩家:" +user.GameName+" ID:"+summonersId+" 原因:"+user.Reason+" 时间:"+user.Date);
}
}
public static string Getpuuid(string summonerId)
{
var result = get($"/lol-summoner/v1/summoners/{summonerId}");
Regex regex = new Regex("(?<=\"puuid\":\").*(?=\",\"rerollPoints\":)");
var puuid = regex.Match(result).ToString();
return puuid;
}
}