private async Task <string> AddFileToWx(NewsModel[] news, int mpid, string mediaID) { if (news == null || news.Length <= 0) { return(mediaID); } var account = _accountRepository.FirstOrDefault(m => m.Id == mpid); var access_token = Senparc.Weixin.MP.Containers.AccessTokenContainer.TryGetAccessToken(account.AppId, account.AppSecret); var result = await MediaApi.UploadNewsAsync(access_token, Senparc.Weixin.Config.TIME_OUT, news); return(result.media_id); }
public virtual async Task <string> UploadArticleAndGetMediaID(int mpid, NewsModel newsModel, bool isCreate = true, string mediaID = null) { var account = await _mpAccountAppService.Get(new Abp.Application.Services.Dto.EntityDto <int> { Id = mpid }); var access_token = await _accessTokenContainer.TryGetAccessTokenAsync(account.AppId, account.AppSecret); try { if (isCreate) { return((await MediaApi.UploadNewsAsync(access_token, Senparc.Weixin.Config.TIME_OUT, newsModel)).media_id); } else { await MediaApi.UpdateForeverNewsAsync(access_token, mediaID, 0, newsModel, Senparc.Weixin.Config.TIME_OUT); return(mediaID); } } catch { access_token = await _accessTokenContainer.TryGetAccessTokenAsync(account.AppId, account.AppSecret, true); try { if (isCreate) { return((await MediaApi.UploadNewsAsync(access_token, Senparc.Weixin.Config.TIME_OUT, newsModel)).media_id); } else { await MediaApi.UpdateForeverNewsAsync(access_token, mediaID, 0, newsModel, Senparc.Weixin.Config.TIME_OUT); return(mediaID); } } catch (Exception e) { throw new UserFriendlyException(e.Message); } } }
/// <summary> /// 上传永久图文素材 /// </summary> /// <param name="access_token"></param> /// <param name="timeOut"></param> /// <param name="news"></param> /// <returns></returns> public async Task <UploadForeverMediaResult> UploadNewsAsync(string access_token, string newsstr, int timeOut = 10000) { var news = default(NewsModel[]); try { JObject jObject = Newtonsoft.Json.JsonConvert.DeserializeObject <JObject>(newsstr); JArray jArray = (JArray)(jObject["articles"]); news = new NewsModel[jArray.Count]; for (int i = 0; i < jArray.Count; i++) { news[i] = jArray[i].ToObject <NewsModel>(); } } catch (Exception ex) { throw new Exception("Json格式错误!"); } return(await MediaApi.UploadNewsAsync(access_token, timeOut, news)); }
//[TestMethod] private string UploadAndUpdateNewsTest(string accessToken) { //var file = @"E:\1.jpg"; //var result = MediaApi.UploadForeverMedia(accessToken, file, UploadForeverMediaType.image); //Assert.IsNotNull(result.media_id); var mediaId = UploadForeverMediaTest(); var new1 = new NewsModel() { author = "test", content = "test", content_source_url = "https://weixin.senparc.com/Content/Images/2019/logo-community-two-lines.png", digest = "test", show_cover_pic = "1", thumb_media_id = mediaId, title = "test" }; var new2 = new NewsModel() { author = "test", content = "test111", content_source_url = "https://weixin.senparc.com/Content/Images/2019/logo-community-two-lines.png", digest = "test", show_cover_pic = "1", thumb_media_id = mediaId, title = "test" }; var result = MediaApi.UploadNewsAsync(accessToken, 10000, new1, new2).GetAwaiter().GetResult(); Assert.IsNotNull(result.media_id); Console.WriteLine("上传图文素材成功,mediaId:" + result.media_id); //var result2 = MediaApi.UpdateForeverNews(accessToken, result1.media_id, 0, 10000, new2); //Assert.AreEqual(result2.errcode, ReturnCode.请求成功); return(result.media_id); }
/// <summary> /// 上传永久图文素材 /// </summary> /// <param name="access_token"></param> /// <param name="timeOut"></param> /// <param name="news"></param> /// <returns></returns> public async Task <UploadForeverMediaResult> UploadNewsAsync(string appid, NewsModel[] news, int timeOut = 10000) { var access_token = this.GetAccessToken(appid); return(await MediaApi.UploadNewsAsync(access_token, timeOut, news)); }
/// <summary> /// 推送到微信公共号 /// </summary> /// <returns></returns> public async Task <ActionResult> PushToWeixinAsync() { int maxTitleLength = 60; // 获取新闻原内容 var news = _context.News .Where(n => n.IsPublishToMP == false && n.CreatedTime.Date >= DateTime.Now.Date.AddDays(-5)) .OrderByDescending(n => n.CreatedTime) .Take(10) .ToList(); var random = new Random(); int number = random.Next(3, 6); var blogs = _context.Blogs .Where(b => b.IsPublishMP == false && b.Status != Data.Entity.Status.Obsolete && !string.IsNullOrEmpty(b.Content)) .OrderByDescending(b => b.UpdatedTime) .Take(number) .ToList(); try { var newsList = new List <NewsModel>(); var token = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret); DumpConsole("开始处理新闻"); // 新闻内容 if (news != null && news.Count > 0) { string content = ""; // 上传文章内图片 using (var wc = new WebClient()) { var firstNews = news.FirstOrDefault(); foreach (var item in news) { var tempFileName = StringTools.GetTempFileName("jpg"); wc.DownloadFile(item.ThumbnailUrl + "&w=600", tempFileName); var uploadImgResult = await MediaApi.UploadImgAsync(token, tempFileName); System.IO.File.Delete(tempFileName); // 替换图片链接 content += $@"<div class='row'> <div class='news-title mt-1'> <strong style='font-size:18px;color:#015cda'>{item.Title}</strong> </div> <div> <img src='{uploadImgResult.url}' width='100%' /> </div> <div class='news-description'>{item.Description}</div> <br /><br /> </div>"; item.IsPublishToMP = true; } // 上传封面图片 wc.DownloadFile(firstNews?.ThumbnailUrl + "&w=600", "temp.jpg"); var thumbImg = await MediaApi.UploadForeverMediaAsync(token, "temp.jpg"); // TODO:上传后可删除 var mainNews = new NewsModel { author = "MSDev_NilTor", thumb_media_id = thumbImg.media_id, content = content, title = "资讯一览:" + firstNews?.Title, show_cover_pic = "0", content_source_url = "https://guandian.tech", digest = "", }; mainNews.title = mainNews.title.Length > maxTitleLength?mainNews.title.Substring(0, maxTitleLength) : mainNews.title; newsList.Add(mainNews); } } DumpConsole("新闻处理完成"); DumpConsole("开始处理博客"); // 博客内容 if (blogs != null && blogs.Count > 0) { using (var hc = new HttpClient()) { hc.Timeout = TimeSpan.FromSeconds(5); var htmlDoc = new HtmlDocument(); try { foreach (var item in blogs) { // 处理文章内图片 htmlDoc.LoadHtml(item.Content); var root = htmlDoc.DocumentNode; var imageNodes = root.SelectNodes(".//img"); // 移除视频元素 var videoNodes = root.SelectNodes(".//video"); if (videoNodes != null && videoNodes.Count > 0) { foreach (var video in videoNodes) { root.SelectSingleNode(video.XPath).Remove(); } } string mediaId = ""; if (imageNodes != null) { for (int i = 0; i < imageNodes.Count; i++) { var url = imageNodes[i].GetAttributeValue("src", null); // 只保留jpg图片 if (!url.EndsWith(".jpg")) { root.SelectSingleNode(imageNodes[i].XPath).Remove(); } else { DumpConsole(item.Title + " 图片处理"); var image = imageNodes[i].Attributes["src"].Value; var tempFileName = StringTools.GetTempFileName("jpg"); await DownloadFile(hc, image, tempFileName); // 判断大小. TODO:处理图片大小 var file = new FileInfo(tempFileName); if (file.Length > 1 * 1024 * 1024) { continue; } var uploadImgResult = await MediaApi.UploadImgAsync(token, tempFileName); DumpConsole("上传图片" + image + " " + file.Length / 1024); System.IO.File.Delete(tempFileName); // 替换文本 imageNodes[i].SetAttributeValue("src", uploadImgResult.url); // TODO:后面可删除该封面 } } } // 缩略图 var mediaResult = await MediaApi.GetOthersMediaListAsync(token, Senparc.Weixin.MP.UploadMediaFileType.image, 0, 2); var defaultMediaId = mediaResult.item?.FirstOrDefault()?.media_id; // 下载缩略图,下载失败则使用默认图 var tempFileName1 = StringTools.GetTempFileName("jpg"); await DownloadFile(hc, item.Thumbnail, tempFileName1); if (System.IO.File.Exists(tempFileName1)) { var thumbImg = await MediaApi.UploadForeverMediaAsync(token, tempFileName1); mediaId = thumbImg.media_id; } else { mediaId = defaultMediaId; } // 处理内容,微信消息最大长度为2W字符,小于1M Console.WriteLine("长度:" + root.InnerHtml.Length); if (root.InnerHtml.Length >= 20000) { root.InnerHtml = root.InnerHtml.Substring(0, 19500); } // 构造图文消息体 var currentNews = new NewsModel { author = item.AuthorName, thumb_media_id = mediaId, // html如果有#,会报错 content = root.InnerHtml.Replace("#", ""), // 长度处理 title = item.Title.Length > maxTitleLength?item.Title.Substring(0, maxTitleLength) : item.Title, show_cover_pic = "0", content_source_url = "https://guandian.tech/blogs/detail/" + item.Id, digest = "", }; DumpConsole("博客标题:" + currentNews.title + "; 长度:" + currentNews.title.Length); item.IsPublishMP = true; newsList.Add(currentNews); } } catch (Exception e) { DumpConsole(e.Message); } } } if (newsList.Count < 1) { DumpConsole("无可推送内容"); return(Ok()); } // 上传图文 var uploadNewsResult = await MediaApi.UploadNewsAsync(token, news : newsList.ToArray()); if (uploadNewsResult.media_id != null) { var userList = await UserApi.GetAsync(token, null); var firstUserOpenId = userList.data.openid.FirstOrDefault(); // 预览 var sendPreviewResult = await GroupMessageApi.SendGroupMessagePreviewAsync(token, Senparc.Weixin.MP.GroupMessageType.mpnews, uploadNewsResult.media_id, null, "EstNil"); // 群发消息 var sendNewsResult = await GroupMessageApi.SendGroupMessageByTagIdAsync(token, null, uploadNewsResult.media_id, Senparc.Weixin.MP.GroupMessageType.mpnews, true); // 未成功则删除上传的素材 if (sendNewsResult.errcode != 0) { var deleteResult = await MediaApi.DeleteForeverMediaAsync(token, uploadNewsResult.media_id); } else { // 成功后更新数据库标识 _context.UpdateRange(news); _context.UpdateRange(blogs); _context.SaveChanges(); } } } catch (Exception e) { DumpConsole(e.Message + e.InnerException); } return(Ok()); }
public async Task <string> PushMaterialAsync(string accessTokenOrAppId, MaterialType materialType, int materialId) { string mediaId = null; if (materialType == MaterialType.Message) { var message = await _materialMessageRepository.GetAsync(materialId); var newsList = new List <NewsModel>(); foreach (var item in message.Items) { var news = new NewsModel { thumb_media_id = item.ThumbMediaId, author = item.Author, title = item.Title, content_source_url = item.ContentSourceUrl, content = item.Content, digest = item.Digest, show_cover_pic = item.ShowCoverPic ? "1" : "0", thumb_url = item.ThumbUrl, need_open_comment = item.CommentType == CommentType.Block ? 0 : 1, only_fans_can_comment = item.CommentType == CommentType.OnlyFans ? 1 : 0 }; newsList.Add(news); } mediaId = message.MediaId; if (string.IsNullOrEmpty(mediaId)) { var result = await MediaApi.UploadNewsAsync(accessTokenOrAppId, 10000, newsList.ToArray()); mediaId = result.media_id; await _materialMessageRepository.UpdateMediaIdAsync(materialId, mediaId); } else { var index = 0; foreach (var news in newsList) { await MediaApi.UpdateForeverNewsAsync(accessTokenOrAppId, message.MediaId, index ++, news); } } // sync article url var media = await MediaApi.GetForeverNewsAsync(accessTokenOrAppId, mediaId); for (var i = 0; i < message.Items.Count; i++) { var item = media.news_item[i]; await _materialArticleRepository.UpdateUrlAsync(message.Items[i].MaterialId, item.url); } } else if (materialType == MaterialType.Image) { var image = await _materialImageRepository.GetAsync(materialId); mediaId = image.MediaId; if (string.IsNullOrEmpty(mediaId)) { var filePath = _pathManager.ParsePath(image.Url); if (FileUtils.IsFileExists(filePath)) { var result = await MediaApi.UploadForeverMediaAsync(accessTokenOrAppId, filePath); mediaId = result.media_id; await _materialImageRepository.UpdateMediaIdAsync(materialId, mediaId); } } } else if (materialType == MaterialType.Audio) { var audio = await _materialAudioRepository.GetAsync(materialId); mediaId = audio.MediaId; if (string.IsNullOrEmpty(mediaId)) { var filePath = _pathManager.ParsePath(audio.Url); if (FileUtils.IsFileExists(filePath)) { var result = await MediaApi.UploadForeverMediaAsync(accessTokenOrAppId, filePath); mediaId = result.media_id; await _materialAudioRepository.UpdateMediaIdAsync(materialId, mediaId); } } } else if (materialType == MaterialType.Video) { var video = await _materialVideoRepository.GetAsync(materialId); mediaId = video.MediaId; if (string.IsNullOrEmpty(mediaId)) { var filePath = _pathManager.ParsePath(video.Url); if (FileUtils.IsFileExists(filePath)) { var result = await MediaApi.UploadForeverMediaAsync(accessTokenOrAppId, filePath); mediaId = result.media_id; await _materialVideoRepository.UpdateMediaIdAsync(materialId, mediaId); } } } return(mediaId); }