首页 > 运营 > 建站经验 > 正文

使用C#访问百度指数:分析请求/响应数据(1)

2020-10-03 17:16:14
字体:
来源:转载
供稿:网友


有网友问如何使用C#程序访问百度指数(网站的站长对这个指标一定不陌生)。如下图,显示了CSDN的用户关注度和媒体关注度。但很可惜的是,用户只能通过浏览的方式得到某天的指数,如果想批量检查多个关键词的百度指数,就很麻烦了。而且如果想得到具体每天的数值也不是那么容易。

 

正好自己也有需要,所以研究了下,写了个简单的Demo实现此功能,欢迎各位朋友指正。

由于百度指数是以Flash的形式在客户端展现出来的,不方便直接取到,开始我以为要用C#程序和Flash客户端交互。但按常理,我们需要分析发送客户度请求是发送到服务器的数据和返回的响应结果(其实基本所有的外挂都是这样做的)。

我使用的抓包工具是HTTP Analyzer,通过查看Post Data,可以看到客户端是发送了一个Post请求到http://index.baidu.com/gateway.php

 

发送的数据是一个AMF Message

 

那么我们需要研究下我们如何能让我们的程序发送出相同的请求。

再此之前我们需要了解下AMF的概念,AMF是Adobe公司开发的数据交互和远程过程调用的协议,全称为Action Message Format,很类似于WebService。但WebService传递的是XML文本数据,而AMF使用Http传输的是二进制数据。

AMF中主要使用的数据类型如下:

+ expand sourceview plaincopy to clipboardprint?
public enum DataType  
{  
    Number = 0,  
    Boolean = 1,  
    String = 2,  
    UntypedObject = 3,  
    MovieClip = 4,  
    Null = 5,  
    Undefined = 6,  
    ReferencedObject = 7,  
    MixedArray = 8,  
    End = 9,  
    Array = 10,//0x0A     
    Date = 11,//0x0B     
    LongString = 12,//0x0C     
    TypeAsObject = 13,//0x0D     
    Recordset = 14,//0x0E     
    Xml = 15,//0x0F     
    TypedObject = 16,//0x10     
    AMF3data = 17//0x11     

    public enum DataType
    {
        Number = 0,
        Boolean = 1,
        String = 2,
        UntypedObject = 3,
        MovieClip = 4,
        Null = 5,
        Undefined = 6,
        ReferencedObject = 7,
        MixedArray = 8,
        End = 9,
        Array = 10,//0x0A  
        Date = 11,//0x0B  
        LongString = 12,//0x0C  
        TypeAsObject = 13,//0x0D  
        Recordset = 14,//0x0E  
        Xml = 15,//0x0F  
        TypedObject = 16,//0x10  
        AMF3data = 17//0x11  
    }

我们看下向服务器发送的AMF Message信息,HEX显示如下


这些二进制数据的分析如下
0003 说明使用的AMF版本,目前AMF有两个版本,0000 表示 AMF0,0003表示AMF3
0000 表示AMF Header的数量0
0001 表示AMF Body的数量1
0017 表示调用的方法的长度占23个字节(17的16进制就是23)
接下来
4461 7461 4163 6365 7373 6f72 2e67 6574 496e 6465 7865 73
这23个字节表示调用服务器端的方法是DataAccessor.getIndexes(44的16进制就是68,也就是D,后面不再做类似解释)
接下来的 00 022f 31 表示target作为标识实现请求和响应的联系,一般是自增整数。00表示数据类型为Number,02表示长度为两个字节,2f 31其实就是/1

00 0000 2d Body的长度为Number类型,长度为45

0a 0000 0003 0a表示数组类型(类似于C#中的Dictionary,键值对,键总是string类型),长度为3

数组的第一部分
0200 0ce5 a881 e8bf 85e6 9599 e882 b2 02表示字符串类型,0c表示此字符串长度为12,后面的e5 a881 e8bf 85e6 9599 e882 b2
表示传递的数据,可以用下段代码查看

+ expand sourceview plaincopy to clipboardprint?
byte[] buffer = new byte[] { 0xe5, 0xa8, 0x81, 0xe8, 0xbf, 0x85, 0xe6, 0x95, 0x99, 0xe8, 0x82, 0xb2 };  
string str = System.Text.Encoding.UTF8.GetString(buffer);  
Console.Write(str); //广告 
byte[] buffer = new byte[] { 0xe5, 0xa8, 0x81, 0xe8, 0xbf, 0x85, 0xe6, 0x95, 0x99, 0xe8, 0x82, 0xb2 };
string str = System.Text.Encoding.UTF8.GetString(buffer);
Console.Write(str); //广告

数组的第二部分
02 0001 30 字符串0,不知道有什么意义

数组的第三部分
02 0012 3230 3130 2d36 2d31 7c32 3031 302d 362d 3131
长度为18的字符串,内容为2010-6-1|2010-6-11

至此,请求的数据我们已经分析完毕,再简单说下返回的数据(Response Content)


返回的AMF Message当然也包括Header和Body(数组类型)
Body的Target为/1/onResult
Body的Content包括
key String类型 就是我们传进去的关键词
area Number类型 0
areaName String类型 可以用上面的代码看到内容,就是全国
userIndexes String类型 这里都是百度指数(用户关注度),用逗号分隔开
mediaIndexes String类型 这里都是媒体指数(媒体关注度),用逗号分隔开(由于图中userIndexes 占位较多,所以未显示出来,在userIndexes数据下方)

如果想得到最后一天的百度指数,只要找到mediaIndexes前面最后一个逗号后跟的数字即可(当然要排除mediaIndexes本身数据类型及长度的占位字节)
 
 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表