WechatPublicRequest\Program.cs
| using System.Collections.Specialized; |
| using System.Diagnostics; |
| using System.Web; |
| using Newtonsoft.Json; |
| |
| class Program |
| { |
| |
| static async Task Main() |
| { |
| |
| var latestTxtFilePath = GetLatestTxtFilePath(); |
| System.Console.WriteLine(latestTxtFilePath); |
| string htmlContent = File.ReadAllText(latestTxtFilePath); |
| (string biz, string uin, string pass_ticket, string key, string appmsg_token) = ExtractParameters(htmlContent); |
| var configFilePath = "config.json"; |
| string currentOffset = File.ReadAllText(configFilePath); |
| OffsetConfig offsetConfig = JsonConvert.DeserializeObject<OffsetConfig>(currentOffset) ?? throw new Exception("OffsetConfig is null"); |
| for (int i = offsetConfig.CurrnetOffset; i <= 10000; i += 10) |
| { |
| var offset = i; |
| string newUrl = GenerateNewUrl(offset, 10, biz, uin, pass_ticket, key, appmsg_token); |
| |
| string v = await RequestArticles(newUrl); |
| WeChatMessageResponse? articlResponseDto = JsonConvert.DeserializeObject<WeChatMessageResponse>(v); |
| File.WriteAllText($"response_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.json", JsonConvert.SerializeObject(articlResponseDto)); |
| |
| if (articlResponseDto == null) |
| break; |
| |
| if (articlResponseDto.Ret == -3) |
| { |
| System.Console.WriteLine("Res=-3"); |
| offsetConfig.CurrnetOffset = i; |
| string v1 = JsonConvert.SerializeObject(offsetConfig); |
| File.WriteAllText(configFilePath, v1); |
| break; |
| } |
| |
| if (articlResponseDto.CanMessageContinue == 0) |
| { |
| break; |
| } |
| GeneralMessageList generalMessageList = |
| JsonConvert.DeserializeObject<GeneralMessageList>(articlResponseDto.GeneralMessageListJson) |
| ?? throw new Exception("GeneralMessageList is null"); |
| |
| var articleUrls = new List<string>(); |
| foreach (var article in generalMessageList.List) |
| { |
| long timestamp = article.CommMsgInfo.Datetime; |
| DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(timestamp); |
| DateTime publishTime = dateTimeOffset.LocalDateTime; |
| |
| |
| articleUrls.Add(article.AppMsgExtInfo.ContentUrl); |
| if (article.AppMsgExtInfo.IsMulti == 1) |
| { |
| |
| foreach (var a in article.AppMsgExtInfo.MultiAppMsgItemList) |
| { |
| |
| articleUrls.Add(a.ContentUrl); |
| } |
| } |
| } |
| |
| break; |
| } |
| } |
| |
| private static string GetLatestTxtFilePath() |
| { |
| string newestFilePath; |
| string path = @"C:\Users\user\AppData\Local\Temp"; |
| var directoryInfo = new DirectoryInfo(path); |
| FileInfo? newestFile = directoryInfo.GetFiles("*tmp.txt").OrderByDescending(f => f.CreationTime).FirstOrDefault(); |
| if (newestFile != null) |
| { |
| newestFilePath = newestFile.FullName; |
| } |
| else |
| { |
| newestFilePath = string.Empty; |
| } |
| return newestFilePath; |
| } |
| |
| |
| private static (string biz, string uin, string pass_ticket, string key, string appmsg_token) ExtractParameters(string htmlContent) |
| { |
| string appmsg_token = htmlContent.Split(@"window.appmsg_token = """).Last().Split("\n").First().Replace(@""";", "").Trim(); |
| string key = htmlContent.Split(@"var key = """).Last().Split("\n").First().Replace(@""" || """";", "").Trim(); |
| string pass_ticket = htmlContent.Split(@"var pass_ticket = """).Last().Split("\n").First().Replace(@""" || """";", "").Trim(); |
| string uin = htmlContent.Split(@"var uin = """).Last().Split("\n").First().Replace(@""" || """";", "").Trim(); |
| string biz = htmlContent.Split(@"__biz: '").Last().Split("\n").First().Replace(@"',", "").Trim(); |
| return (biz, uin, pass_ticket, key, appmsg_token); |
| } |
| |
| public static string GenerateNewUrl(int offset, int count, string biz, string uin, string pass_ticket, string key, string appmsg_token) |
| { |
| |
| NameValueCollection newQueryCollection = HttpUtility.ParseQueryString(string.Empty); |
| |
| newQueryCollection.Add("action", "getmsg"); |
| newQueryCollection.Add("__biz", biz); |
| newQueryCollection.Add("f", "json"); |
| newQueryCollection.Add("offset", offset.ToString()); |
| newQueryCollection.Add("count", count.ToString()); |
| newQueryCollection.Add("is_ok", "1"); |
| newQueryCollection.Add("scene", "124"); |
| newQueryCollection.Add("uin", uin); |
| newQueryCollection.Add("key", key); |
| newQueryCollection.Add("pass_ticket", pass_ticket); |
| newQueryCollection.Add("appmsg_token", appmsg_token); |
| newQueryCollection.Add("wxtoken", string.Empty); |
| newQueryCollection.Add("x5", "0"); |
| |
| string? query = newQueryCollection.ToString(); |
| var newUrl = $"https://mp.weixin.qq.com/mp/profile_ext?{query}"; |
| return newUrl; |
| } |
| |
| public static async Task<string> RequestArticles(string url) |
| { |
| var client = new HttpClient(); |
| |
| var request = new HttpRequestMessage |
| { |
| Method = HttpMethod.Get, |
| |
| RequestUri = new Uri(url), |
| |
| Headers = |
| { |
| { "host", "mp.weixin.qq.com" }, |
| { |
| "user-agent", |
| "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" |
| }, |
| { "x-requested-with", "XMLHttpRequest" }, |
| { "accept", "*/*" }, |
| { |
| "referer", |
| "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzIyODU3MzUzNA==&scene=124&uin=NDA4Mzg1NTk1&key=daf9bdc5abc4e8d09279856c85ab26663b0e996252fd607b2035c6db5ff6ab2c3e1e84d19704a7b17655085e77f37bffcf54bbd45d057c86f15cff8940697f997eeb46f73ddfffb2cabff6fb3172ca365a809c8bdd9b9658e11ab0a2eee1f64e0b97c00725713646c85dd157805fd263219bbbed79013f1cd1740092726a24cb&devicetype=Windows+10+x64&version=62090538&lang=zh_CN&a8scene=7&acctmode=0&pass_ticket=YzPgVcUQZmmEtdUZZh+9UodacIwMMAAkaFIFgqe8hnLbKuO53V4Pr0Es/hHANfsJ&winzoom=1" |
| }, |
| |
| { |
| "Cookie", |
| "wxuin=408385595; devicetype=android-33; version=2800315a; lang=zh_CN; pass_ticket=YzPgVcUQZmmEtdUZZh9UodacIwMMAAkaFIFgqe8hnLbKuO53V4Pr0Es/hHANfsJ; wap_sid2=CLvw3cIBEooBeV9IUDdmR1gyc1gzVFhWb3djVkRYWGdPejRGZDF0LXVrSHNoaHVONWthOWpBclZFU3MxMi13ZTAzbUNuUGRCNGFpekI3ZmEyUlR2Y3FWQzZKX0QxWEdDQk9VQUltYUJiUm9FU2dHZ1VCOWFrZW5PcmNFYnVUcWVVRjRjRTZpeTlxYmNOOFNBQUF+MMfe0rUGOA1AlU4=" |
| }, |
| }, |
| }; |
| |
| using (var response = await client.SendAsync(request)) |
| { |
| response.EnsureSuccessStatusCode(); |
| var body = await response.Content.ReadAsStringAsync(); |
| |
| return body; |
| } |
| } |
| } |
| |
| |
| |
WechatPublicRequest\ArticleEntity.cs
| using System; |
| using System.Collections.Generic; |
| using Newtonsoft.Json; |
| |
| public class WeChatMessageResponse |
| { |
| [JsonProperty("ret")] |
| public int Ret { get; set; } |
| |
| [JsonProperty("errmsg")] |
| public string ErrorMessage { get; set; } |
| |
| [JsonProperty("msg_count")] |
| public int MessageCount { get; set; } |
| |
| [JsonProperty("can_msg_continue")] |
| public int CanMessageContinue { get; set; } |
| |
| [JsonProperty("general_msg_list")] |
| public string GeneralMessageListJson { get; set; } |
| |
| [JsonProperty("next_offset")] |
| public int NextOffset { get; set; } |
| |
| [JsonProperty("video_count")] |
| public int VideoCount { get; set; } |
| |
| [JsonProperty("use_video_tab")] |
| public int UseVideoTab { get; set; } |
| |
| [JsonProperty("real_type")] |
| public int RealType { get; set; } |
| |
| [JsonProperty("home_page_list")] |
| public List<object> HomePageList { get; set; } |
| } |
| |
| public class GeneralMessageList |
| { |
| [JsonProperty("list")] |
| public List<MessageItem> List { get; set; } |
| } |
| |
| public class MessageItem |
| { |
| [JsonProperty("comm_msg_info")] |
| public CommMsgInfo CommMsgInfo { get; set; } |
| |
| [JsonProperty("app_msg_ext_info")] |
| public AppMsgExtInfo AppMsgExtInfo { get; set; } |
| } |
| |
| public class CommMsgInfo |
| { |
| [JsonProperty("id")] |
| public long Id { get; set; } |
| |
| [JsonProperty("type")] |
| public int Type { get; set; } |
| |
| [JsonProperty("datetime")] |
| public long Datetime { get; set; } |
| |
| [JsonProperty("fakeid")] |
| public string FakeId { get; set; } |
| |
| [JsonProperty("status")] |
| public int Status { get; set; } |
| |
| [JsonProperty("content")] |
| public string Content { get; set; } |
| } |
| |
| public class AppMsgExtInfo |
| { |
| [JsonProperty("title")] |
| public string Title { get; set; } |
| |
| [JsonProperty("digest")] |
| public string Digest { get; set; } |
| |
| [JsonProperty("content")] |
| public string Content { get; set; } |
| |
| [JsonProperty("fileid")] |
| public int FileId { get; set; } |
| |
| [JsonProperty("content_url")] |
| public string ContentUrl { get; set; } |
| |
| [JsonProperty("source_url")] |
| public string SourceUrl { get; set; } |
| |
| [JsonProperty("cover")] |
| public string Cover { get; set; } |
| |
| [JsonProperty("subtype")] |
| public int Subtype { get; set; } |
| |
| [JsonProperty("is_multi")] |
| public int IsMulti { get; set; } |
| |
| [JsonProperty("multi_app_msg_item_list")] |
| public List<AppMsgExtInfoMulti> MultiAppMsgItemList { get; set; } |
| |
| [JsonProperty("author")] |
| public string Author { get; set; } |
| |
| [JsonProperty("copyright_stat")] |
| public int CopyrightStat { get; set; } |
| |
| [JsonProperty("duration")] |
| public int Duration { get; set; } |
| |
| [JsonProperty("del_flag")] |
| public int DelFlag { get; set; } |
| |
| [JsonProperty("item_show_type")] |
| public int ItemShowType { get; set; } |
| |
| [JsonProperty("audio_fileid")] |
| public int AudioFileId { get; set; } |
| |
| [JsonProperty("play_url")] |
| public string PlayUrl { get; set; } |
| |
| [JsonProperty("malicious_title_reason_id")] |
| public int MaliciousTitleReasonId { get; set; } |
| |
| [JsonProperty("malicious_content_type")] |
| public int MaliciousContentType { get; set; } |
| } |
| |
| public class AppMsgExtInfoMulti |
| { |
| [JsonProperty("title")] |
| public string Title { get; set; } |
| |
| [JsonProperty("digest")] |
| public string Digest { get; set; } |
| |
| [JsonProperty("content")] |
| public string Content { get; set; } |
| |
| [JsonProperty("fileid")] |
| public int FileId { get; set; } |
| |
| [JsonProperty("content_url")] |
| public string ContentUrl { get; set; } |
| |
| [JsonProperty("source_url")] |
| public string SourceUrl { get; set; } |
| |
| [JsonProperty("cover")] |
| public string Cover { get; set; } |
| |
| [JsonProperty("subtype")] |
| public int Subtype { get; set; } |
| |
| |
| [JsonProperty("author")] |
| public string Author { get; set; } |
| |
| [JsonProperty("copyright_stat")] |
| public int CopyrightStat { get; set; } |
| |
| [JsonProperty("duration")] |
| public int Duration { get; set; } |
| |
| [JsonProperty("del_flag")] |
| public int DelFlag { get; set; } |
| |
| [JsonProperty("item_show_type")] |
| public int ItemShowType { get; set; } |
| |
| [JsonProperty("audio_fileid")] |
| public int AudioFileId { get; set; } |
| |
| [JsonProperty("play_url")] |
| public string PlayUrl { get; set; } |
| |
| [JsonProperty("malicious_title_reason_id")] |
| public int MaliciousTitleReasonId { get; set; } |
| |
| [JsonProperty("malicious_content_type")] |
| public int MaliciousContentType { get; set; } |
| } |
| |
| public class OffsetConfig |
| { |
| public int CurrnetOffset { get; set; } |
| public string Biz { get; set; } |
| } |
| |
WechatPublicRequest\config.json
| {"CurrnetOffset":0,"Biz":"MzI5NDg3NTQyMw=="} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-08-10 vue 插槽 slot