-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcloudvis.go
More file actions
98 lines (98 loc) · 2.58 KB
/
cloudvis.go
File metadata and controls
98 lines (98 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import "time"
import "fmt"
import "net/http"
import "encoding/json"
import "mime/multipart"
import "io/ioutil"
import "os"
import "log"
import "flag"
import "bytes"
var ApiUrl string = "https://visionbot.ru/apiv2"
func multipartuploadreq(url string, params map[string]string, filedata []byte) *http.Request {
rbody := new(bytes.Buffer)
writer := multipart.NewWriter(rbody)
filepart,_ := writer.CreateFormFile("file", "img")
filepart.Write(filedata)
for parname,parval := range params {
writer.WriteField(parname, parval)
}
err := writer.Close()
if err != nil {
log.Fatal(err)
}
req,_ := http.NewRequest("POST", "https://visionbot.ru/apiv2/in.php", rbody)
req.Header.Set("Content-Type", writer.FormDataContentType())
return req
}
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [opts] [file] \n file is a image file name. png and jpg are officially supported. \n Opts can be one of:\n", os.Args[0])
flag.PrintDefaults()
}
usestdin := flag.Bool("stdin", false, "get image data from stdin, filename will be ignored")
lang := flag.String("l", "en", "set `language` name to use. language is formed as two letter code, like ru or en, default is en.")
target := flag.String("t", "all", "data `type` to recognize. can be 'text', 'image' or 'all'.")
flag.Parse()
var file *os.File
var err error
if *usestdin {
file = os.Stdin
} else {
file,err = os.Open(flag.Arg(0))
}
if err != nil {
log.Fatal(err)
}
filedata,err := ioutil.ReadAll(file)
if err != nil {
log.Fatal(err)
}
file.Close()
params := map[string]string{"lang": *lang, "target": *target}
req := multipartuploadreq(ApiUrl + "/in.php", params, filedata)
os.Stderr.WriteString("uploading image\n")
resp,err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
bodydata,err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
resp.Body.Close()
var bodyresult map[string]string
err = json.Unmarshal(bodydata, &bodyresult)
if err != nil {
log.Fatal(err)
}
if bodyresult["status"] != "ok" {
log.Fatal(fmt.Errorf("server error"))
}
id := bodyresult["id"]
os.Stderr.WriteString("waiting for result\n")
for {
time.Sleep(500 * time.Millisecond)
gresp,err := http.Get(ApiUrl + "/res.php?id=" + id)
if err != nil {
log.Fatal(err)
}
bodydata,err = ioutil.ReadAll(gresp.Body)
if err != nil {
log.Fatal(err)
}
bodyresult = nil
err = json.Unmarshal(bodydata, &bodyresult)
if err != nil {
log.Fatal(err)
}
if bodyresult["status"] == "error" {
log.Fatal(fmt.Errorf("server error"))
}
if bodyresult["status"] == "ok" {
fmt.Println(bodyresult["text"])
break
}
}
}