golang爬取有道翻译 | 青训营笔记

184 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

基本功能

  1. 抓包,在有道翻译下右键->检查->"Network",多次输入翻译找到对应请求报文中变化的部分

image-20220508164554707.png 2. 复制请求报文的curl命令,到进行curl转换生成相应的代码,将代码复制下来

image-20220508164908590.png

  1. 使用生成的代码程序发送报文获取json格式响应报文 image-20220508165629789.png

  2. 最终到报文生成的js代码段,可知lts为时间戳,slat是在时间戳上加上一个10以内的随机数,sign为根据下列字符串进行MD5加密生成的数据

image-20220508165851613.png

  1. 修改请求报文中ltsslatsign的生成代码

    lts := strconv.FormatInt(time.Now().Unix()*1000, 10) //时间
    salt := lts + strconv.FormatInt((int64(rand.Intn(10))+1)%10, 10)
    tempstr := "fanyideskweb" + os.Args[1] + salt + "Ygy_4c=r#e#4EX^NUGUc5"
    m := md5.New()
    m.Write([]byte(tempstr))
    sign := hex.EncodeToString(m.Sum(nil))
    
  2. 修改原请求报文代码中的报文内容即可

拓展功能

  • 利用flag包选择搜索引擎

    flag.string函数创建了一个新的string变量。

    它有三个参数:

    1. 标识符的名字(”s“)
    2. 变量的默认值("youdao")
    3. 当用户提供非法标识、非法参数抑或-h-help参数输出信息时输出的信息
    var dict_soft = flag.String("s", "youdao", `"set the dictionary software (like "caiyunai", "youdao")"`)
    

    使用效果如下:

image-20220508171545569.png

  • 并行处理两个搜索引擎增加翻译效率,并行处理翻译的要求需要两个变量,为了防止两个翻译引擎对一个变量的多次翻译,使用共享变量+锁机制来进行同步操作,同步操作只针对共享变量,在除去共享变量区域的报文请求过程中不持有共享变量的锁,达到并行的效果。

image-20220508172220569.png

可优化的地方

  • go语言了解不够深入,对go语言的反射机制不够了解,本来想通过反射机制创建请求报文,降低程序的耦合性