diff --git a/.gitignore b/.gitignore index c8ef4f6..f118dce 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,8 @@ fastlane/Preview.html fastlane/screenshots fastlane/test_output +/C#/CSharpDemo/bin/* +/C#/CSharpDemo/obj/* +/C#/CSharpDemo/.vs/CSharpDemo/v16/TestStore/0/*.testlog +/C#/CSharpDemo/.vs/CSharpDemo/v16/*.suo +/C#/CSharpDemo/.vs/CSharpDemo/v16/TestStore/0/*.manifest diff --git a/C#/CSharpDemo.sln b/C#/CSharpDemo.sln new file mode 100644 index 0000000..7e743fe --- /dev/null +++ b/C#/CSharpDemo.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31025.194 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpDemo", "CSharpDemo\CSharpDemo.csproj", "{1F904FCB-7180-4388-BDD0-457D56A988AC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1F904FCB-7180-4388-BDD0-457D56A988AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F904FCB-7180-4388-BDD0-457D56A988AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F904FCB-7180-4388-BDD0-457D56A988AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F904FCB-7180-4388-BDD0-457D56A988AC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1475C0AB-18D7-4EE1-ADF7-329BAE45C03B} + EndGlobalSection +EndGlobal diff --git a/C#/CSharpDemo/CSharpDemo.csproj b/C#/CSharpDemo/CSharpDemo.csproj new file mode 100644 index 0000000..3fc13fd --- /dev/null +++ b/C#/CSharpDemo/CSharpDemo.csproj @@ -0,0 +1,13 @@ + + + + Exe + net5.0 + + + + + + + + diff --git a/C#/CSharpDemo/Program.cs b/C#/CSharpDemo/Program.cs new file mode 100644 index 0000000..c61a6b1 --- /dev/null +++ b/C#/CSharpDemo/Program.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using Newtonsoft.Json.Linq; +using RestSharp; + +namespace CSharpDemo +{ + public class Program + { + public static RestClient Client { get; set; } = new RestClient("https://api.seniverse.com/"); + /// + /// 在这里填入你的密钥 + /// + public static string PrivateKey { get; set; } = "your PrivateKey"; + /// + /// 在这里填入你的公钥 + /// + public static string PublicKey { get; set; } = "your PublicKey"; + public static string Api { get; set; } = "v3/weather/daily.json"; + public static string Location { get; set; } = "beijing"; + public static string Language { get; set; } = "zh-Hans"; + public static string Unit { get; set; } = "c"; + public static string Start { get; set; } = "0"; + public static string Days { get; set; } = "2"; + public static string TimeStamp { get; set; } + + /// + /// 签名失效时间 + /// + public static string ttl { get; set; } = "1800"; + static void Main(string[] args) + { + var response = GetWeatherInfoBySign(); + //解析需要的数据 + var weatherModels = JObject.Parse(response).SelectToken("results").First. + SelectToken("daily").ToObject>(); + } + /// + /// 用私钥获取天气信息 + /// + /// + private static string GetWeatherInfo() + { + var request = BuildRestRequest(); + request.AddQueryParameter("key", PrivateKey); + var response = Client.Execute(request).Content; + return response; + } + /// + /// 通过签名获取天气信息 + /// + /// + private static string GetWeatherInfoBySign() + { + var request = BuildRestRequest(); + request.AddQueryParameter("sig", CreateSign()); + request.AddQueryParameter("ts", TimeStamp); + request.AddQueryParameter("ttl", ttl); + request.AddQueryParameter("uid", PublicKey); + + var response = Client.Execute(request).Content; + return response; + } + + private static RestRequest BuildRestRequest() + { + RestRequest request = new RestRequest(Api); + + request.AddQueryParameter("location", Location); + request.AddQueryParameter("language", Language); + request.AddQueryParameter("unit", Unit); + request.AddQueryParameter("start", Start); + request.AddQueryParameter("days", Days); + return request; + } + /// + /// 构造签名 + /// + /// + public static string CreateSign() + { + TimeStamp = GetTimeStamp(); + string queryString = $"ts={TimeStamp}&ttl={ttl}&uid={PublicKey}"; + return HMACSHA1Text(queryString, PrivateKey); + } + /// + /// 获取时间戳 + /// + /// false时是13位 + /// + public static string GetTimeStamp(bool bflag=true) + { + TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); + string ret = string.Empty; + if (bflag) + ret = Convert.ToInt64(ts.TotalSeconds).ToString(); + else + ret = Convert.ToInt64(ts.TotalMilliseconds).ToString(); + + return ret; + } + /// + /// HMACSHA1加密,返回base64 + /// + /// 要加密的原串 + ///私钥 + /// + public static string HMACSHA1Text(string text, string key) + { + //HMACSHA1加密 + HMACSHA1 hmacsha1 = new HMACSHA1(); + hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(key); + + byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(text); + byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer); + + return Convert.ToBase64String(hashBytes); + + } + } + /// + /// 在这里我只解析了关心的数据,大家可按需要把字段都解析出来 + /// + + public class WeatherModel + { + public DateTime date { get; set; } + public string text_day { get; set; } + public double high { get; set; } + public double low { get; set; } + } +}