golang:我的第一个golang程序

Python自己认为已经学习的差不多了,是时候尝试其他语言了,首选就是golang,跨平台和原生的并发支持吸引到了我。当然,最开始学习golang的时候,一些语法什么和python大相径庭,让我吃屎一样难受,最开始学习python的时候也是吃屎一样难受。就这样学习了几天,直至写出了我的第一个golang程序,才感受到了golang的美好~

goWhatweb

初步想法是用go重写cms识别来替换在线cms识别网站的内核。在线cms识别其实已经很稳定了,但是一些指纹的版本比较老,一些算法的优化还是不到位,所以就期待用go重写一下来解决这些问题。

第一个Golang程序

这个程序只是解决了指纹在导入过程中,转换为golang识别的数据结构,然后通过算法得出最佳的排列方式。流程类似这样:

// 原始cms样式:
    //{
    //    "gowinsoft_jw": [{
    //    "path": "/web/web/web/images/4bt1.jpg",
    //    "option": "md5",
    //    "content": "ef1ee9c8708cde1bd25a90054de85690"
    //}, {
    //    "path": "/web/web/web/images/4_13.jpg",
    //        "option": "md5",
    //        "content": "577c2578f9df10fefe7aa62df1e125ae"
    //}, {
    //    "path": "/images/wtop.gif",
    //        "option": "md5",
    //        "content": "8f054dfdc67125dc96b209d928de0b9d"
    //}],
    //"万博网站管理系统": [{
    //"path": "/system/Images/Login_Bottom.jpg",
    //"option": "md5",
    //"content": "9e88927b8895f2798c2de99e028f6b98"
    //}],
    //"maticsoftsns": [{
    //"path": "/msgbox/images/gb_tip_layer.png",
    //"option": "md5",
    //"content": "c8cb16e8b61bc549ebd339858e66fa5c"
    //}, {
    //"path": "/admin/images/txt_bg2.gif",
    //"option": "md5",
    //"content": "ef572c58513148310268e492fb0276ed"
    //}, {
    //"path": "/admin/js/msgbox/images/loading.gif",
    //"option": "md5",
    //"content": "20ac34e039a3224281a38e9222137815"
    //}],
    //"klemanndesign": [{
    //"path": "/script/lightbox2.4/scriptaculous.js",
    //"option": "md5",
    //"content": "THE SOFTWARE IS PROVIDED \"AS IS\""
    //}, {
    //"path": "/themes/lightbox/closelabel.gif",
    //"option": "md5",
    //"content": "0e5462b0b4f00432eac4b33d5fa31c5a"
    //}],


    // 将指纹按照访问路径排序,并且用访问路径来识别
    //{
    //    "/":{singcms{},singcms{},},
    //    "/robots.txt":{singcms{},singcms{},},
    //}


    // 在生成一个数组,用于排序
    //{
    //    "/":100,
    //    "/robots.txt":99
    //}

    // 筛选出排序优先级,根据优先级的路径来访问地址

源代码如下:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "sort"
)

type singcms struct {
    Path string
    Option string
    Content string
    Name string
}

type Pair struct {
    Path   string
    length int
}

// A slice of Pairs that implements sort.Interface to sort by Value.
type PairList []Pair

func (p PairList) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p PairList) Len() int           { return len(p) }
func (p PairList) Less(i, j int) bool { return p[i].length > p[j].length }

func sortMapByValue(m map[string]int) PairList {
    p := make(PairList, len(m))
    i := 0
    for k, v := range m {
        p[i] = Pair{k, v}
        i++
    }
    sort.Sort(p)
    return p
}


func main() {

    s, err :=ioutil.ReadFile("cms.json")
    if(err != nil){
        panic(err)
    }
    var f map[string][]singcms
    err = json.Unmarshal(s, &f)

    webdata:=make(map[string][]singcms)

    for k,v := range f{
        //_,ok := webdata[k]
        //
        //if(!ok){
        //    webdata[k] = make([]singcms,len(v))
        //}
        //
        for _,data := range v{
            path:=data.Path
            _,ok := webdata[path]
            if(!ok){
                webdata[path] = make([]singcms,0)
            }
            data.Name = k
            webdata[path] = append(webdata[path],data)
        }
    }
    sortdata := make(map[string]int)
    for k,v := range webdata{
        sortdata[k] = len(v)
    }
    fmt.Println(sortMapByValue(sortdata))


}

End

当然这并不是我认为的最好的cms识别方式,之前有篇文章我构想通过“决策树”来识别,我觉得这才是快速识别的关键,但是场景可能不同吧,现在收集到的指纹数量才1800+,实际访问路径大约1600(好像也挺高了。。),总之基于决策树查询的话每个指纹的制作会比较复杂和繁琐…

发表评论

路人甲
看不清楚?点图切换

网友评论(0)