using System; using System.Data; using System.Configuration; using System.Web; using System.Net; using System.IO; using System.Security.Cryptography; using System.Xml; using System.Collections.Specialized; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Text; using System.Globalization; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data; using System.Data.SqlClient; using System.Web.Script.Serialization; using TencentCloud.Common; using TencentCloud.Common.Profile; using TencentCloud.Vod.V20180717; using TencentCloud.Vod.V20180717.Models; namespace Mtxfw.shop { public partial class livetoken : System.Web.UI.Page { /// /// 填写你申请的登录资料 /// public Mtxfw.Utility.Config config = new Mtxfw.Utility.Config(""); public Mtxfw.DAL.Article daoArt = new Mtxfw.DAL.Article(); public Mtxfw.DAL.user_info daoUser = new Mtxfw.DAL.user_info(); DAL.user_live daolive = new DAL.user_live(); DAL.user_livefile daofile = new DAL.user_livefile(); public int gtype = 0; protected void Page_Load(object sender, EventArgs e) { string hostname = Request.Url.Host; if (!IsPostBack) { Mtxfw.Utility.Common.WriteHtml("/weixin/response.txt", "dddddd"); if (!String.IsNullOrEmpty(Request.QueryString["action"])) { Mtxfw.Utility.Common.WriteHtml("/weixin/response1.txt", Request.QueryString["action"].ToString()); } //以下为阿里云直播 /* if (!String.IsNullOrEmpty(Request.QueryString["action"]) && !String.IsNullOrEmpty(Request.QueryString["id"])) { string action = Request.QueryString["action"].ToString(); string usrargs = ""; if (!String.IsNullOrEmpty(Request.QueryString["usrargs"])) { usrargs = Request.QueryString["usrargs"].ToString(); } string StreamName = Request.QueryString["id"].ToString(); int MemberId = Convert.ToInt32(StreamName.Replace("zb", "")); Mtxfw.Utility.Common.WriteHtml("/weixin/response0.txt", action); if (action == "publish") { Model.user_live lmodel = daolive.GetModelByMemberId(MemberId, 0); if (lmodel != null) { lmodel.seef = 1; daolive.Update(lmodel); Response.Write("200"); } } else if (action == "publish_done") { Model.user_live lmodel = daolive.GetModelByMemberId(MemberId, 0); if (lmodel != null) { if (lmodel.seef == 1) { lmodel.seef = 2; daolive.Update(lmodel); Response.Write("200"); } } } } if (Request.GetBufferlessInputStream() != null) { StreamReader reader = new StreamReader(Request.GetBufferlessInputStream()); string response = reader.ReadToEnd(); Mtxfw.Utility.Common.WriteHtml("/weixin/response.txt", response); if (response.IndexOf("start_time") != -1) { alilivefile ftoken = (alilivefile)FromfileJson(response); Mtxfw.Model.user_livefile lmodel = new Model.user_livefile(); lmodel.MemberId = Convert.ToInt32(ftoken.stream.Replace("zb", "")); lmodel.stream_id = ftoken.stream; lmodel.channel_id = ftoken.app; lmodel.file_id = ""; lmodel.file_format = ""; lmodel.start_time = ftoken.start_time; lmodel.end_time = ftoken.stop_time; lmodel.duration = Convert.ToInt64(ftoken.duration.Split('.')[0]); lmodel.file_size = 0; lmodel.stream_param = ""; lmodel.video_url = ftoken.uri; lmodel.seef = 0; lmodel.LinkID = 0; lmodel.ttype = 0; lmodel.addtime = DateTime.Now; daofile.Add(lmodel); } }*/ //以下为腾讯云直播 if (Request.GetBufferlessInputStream() != null) { StreamReader reader = new StreamReader(Request.GetBufferlessInputStream()); string response = reader.ReadToEnd(); Mtxfw.Utility.Common.WriteHtml("/weixin/response.txt", response); livetoken_type ltoken = (livetoken_type)FromJson(response); string strsign = ""; MD5 md5 = new MD5CryptoServiceProvider(); string strkey = "ddd8967bdfb642e37d1da3e05ce9ead5" + ltoken.t; StringBuilder sb = new StringBuilder(32); byte[] t = md5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes(strkey)); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } Mtxfw.Utility.Common.WriteHtml("/weixin/responsesign.txt", sb.ToString() + "|" + ltoken.sign); if (sb.ToString() == ltoken.sign) { if (ltoken.event_type == 1) { livestream_id ftoken = (livestream_id)FromJson0(response); int liveid = Convert.ToInt32(ftoken.stream_id.Replace("zb", "")); Model.user_live lmodel = daolive.GetModel(liveid); if (lmodel != null) { lmodel.seef = 1; daolive.Update(lmodel); } } else if (ltoken.event_type == 0) { livestream_id ftoken = (livestream_id)FromJson0(response); int liveid = Convert.ToInt32(ftoken.stream_id.Replace("zb", "")); Model.user_live lmodel = daolive.GetModel(liveid); if (lmodel != null) { if (lmodel.seef != 2 && lmodel.seef != 3 && lmodel.seef != 4) { lmodel.seef = 3; lmodel.EndTime = DateTime.Now; daolive.Update(lmodel); Mtxfw.Model.Article model = new Mtxfw.Model.Article(); model.senderid = 0; model.receiverid = lmodel.MemberId; model.Title = "直播信息"; model.ParentID = 21; model.CategoryId = lmodel.Id.ToString(); model.AddTime = DateTime.Now; model.Author = ""; model.Content = "直播已结束"; model.Paths = ""; model.Content2 = ""; model.Paths2 = ""; model.KeyWords = ""; model.media_id = ""; model.thumb_media_id = ""; model.wtype = 0; model.wtype2 = 0; model.LinkID = 0; model.Seef = 0; model.gtype = gtype; new DAL.Article().Add(model); } } } else if (ltoken.event_type == 100) { try { livetoken_file ftoken = (livetoken_file)FromJson1(response); int liveid = Convert.ToInt32(ftoken.stream_id.Replace("zb", "")); Model.user_live lmodel = daolive.GetModel(liveid); if (lmodel != null) { System.Threading.Thread.Sleep(10); Int64 width = 0, height = 0; try { // 必要步骤: // 实例化一个认证对象,入参需要传入腾讯云账户密钥对 SecretId,SecretKey。 // 本示例采用从环境变量读取的方式,则需要在环境变量中先设置这两个值。 // 您也可以直接将密钥对写入代码中,但是注意不要复制、上传或分享代码,以免泄露密钥对危及您的财产安全。 Credential cred = new Credential { SecretId = config.AccessKeyId, SecretKey = config.AccessKeySecret }; // 实例化一个 client 选项,可选的,没有特殊需求可以跳过 ClientProfile clientProfile = new ClientProfile(); // 指定签名算法(默认为 HmacSHA256) clientProfile.SignMethod = ClientProfile.SIGN_SHA1; // 非必要步骤 // 实例化一个客户端配置对象,可以指定超时时间等配置 HttpProfile httpProfile = new HttpProfile(); // SDK 默认使用 POST 方法。 // 如果您一定要使用 GET 方法,可以在这里设置。GET 方法无法处理一些较大的请求。 httpProfile.ReqMethod = "POST"; // SDK 有默认的超时时间,非必要请不要进行调整。 // 如有需要请在代码中查阅以获取最新的默认值。 httpProfile.Timeout = 30; // 请求连接超时时间,单位为秒,默认值为60 // SDK 会自动指定域名。通常无需指定域名,但如果您访问的是金融区的服务,则必须手动指定域名。 // 例如云服务器的上海金融区域名:cvm.ap-shanghai-fsi.tencentcloudapi.com // 代理服务器,当您的环境下有代理服务器时设定 httpProfile.WebProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY"); clientProfile.HttpProfile = httpProfile; // 实例化要请求产品(以 CVM 为例)的 client 对象 // 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量,clientProfile 是可选的 VodClient client = new VodClient(cred, "ap-beijing", clientProfile); DescribeMediaInfosRequest req = new DescribeMediaInfosRequest(); req.FileIds[0] = ftoken.file_id; req.Filters[0] = "metaData"; DescribeMediaInfosResponse res = client.DescribeMediaInfosSync(req); // 输出 JSON 格式的字符串回包 Mtxfw.Utility.Common.WriteHtml("/weixin/DescribeMediaInfos0.txt", AbstractModel.ToJsonString(res) + "|" + res.RequestId); if (res.MediaInfoSet[0].MetaData.Width != null) { width = Convert.ToInt64(res.MediaInfoSet[0].MetaData.Width); } if (res.MediaInfoSet[0].MetaData.Height != null) { height = Convert.ToInt64(res.MediaInfoSet[0].MetaData.Height); } } catch (Exception err0) { Mtxfw.Utility.Common.WriteHtml("/weixin/responseerr0.txt", err0.ToString()); } Mtxfw.Model.user_livefile fmodel = new Model.user_livefile(); fmodel.MemberId = lmodel.MemberId; fmodel.liveid = lmodel.Id; fmodel.stream_id = ftoken.stream_id; fmodel.channel_id = ftoken.channel_id; fmodel.file_id = ftoken.file_id; fmodel.file_format = ftoken.file_format; fmodel.start_time = ftoken.start_time; fmodel.end_time = ftoken.end_time; fmodel.duration = ftoken.duration; fmodel.width = width; fmodel.height = height; fmodel.file_size = ftoken.file_size; fmodel.stream_param = ftoken.stream_param; fmodel.video_url = ftoken.video_url; fmodel.seef = 0; fmodel.LinkID = 0; fmodel.ttype = 0; fmodel.addtime = DateTime.Now; fmodel.gtype = lmodel.gtype; daofile.Add(fmodel); } } catch (Exception err) { Mtxfw.Utility.Common.WriteHtml("/weixin/responseerr.txt", err.ToString()); } } Response.Write("{\"code\":0}"); } } } } public object FromJson(string json) { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Deserialize(json); } public object FromJson0(string json) { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Deserialize(json); } public object FromJson1(string json) { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Deserialize(json); } public object FromfileJson(string json) { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Deserialize(json); } } public class alilivefile { public String domain { get; set; } public String app { get; set; } public String stream { get; set; } public String uri { get; set; } public string duration { get; set; } public Int64 start_time { get; set; } public Int64 stop_time { get; set; } } public class livetoken_type { public int event_type { get; set; } public String sign { get; set; } public Int64 t { get; set; } } public class livestream_id { public string stream_id { get; set; } } public class livetoken_file { public int event_type { get; set; } public string stream_id { get; set; }//直播流名称 public string channel_id { get; set; }//同直播流名称 public string file_id { get; set; }//点播 file ID,在点播平台可以唯一定位一个点播视频文件 public string file_format { get; set; }//flv,hls,mp4,aac public Int64 start_time { get; set; }//录制文件起始时间戳 public Int64 end_time { get; set; }//录制文件结束时间戳 public Int64 duration { get; set; }//录制文件时长,单位秒 public UInt64 file_size { get; set; }//录制文件大小,单位字节 public string stream_param { get; set; }//用户推流 URL 所带参数 public string video_url { get; set; }//录制文件文件下载 URL public String sign { get; set; } public Int64 t { get; set; } } }