前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VB.NET 网抓技巧分享(有道翻译为例)

VB.NET 网抓技巧分享(有道翻译为例)

作者头像
一线编程
发布2019-10-10 11:08:34
1.4K0
发布2019-10-10 11:08:34
举报
文章被收录于专栏:办公魔盒办公魔盒

网抓重要就是要了解,浏览器以那种方式向服务器请求数据(post或者get常用方式)和向服务器发送了什么请求,这请求包括:头文件,请求类型,请求目标数据等等!本编文章以有道翻译为例!此教程仅做大家学习交流!



请求包数据查找技巧交流:

  1. 打开浏览器(这里用Google Chrome 浏览器,其他浏览器一样),进入有道翻译首页:http://fanyi.youdao.com/
  1. 按F12把开发者工具调出
  1. 把开发者工具持续日志打开,防止浏览器清空上个请求

4.随意输入一个汉字,我们会在网络里面看到,翻译后有三条数据请求,我们一一点开看看;

5.在第一条http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 请求的response里面就看到了我们想要的数据!第二第三条均返回空!

6.找到有用请求后,我们再返回到请求连接里面,会发现他的请求方式是post,和相关请求数据!

7.请求头见图

8.再看一下最重要的请求数据,POSTDATA

8.1 请求数据简单解析,多请求几次我们可以发现只有4个参数会发生变化.这也是我们接下要找的4个重要参数.

  1. i: VB小源码 -------------------------------------------------------请求的文本 from: AUTO---------------------------------------------------------源文本语言 to: AUTO-----------------------------------------------------------翻译后语言 smartresult: dict--------------------------------------------------翻译类型 client: fanyideskweb-----------------------------------------------客户端 salt: 15706248917072-----------------------------------------------重要参数:时间截+随机1位数 sign: 32c763826c2de59850527315e29df0d7-----------------------------重要参数:请求标志 ts: 1570624891707--------------------------------------------------重要参数:时间截 bv: ca3dedaa9d15daa003dbdaaa991540d1-------------------------------重要参数:客户端版本号 doctype: json-----------------------------------------------------数据类型 version: 2.1-------------------------------------------------------版本 keyfrom: fanyi.web------------------------------------------------来自哪里 action: FY_BY_REALTlME--------------------------------------------响应动作

8.2我们先来找sign参数,通过sign参数我们可以很容易发现其他3个参数是跟sign连在一起的!

8.2.1 这些参数要在哪里找呢?我们去在开发者工具里面找到sources选项里面,然后按ctrl+shift+f进行全局查找sign,发现他是在fanyi.min.js里面,我们打开它,然后在ctrl+f 进行查找

8.2.2.很快我们就查找到,sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj") 这一段,然后我们在8336哪里直接打断!

代码语言:javascript
复制
function(e) {
        var t = n.md5(navigator.appVersion)
          , r = "" + (new Date).getTime()
          , i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")
        }

8.2.3.然后我们再输入一个文字进行翻译,很快就跳到断点处,我们就可以,看到相应的变量代表的是什么值!

9. 接下的事情就是相应的参数,解析和解密了


VB.NET 源码部分

这里的MD5加密使用了JSMD5库,VB.NET自带的MD5没加密成功,有人研究成功的请赐教一二!

代码比较简单就直接贴上了,代码有简单的注释!

代码语言:javascript
复制
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Web

Public Class Form1
    ''翻译网址
    Private Const YDURL As String = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Debug.Print(Get_youdaoxx(GET_STR(TextBox1.Text)))
        Dim res As String = PostData(YDURL, Get_youdaoxx(GET_STR(TextBox1.Text)))
        Dim jstr As String = GET_JSONDATA(res)
        TextBox2.Text = jstr
    End Sub

    ''' <summary>
    ''' 解析翻译结果
    ''' </summary>
    ''' <param name="sttr"></param>
    ''' <returns></returns>
    Public Function GET_JSONDATA(ByVal sttr As String) As String
        Try
            Dim js As Object
            js = CreateObject("ScriptControl")
            js.Language = "JScript"
            js.AddCode("var json=" & sttr & ";var jss = eval(json);var al= jss.translateResult[0].length;var strr='';for (var i=0;i<al;i++){ strr=strr+jss.translateResult[0][i].tgt;}")
            js.State = 1
            js.allowui = True
            Return js.eval("strr")
        Catch ex As Exception
            Return "json数据解析失败"
        End Try

    End Function

    ''' <summary>
    ''' 字符串处理
    ''' </summary>
    ''' <param name="ST"></param>
    ''' <returns></returns>
    Function GET_STR(ByVal ST As String) As String
        On Error Resume Next
        Dim TMP As String = ""
        TMP &= Replace(Replace(Replace(ST, vbCrLf, ""), vbCr, ""), vbLf, "")
        Return TMP

    End Function

    ''' <summary>
    ''' 获取post数据
    ''' </summary>
    ''' <param name="str"></param>
    ''' <returns></returns>
    Function Get_youdaoxx(ByVal str As String) As String
        On Error Resume Next
        Dim MD As New JsMd5
        Dim bv As String = MD.md5("5.0 (Windows)")
        Dim ts As String = GetTimeStamp()
        Dim salt As String = GetTimeStamp() & "1"
        Dim sign As String = MD.md5("fanyideskweb" & str & salt & "n%A-rKaT5fb[Gy?;N5@Tj")
        Dim t_str As String = HttpUtility.UrlEncode(str, Encoding.GetEncoding("utf-8")) '.ToUpper
        Return "i=" & t_str & "&from=" & ComboBox1.Text.ToString.Split("|")(1) & "&to=" & ComboBox2.Text.ToString.Split("|")(1) & "&smartresult=dict&client=fanyideskweb&salt=" & salt & "&sign=" & sign & "&ts=" & ts & "&bv=" & bv & "&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME"
    End Function

    ''' <summary>
    ''' 获取时间截
    ''' </summary>
    ''' <param name="bflag"></param>
    ''' <returns></returns>
    Function GetTimeStamp(Optional bflag = False) As String
        On Error Resume Next
        Dim span As TimeSpan = Date.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0)
        Dim ret As String
        If bflag Then
            ret = Convert.ToInt64(span.TotalSeconds).ToString()
        Else
            ret = Convert.ToInt64(span.TotalMilliseconds).ToString()
        End If
        Return ret
    End Function

    ''' <summary>
    ''' POST请求翻译结果
    ''' </summary>
    ''' <param name="url"></param>
    ''' <param name="data"></param>
    ''' <returns></returns>
    Function PostData(ByVal url As String, ByVal data As String) As String
        On Error Resume Next
        Dim request As HttpWebRequest = WebRequest.Create(url)
        request.Method = "POST"
        request.Host = "fanyi.youdao.com"
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
        request.Accept = "application/json, text/javascript, */*; q=0.01"
        request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
        request.Referer = "http://fanyi.youdao.com/"
        request.Headers.Set("Cookie", "td_cookie=3685168649; YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=66319307@10.169.0.84; OUTFOX_SEARCH_USER_ID_NCOO=189249582.97468826; JSESSIONID=aaauLcGg98nVZ4ETKmQ2w; ___rl__test__cookies=" & GetTimeStamp())
        Dim encoding As New UTF8Encoding()
        Dim bys As Byte() = encoding.GetBytes(data)
        request.ContentLength = bys.Length
        Dim newStream As Stream = request.GetRequestStream()
        newStream.Write(bys, 0, bys.Length)
        newStream.Close()
        Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
        Return sr.ReadToEnd
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MaximizeBox = False
    End Sub


End Class

<左右滑动查看完整代码>


相关实例下载

代码语言:javascript
复制
https://www.lanzous.com/i6ok5af

好啦!今天教程到此结束啦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 办公魔盒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档