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#获取所有进程的方法

    关于C#获取所有进程的方法,我们可以通过以下步骤进行实现。 1. 引用命名空间 我们需要在代码中添加System.Diagnostics命名空间,代码如下: using System.Diagnostics; 2. 获取所有进程 我们使用Process类中的静态方法GetProcesses()获取当前运行的所有进程,代码如下: Process[] proce…

    C# 2023年6月6日
    00
  • c#使用listbox的详细方法和常见问题解决

    下面是“c#使用listbox的详细方法和常见问题解决”的完整攻略。 一、基本概念 本攻略中使用的语言是C#,ListBox是Windows Forms中的控件之一,常常用于展示列表信息。ListBox可以通过Add、Remove等方法动态地更新其列表内容,也可以通过SelectedIndex、SelectedItem等属性来获取选择的项。同时,ListBo…

    C# 2023年5月15日
    00
  • ASP.NET MVC3手把手教你构建Web

    “ASP.NET MVC3手把手教你构建Web”是一篇教程,它旨在指导读者使用ASP.NET MVC3框架来构建Web应用程序。本教程详细介绍了使用MVC模式设计Web应用程序的各个方面,包括模型、视图和控制器。 下面是该教程的完整攻略: 介绍 在本教程中,我们将使用ASP.NET MVC3框架来创建一个简单的Web应用程序。在这个过程中,我们将介绍MVC模…

    C# 2023年6月3日
    00
  • ASP.NET Core与NLog集成的完整步骤

    NLog 是一个流行的日志记录框架,可以帮助我们记录应用程序的日志。在 ASP.NET Core 中,可以使用 NLog 来记录日志。以下是 ASP.NET Core 与 NLog 集成的完整步骤: 步骤一:安装 NLog 包 在 ASP.NET Core 中,可以使用 NuGet 包管理器来安装 NLog 包。可以在项目的根目录下的命令行中使用以下命令来安…

    C# 2023年5月17日
    00
  • C#网络编程中常用特性介绍

    C#网络编程中常用特性介绍 在C#网络编程中,有很多常用特性值得去了解和掌握。下面将会介绍几个常用的特性及其用法。 1. Socket Socket是建立网络连接最基础的类之一。它提供了一组通信协议,并在套接字上实现这些协议。以下是一个简单的Socket示例,用于连接服务器、发送数据和接收数据。 using System; using System.Net;…

    C# 2023年6月7日
    00
  • ASP.NET MVC中两个配置文件的作用详解

    当我们使用ASP.NET MVC框架来开发一个网站时,我们需要先了解两个配置文件的作用,这些配置文件可以帮助我们更好地配置和管理应用程序。它们分别是Web.Config和RouteConfig.cs。 Web.Config Web.config文件是一个XML文件,它包含了ASP.NET应用程序的配置信息,包括应用程序的全局设置、数据库连接字符串、应用程序级…

    C# 2023年6月3日
    00
  • IIS7.5中调试.Net 4.0网站出现无厘头、500错误的解决方法

    在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。这可能是由于IIS7.5没有正确配置.Net4.0应用程序池而导致的。本文将提供解决方案,帮助解决这个问题。 问题描述 在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。具体表现为,网站无法正常运行,或者在使用某些功能时崩溃。 解决方案 方法一:配置.N…

    C# 2023年5月15日
    00
  • c#中查询表达式GroupBy的使用方法

    C#中查询表达式GroupBy的使用方法 在C#中,查询表达式(GroupBy)可以用于将序列按照指定的属性分组,使我们可以更方便地对数据进行分析和处理。本篇攻略将带你详细了解C#中查询表达式的使用方法,并提供两个实际应用的示例。 GroupBy的基本使用方法 GroupBy的基本语法如下所示: var groupedData = from item in …

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