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日

相关文章

  • C# CUR类实现代码

    下面是C# CUR类实现代码的完整攻略,包含以下几个步骤: 一、什么是CUR类? CUR类是一个用来进行和处理HTTP请求的.NET类库,它可以实现URL的编码和解码,支持HTTP请求和响应,可以发送HTTP请求并获取响应。CUR类广泛应用于各种.NET开发中,比如Web应用程序、桌面应用程序等。 二、CUR类的基本用法 1. 创建CUR对象 要使用CUR类…

    C# 2023年5月31日
    00
  • winfrom 打印表格 字符串的封装实现代码 附源码下载

    下面是关于“winform打印表格字符串的封装实现代码附源码下载”的完整攻略: 一、背景介绍 在实际开发中,我们经常会遇到需要打印表格字符串的需求,例如打印报表、流水账单等等。在C#的winforms框架中,可以通过调用PrintDocument类的Print方法来实现打印功能。然而,PrintDocument类并没有提供直接打印表格字符串的方法,因此需要我…

    C# 2023年5月15日
    00
  • C#使用WebSocket与网页实时通信的实现示例

    首先,要使用WebSocket与网页实时通信,需要在C#时编写WebSocket服务端,并在网页中使用JavaScript编写WebSocket客户端。下面是实现该功能的完整攻略: C# WebSocket服务端 创建新项目。在Visual Studio里新建一个Class Library项目。 安装Newtonsoft.Json NuGet包。在项目中右击…

    C# 2023年6月3日
    00
  • C#使用浏览按钮获得文件路径和文件夹路径的方法

    下面是关于C#如何使用浏览按钮获得文件路径和文件夹路径的完整攻略。 获取文件路径 步骤一:添加控件 首先需要在窗体中添加一个按钮控件(可以使用Windows Form Application),并将该按钮控件的Text属性设置为“浏览”。 步骤二:添加事件 接下来需要对该按钮控件添加单击事件,以便在单击按钮时打开文件选择对话框。 private void b…

    C# 2023年6月1日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)…

    C# 2023年5月8日
    00
  • C# Contains(T):确定 ICollection是否包含特定值

    C# Contains(T)方法的完整攻略 简介 Contains(T)是C#的泛型方法,用于判断某个集合是否包含某个指定元素。方法返回值为bool类型,如果集合中包含该元素,则返回true,否则返回false。 方法签名 public static bool Contains<TSource>(this IEnumerable<TSour…

    C# 2023年4月19日
    00
  • C# ListView 点击表头对数据进行排序功能的实现代码

    下面我将详细讲解如何实现“C# ListView 点击表头对数据进行排序功能”的代码。 准备工作 首先,我们需要一个ListView控件,可以手动在设计窗口中添加控件,也可以通过代码动态创建。这里我们使用手动创建的方式,步骤如下: 在Windows窗体中拖入一个ListView控件 在窗体的Load事件中添加以下代码: private void Form1_…

    C# 2023年6月7日
    00
  • .NET6使WebApi获取访问者IP地址

    .NET 6 Web API 获取访问者 IP 地址攻略 在 .NET 6 Web API 中,可以通过一些方法获取访问者的 IP 地址。本攻略将介绍如何使用这些方法来获取访问者的 IP 地址。 步骤 步骤1:创建一个新的 .NET 6 Web API 项目 首先,我们需要创建一个新的 .NET 6 Web API 项目。可以使用以下命令在命令行中创建一个新…

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