c# 基于Titanium爬取微信公众号历史文章列表

C# 基于Titanium爬取微信公众号历史文章列表攻略

1. 准备工作

1.1 安装Titanium

Titanium是一款爬虫框架,需要使用C#编写,因此在开始之前需要确保您已经安装了Titanium。您可以在Titanium官网下载最新版的Titanium,并根据其安装说明进行安装。

1.2 获取微信公众号的cookie

我们需要使用微信公众号的cookie来进行爬取。您可以使用您的微信账号登录公众号并手动保存cookie,也可以使用模拟登录获取cookie。以下为使用模拟登录获取cookie的示例代码:

using System;
using System.Net;
using System.Text;
using System.Web;
using System.IO;

namespace WeChatCrawler
{
    public class WeChatLogin
    {
        private static string wechatAccount = "your_wechat_account";
        private static string wechatPassword = "your_wechat_password";

        private static CookieContainer cookieContainer = new CookieContainer();

        public static void Login()
        {
            string loginUrl = "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.CookieContainer = cookieContainer;

            string postData = string.Format("username={0}&pwd={1}&imgcode=&f=json&userlang=zh_CN&redirect_url=&token=&lang=zh_CN", wechatAccount, wechatPassword);

            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = byteArray.Length;
            Stream loginStream = request.GetRequestStream();
            loginStream.Write(byteArray, 0, byteArray.Length);
            loginStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
            response.Close();

            Console.WriteLine("微信公众号登录成功!");
        }

        public static CookieContainer GetCookieContainer()
        {
            return cookieContainer;
        }
    }
}

2. 爬取历史文章列表

2.1 获取公众号的__biz参数

在开始爬取微信公众号的历史文章列表之前,您需要先获取公众号的__biz参数。您可以通过浏览器的开发者工具,或者通过抓包工具获取。以下为使用模拟登录获取__biz参数的示例代码:

private static string GetBiz()
{
    string bizUrl = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=&lang=zh_CN";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(bizUrl);
    request.Method = "GET";
    request.CookieContainer = WeChatLogin.GetCookieContainer();

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
    string responseData = streamReader.ReadToEnd();
    streamReader.Close();

    string bizPattern = @"<script id=""microbar"" type=""text/html"">([\s\S]*?)</script>";
    Match bizMatch = Regex.Match(responseData, bizPattern);
    string bizData = HttpUtility.HtmlDecode(bizMatch.Groups[1].Value);

    string biz = "";
    biz = Regex.Match(bizData, @"<a href=""/cgi-bin/menu/menu_manage\?t=menu/index&action=menu_edit&[\s\S]*?&biz=(?<biz>.*?)&[\s\S]*?"">").Groups["biz"].Value;

    Console.WriteLine("公众号biz参数获取成功:{0}", biz);

    return biz;
}

2.2 构建请求URL和POST数据

在获取__biz参数之后,您需要构建请求URL和POST数据来获取历史文章列表。以下为请求URL和POST数据的示例代码:

private static string BuildUrl(string biz, int offset, int count)
{
    string baseUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex";
    string postData = string.Format("type=9&query=&is_only_read=1&is_include_edu=1&is_include_old=1&is_include_ad=1&begin={0}&count={1}&fakeid={2}&token=&lang=zh_CN", offset, count, biz);

    return baseUrl + "&" + postData;
}

2.3 发送请求并解析返回结果

最后,您需要发送请求并解析返回结果来获取历史文章列表。以下为发送请求并解析返回结果的示例代码:

private static List<Article> GetArticles(string biz)
{
    List<Article> articles = new List<Article>();

    int offset = 0;
    int count = 10;
    int maxCount = 100;

    while (count <= maxCount)
    {
        string getUrl = BuildUrl(biz, offset, count);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(getUrl);
        request.Method = "GET";
        request.CookieContainer = WeChatLogin.GetCookieContainer();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
        string responseData = streamReader.ReadToEnd();
        streamReader.Close();

        JObject jsonResult = JObject.Parse(responseData);

        JToken articleList = jsonResult["app_msg_list"];
        foreach (var articleItem in articleList)
        {
            Article article = new Article();
            article.Title = articleItem["title"].ToString();
            article.Url = articleItem["link"].ToString();
            article.PubTime = long.Parse(articleItem["create_time"].ToString());
            articles.Add(article);
        }

        if (maxCount == count || articleList.Count() <= 0)
        {
            break;
        }

        offset += count;
        count = maxCount - offset;
        if (count > 20)
        {
            count = 20;
        }
    }

    return articles;
}

3. 示例说明

3.1 示例1:获取公众号为“网易”(biz为“MjM5NTMxMTQ2MA==”)的历史文章列表

static void Main(string[] args)
{
    WeChatLogin.Login();

    string biz = "MjM5NTMxMTQ2MA==";
    List<Article> articles = GetArticles(biz);

    Console.WriteLine("网易公众号历史文章列表:");
    foreach (var article in articles)
    {
        Console.WriteLine("{0}({1}):{2}", article.Title, TimestampToDateTime(article.PubTime), article.Url);
    }

    Console.ReadLine();
}

3.2 示例2:获取公众号为“人民网”(biz为“MjM5NTY5MTE0MA==”)的历史文章列表

static void Main(string[] args)
{
    WeChatLogin.Login();

    string biz = "MjM5NTY5MTE0MA==";
    List<Article> articles = GetArticles(biz);

    Console.WriteLine("人民网公众号历史文章列表:");
    foreach (var article in articles)
    {
        Console.WriteLine("{0}({1}):{2}", article.Title, TimestampToDateTime(article.PubTime), article.Url);
    }

    Console.ReadLine();
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 基于Titanium爬取微信公众号历史文章列表 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • .NET企业级项目中遇到的国际化问题和解决方法

    .NET企业级项目中国际化问题与解决方法 背景介绍 .NET作为微软公司开发的开源框架,被广泛应用于企业级项目中。在这些项目中,涉及到国际化问题是必不可少的,因为项目需要支持多个语言、多个地区的用户。本文将详细介绍.NET企业级项目中遇到的国际化问题和解决方法,以及通过两个示例来说明如何使用.NET进行国际化。 国际化问题 问题描述 .NET企业级项目在国际…

    C# 2023年5月14日
    00
  • ASP.NET Core模仿中间件方式实现列表过滤功能

    ASP.NET Core模仿中间件方式实现列表过滤功能攻略 在ASP.NET Core中,可以使用中间件来实现列表过滤功能。本攻略将提供详细的步骤和示例说明,演示如何在ASP.NET Core中实现列表过滤功能。 步骤 步骤1:创建一个新的ASP.NET Core Web应用程序 首先,需要创建一个新的ASP.NET Core Web应用程序。可以使用以下命…

    C# 2023年5月17日
    00
  • .NET 纯分页代码实例

    下面是对“.NET 纯分页代码实例”的完整攻略。 理解分页 在了解分页代码实例之前,首先要理解分页是什么。在网站或者应用中,当数据量太大时,我们需要对其进行分页展示,将数据按照页码分组,方便查看和管理。分页展示涉及到页面布局、URL 地址、数据读取等多种技术,需要综合使用。 实现分页代码 使用PagedList.Mvc插件实现分页 PagedList.Mvc…

    C# 2023年5月31日
    00
  • C#实现定时关机小应用

    针对” C#实现定时关机小应用”,我们可以使用System.Diagnostics 命名空间中的Process类来实现。 首先,我们需要一个定时器来控制时间: using System.Windows.Forms; using System.Diagnostics; namespace ShutdownApp { public partial class M…

    C# 2023年6月1日
    00
  • C#实现QQ聊天窗口

    下面是C#实现QQ聊天窗口的完整攻略: 一、设计UI界面 在设计UI时,需要先确定聊天窗口的主要功能,包括显示聊天记录、输入框和发送按钮等,可以使用Windows窗体或WPF界面实现。在此我们以Windows窗体为例进行说明,具体操作步骤如下: 在Visual Studio中创建一个Windows窗体应用程序项目,命名为“QQChat”; 在窗体上添加几个控…

    C# 2023年6月1日
    00
  • C#中using关键字的使用方法示例

    下面我将为您详细讲解“C#中using关键字的使用方法示例”的完整攻略。 1. using关键字的基本语法 在C#中,using关键字通常用于释放对象的资源,以确保程序的高效性和安全性。它的基本语法如下: using (resource) { // 对象资源的使用代码块 } 其中,resource表示需要释放的对象资源。对象资源通常是一些需要手动释放的资源对…

    C# 2023年5月31日
    00
  • C#实现文件与二进制互转并存入数据库

    下面我将为你详细讲解“C#实现文件与二进制互转并存入数据库”的完整攻略。 1. 准备工作 首先,我们需要在C#中引入System.IO和System.Data.SqlClient命名空间,分别用于操作文件和数据库。 using System.IO; using System.Data.SqlClient; 2. 将文件转换为二进制数据 接下来,我们需要将文件…

    C# 2023年5月15日
    00
  • C#实现将DataTable内容输出到Excel表格的方法

    下面是关于“C#实现将DataTable内容输出到Excel表格的方法”的完整攻略。 1.准备工作 在使用C#实现将DataTable内容输出到Excel表格之前,你需要安装一个Excel操作库,常用的有EPPlus和NPOI。 在本攻略中,我们将使用EPPlus作为Excel操作库,您可以通过NuGet包管理器来安装该库。 2.添加引用 安装完成后,我们需…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部