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; }
+ }
+}