110,561
社区成员
发帖
与我相关
我的任务
分享
class Program
{
static void Main(string[] args)
{
string token = "836349605809985011";
BaiduPush.Send(token, "test", "1");
}
}
public class BaiduPush
{
private const string url = "http://api.tuisong.baidu.com/rest/3.0/push/single_device";
private const string apikey = "FebUmftyzqxOgoR4aoOoBdBk";
private const string secret_key = "TZwIgfXZQ8hF81f1UinCTq7GG5hIW6p6";
public static void Send(string token, string msg, string type)
{
WebClient webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
webClient.Headers.Add("User-Agent", "BCCS_SDK/3.0 (Darwin; Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64; x86_64) PHP/5.6.3 (Baidu Push Server SDK V3.0.0 and so on..) cli/Unknown ZEND/2.6.0");
try
{
byte[] response = webClient.UploadData(url, "POST", StructData(token, msg, type));
}
catch (WebException ex)
{
Stream stream = ex.Response.GetResponseStream();
byte[] bs = new byte[1024];
int index = 0;
int b;
while ((b = stream.ReadByte()) > 0)
{
bs[index++] = (byte)b;
}
stream.Close();
var ss = Encoding.UTF8.GetString(bs, 0, index);
}
}
/// <summary>
/// 参数
/// </summary>
/// <param name="token"></param>
/// <param name="msg"></param>
/// <param name="type"></param>
/// <returns></returns>
private static byte[] StructData(string token, string msg, string type)
{
DateTime utcNow = DateTime.UtcNow;
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
uint timestamp = (uint)(utcNow - epoch).TotalSeconds;
uint expires = (uint)(utcNow.AddDays(1) - epoch).TotalSeconds; //一天后过期
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("apikey", apikey);
dic.Add("timestamp", timestamp.ToString());
dic.Add("expires", expires.ToString());
dic.Add("device_type", "3"); //3:android 4:iOS
dic.Add("channel_id", token);
dic.Add("msg_type", "1"); //取值如下:0:消息;1:通知。默认为0
dic.Add("msg", "{\"title\":\"hello\",\"description\":\"" + msg + "\",\"custom_content\":{\"ClassName\":\"igs.android.healthsleep.MainActivity\",\"PushMessageType\":" + type + "}}");
dic.Add("sign", StructSign("POST", url, dic, secret_key));
StringBuilder sb = new StringBuilder();
foreach (var d in dic)
{
sb.Append(d.Key + "=" + d.Value + "&");
}
sb.Remove(sb.Length - 1, 1);
return Encoding.UTF8.GetBytes(sb.ToString());
}
/// <summary>
/// 构建Sign
/// </summary>
/// <param name="httpMethod"></param>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <param name="secret_key"></param>
/// <returns></returns>
private static string StructSign(string httpMethod, string url, Dictionary<string, string> dic, string secret_key)
{
//按key正序
dic = dic.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
StringBuilder sb = new StringBuilder();
//构建键值对
foreach (var d in dic)
{
sb.Append(d.Key + "=" + d.Value);
}
string sign = httpMethod + url + sb + secret_key;
//url编码
sign = sign.UrlEncode();
//将编码后替换的字符大写,这地方是个坑。。。
char[] cs = new char[sign.Length];
for (int i = 0; i < sign.Length; i++)
{
cs[i] = sign[i];
if (sign[i] == '%')
{
cs[++i] = Convert.ToChar(sign[i].ToString().ToUpper());
cs[++i] = Convert.ToChar(sign[i].ToString().ToUpper());
}
}
//MD5加密
return new string(cs).MD5();
}
}
/// <summary>
/// 扩展方法
/// </summary>
public static class ExtendMethod
{
/// <summary>
/// MD5加密
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string MD5(this string str)
{
byte[] bs = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(str));
return BitConverter.ToString(bs).Replace("-", "");
}
/// <summary>
/// url编码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string UrlEncode(this string str)
{
str = System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
/*
* 不知道为什么微软要把空格编码为+,浏览器不认识啊
* 只能在这里手动替换下了
* */
return str.Replace("+", "%20");
}
}