package main
import (
"fmt"
"net"
"net/http"
"github.com/gorilla/mux"
)
// структура для хранения коротких ссылок вида http://yourdomain.com/Kd3xdD3
type ShortLink struct {
// содержит сокращённый(handele) Kd3xdD3 из ссылки http://yourdomain.com/Kd3xdD3
Handle string
// URL, куда нужно перенаправить
URL string
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/{shortLinkHandle:[a-zA-Z0-9]+}", RedirectByIPHandler)
http.ListenAndServe(":8888", router)
}
func RedirectByIPHandler(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
// отвечаем сообщением об ошибке
return
}
// получаете запись ссылки из базы
shortLink, err := repo.GetShortLinkByHandle(params[`shortLinkHandle`])
if err != nil {
// отвечаем сообщением об ошибке или что страница не найдена
return
}
if ip == `IP который вам нужен` {
// удаляем ссылку из базы т.к. она уже не нужна
// или делаем отметку, что она уже использована
err = repo.DeleteLinkByID(shortLink)
// перенаправляем куда нужно
http.Redirect(w, r, shortLink.URL, http.StatusFound)
return
}
// отвечаем, что страница не найдена или то, что вам нужно
http.NotFound(w, r)
}
type Person struct {
ID uint64
Name string
Age uint8
}
var results []Person
db.Select(&results, `SELECT id, name, age FROM persons`)
// тут ответить уже то, что нужно.
// у вас тут будет заполненный results
// почему так сделать нельзя?
Нужно держать очень много одновременных соединений.
Есть вы не знаете с каких сетей сканирует инстаграм - можете этот список со временем собрать самостоятельно, смотрите с каких IP к вам идут запросы и проверяйте IP по whois, там будет указано за кем IP закреплён и какой диапазон IP у этой подсети. Дальше смотрите с каких IP были запросы после которых забанили, эти IP (смотрите ip range по whois) тоже заносите в список.
Само собой часть IP вы не будете знать таким способом, например Google сканирует и с официальных IP и со скрытых, но с этого уже можно начать.