To start working with Shodan you have to get your token first. You can do this at https://www.shodan.io.
Download the package:
go get "gopkg.in/ns3777k/go-shodan.v3"
That's it. You're ready to roll :-) v3 is the latest release and thus has some breaking changing (take a look at changelog).
Older releases can be found under v1 and v2 tags.
master
-branch is considered to be unstable.
Simple example of resolving hostnames:
package main
import (
"log"
"context"
"gopkg.in/ns3777k/go-shodan.v3/shodan"
)
func main() {
client := shodan.NewEnvClient(nil)
dns, err := client.GetDNSResolve(context.Background(), []string{"google.com", "ya.ru"})
if err != nil {
log.Panic(err)
} else {
log.Println(dns["google.com"])
}
}
Output for above:
2015/09/05 18:50:52 173.194.115.35
Streaming example:
package main
import (
"log"
"context"
"gopkg.in/ns3777k/go-shodan.v3/shodan"
)
func main() {
client := shodan.NewEnvClient(nil)
ch := make(chan *shodan.HostData)
err := client.GetBannersByASN(context.Background(), []string{"3303", "32475"}, ch)
if err != nil {
panic(err)
}
for {
banner, ok := <-ch
if !ok {
log.Println("channel was closed")
break
}
log.Println(banner.Product)
}
}
Every method accepts context in the first argument so you can easily cancel any request.
You can also use SetDebug(true)
to see the curl version of your requests.
- /shodan/host/{ip}
- /shodan/host/count
- /shodan/host/search
- /shodan/host/search/tokens
- /shodan/ports
- /shodan/protocols
- /shodan/scan
- /shodan/scan/internet
- /shodan/scan/{id}
- /shodan/alert
- /shodan/alert/{id}/info
- /shodan/alert/{id}
- /shodan/alert/info
- /shodan/query
- /shodan/query/search
- /shodan/query/tags
- /account/profile
- /dns/resolve
- /dns/reverse
- /shodan/data
- /shodan/data/{dataset}
- /org
- /org/member/{user}
- /tools/httpheaders
- /tools/myip
- /api-info
- /labs/honeyscore/{ip}
- /shodan/banners
- /shodan/asn/{asn}
- /shodan/countries/{countries}
- /shodan/ports/{ports}
- /shodan/alert
- /shodan/alert/{id}
If a method is absent or something doesn't work properly don't hesitate to create an issue.