pixiv-scrapper/pixiv/new.go

72 lines
1.5 KiB
Go

package pixiv
import (
"fmt"
"log"
"net/http"
"os"
"h12.io/socks"
)
//Pixiv is API
type Pixiv struct {
phpsessid http.Cookie
Ua string
client *http.Client
RetryCount int
ItemsPerRequest int
WorkDirectory string
logChannel chan string
DownloadChannel chan Illust
}
//New returns object with methods to access API functions
func New(cookies string, logFilePath string, threads int) (p Pixiv) {
p.phpsessid = http.Cookie{Name: "PHPSESSID", Value: cookies}
p.Ua = "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0"
p.client = &http.Client{}
p.RetryCount = 5
p.ItemsPerRequest = 100
p.WorkDirectory = fmt.Sprintf("%s/Pictures/pixiv", os.Getenv("HOME"))
if len(logFilePath) > 0 {
logfile, err := os.OpenFile(logFilePath, os.O_APPEND, 664)
if err != nil {
log.Fatal(err.Error())
}
p.logChannel = make(chan string)
go p.logger(logfile)
} else {
p.logChannel = make(chan string)
go p.logger(os.Stdout)
}
p.DownloadChannel = make(chan Illust)
for i := 0; i < threads; i++ {
go p.downloadWorker()
}
return
}
//Close .
func (p *Pixiv) Close() {
close(p.logChannel)
close(p.DownloadChannel)
}
func (p *Pixiv) logger(logfile *os.File) {
for entry := range p.logChannel {
logfile.WriteString(entry)
}
log.Println("Closing log file")
logfile.Close()
}
//SetProxy sets SOCKS proxy for all requests
func (p *Pixiv) SetProxy(proxy string) (err error) {
dialSocksProxy := socks.Dial(proxy)
tr := &http.Transport{Dial: dialSocksProxy}
p.client.Transport = tr
return
}