303 lines
8.6 KiB
Go
303 lines
8.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"sort"
|
|
|
|
"github.com/AlecAivazis/survey"
|
|
)
|
|
|
|
type Region struct {
|
|
RegionID string `json:"regionID"`
|
|
BasicServiceAreas []ServiceArea `json:"basicServiceAreas"`
|
|
RegionName string `json:"regionName"`
|
|
Active bool `json:"active"`
|
|
}
|
|
|
|
type ServiceArea struct {
|
|
ServiceAreaID string `json:"serviceAreaID"`
|
|
Operational bool `json:"operational"`
|
|
OnboardingEnabled bool `json:"onboardingEnabled"`
|
|
DefaultStationCode string `json:"defaultStationCode"`
|
|
AvailableOMWPrograms []string `json:"availableOMWPrograms"`
|
|
DefaultAccessPointID string `json:"defaultAccessPointId"`
|
|
ProgramTypes []string `json:"programTypes"`
|
|
CountryCode string `json:"countryCode"`
|
|
PickUpLocationAddress struct {
|
|
CountryCode string `json:"countryCode"`
|
|
PostalCode string `json:"postalCode"`
|
|
City string `json:"city"`
|
|
Phone interface{} `json:"phone"`
|
|
State string `json:"state"`
|
|
Address3 interface{} `json:"address3"`
|
|
Address2 interface{} `json:"address2"`
|
|
Address1 string `json:"address1"`
|
|
Name string `json:"name"`
|
|
} `json:"pickUpLocationAddress"`
|
|
OperatingEntity string `json:"operatingEntity"`
|
|
TimeZone string `json:"timeZone"`
|
|
PickUpLocation struct {
|
|
Longitude float64 `json:"longitude"`
|
|
Latitude float64 `json:"latitude"`
|
|
} `json:"pickUpLocation"`
|
|
ServiceAreaName string `json:"serviceAreaName"`
|
|
}
|
|
|
|
type PersonalInfo struct {
|
|
Address string `json:"address"`
|
|
Address2 string `json:"address2"`
|
|
Fname string `json:"firstName"`
|
|
Lname string `json:"lastName"`
|
|
City string `json:"city"`
|
|
State string `json:"state"`
|
|
Zip string `json:"postalCode"`
|
|
Phone string `json:"phoneNumber"`
|
|
County string `json:"county"`
|
|
Country string `json:"countryCode"`
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println("First we need to log into our account before we can continue")
|
|
loginq := []*survey.Question{
|
|
{
|
|
Name: "email",
|
|
Prompt: &survey.Input{Message: "Email:"},
|
|
},
|
|
{
|
|
Name: "password",
|
|
Prompt: &survey.Password{Message: "Password:"},
|
|
},
|
|
}
|
|
logina := struct {
|
|
Email string
|
|
Password string
|
|
}{}
|
|
survey.Ask(loginq, &logina)
|
|
api_file, err := os.Open("amazon-api.json")
|
|
defer api_file.Close()
|
|
if err != nil {
|
|
fmt.Println("Required files are missing, are you sure you have permission to run this?")
|
|
return
|
|
}
|
|
json.NewDecoder(api_file).Decode(&api)
|
|
api.Payload.AuthData.User.UserId = logina.Email
|
|
api.Payload.AuthData.User.Password = logina.Password
|
|
login()
|
|
log_cookies()
|
|
choicea := ""
|
|
choiceq := &survey.Select{
|
|
Message: "Choose an option:",
|
|
Options: []string{"Region/Warehouse", "Personal Info"},
|
|
}
|
|
survey.AskOne(choiceq, &choicea, nil)
|
|
switch choicea {
|
|
case "Region/Warehouse":
|
|
location()
|
|
case "Personal Info":
|
|
personal()
|
|
}
|
|
}
|
|
|
|
func location() {
|
|
var regions []Region
|
|
resp, err := http.Get("https://logistics.amazon.com/flex/api/getOperationalRegions")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
json.NewDecoder(resp.Body).Decode(®ions)
|
|
var region_list []string
|
|
for _, reg := range regions {
|
|
region_list = append(region_list, reg.RegionName)
|
|
}
|
|
sort.Strings(region_list)
|
|
rega := ""
|
|
regq := &survey.Select{
|
|
Message: "Choose Region:",
|
|
Options: region_list,
|
|
}
|
|
survey.AskOne(regq, ®a, nil)
|
|
var services []ServiceArea
|
|
var regionid string
|
|
for _, reg := range regions {
|
|
if reg.RegionName == rega {
|
|
regionid = reg.RegionID
|
|
services = reg.BasicServiceAreas
|
|
break
|
|
}
|
|
}
|
|
var wh_list []string
|
|
for _, wh := range services {
|
|
for _, prog := range wh.AvailableOMWPrograms {
|
|
if prog == "CSP" {
|
|
wh_list = append(wh_list, wh.ServiceAreaName)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
sort.Strings(wh_list)
|
|
wha := ""
|
|
whq := &survey.Select{
|
|
Message: "Choose Warehouse:",
|
|
Options: wh_list,
|
|
}
|
|
survey.AskOne(whq, &wha, nil)
|
|
var serviceareaid string
|
|
for _, wh := range services {
|
|
if wh.ServiceAreaName == wha {
|
|
serviceareaid = wh.ServiceAreaID
|
|
break
|
|
}
|
|
}
|
|
fmt.Printf("Region: %s\nWarehouse: %s\n", regionid, serviceareaid)
|
|
reg_body := struct {
|
|
Region string `json:"regionId"`
|
|
}{regionid}
|
|
b := new(bytes.Buffer)
|
|
json.NewEncoder(b).Encode(reg_body)
|
|
reg_req, _ := http.NewRequest("POST", "https://logistics.amazon.com/onboarding/data/update-region", b)
|
|
reg_req.Header.Add("User-Agent", api.Headers.Refresh)
|
|
reg_req.Header.Add("X-Requested-With", "com.amazon.rabbit")
|
|
reg_req.Header.Add("Content-Type", "application/json;charset=UTF-8")
|
|
for _, one := range logistics.Response.Tokens.Cookies.AmazonCom {
|
|
reg_req.Header.Add("Cookie", fmt.Sprintf("%s=%s", one.Name, one.Value))
|
|
}
|
|
client := &http.Client{}
|
|
reg_resp, _ := client.Do(reg_req)
|
|
defer reg_resp.Body.Close()
|
|
var body struct {
|
|
Success bool `json:"success"`
|
|
DirectTo string `json:"directTo"`
|
|
Error string `json:"errorReasonCode"`
|
|
Data string `json:"data"`
|
|
}
|
|
json.NewDecoder(reg_resp.Body).Decode(&body)
|
|
if body.Success {
|
|
fmt.Println("Region Successfully Changed")
|
|
} else {
|
|
fmt.Println("Region Change Failed", reg_resp.StatusCode, body.Error)
|
|
}
|
|
FlexHead.Setup()
|
|
wh_body := struct {
|
|
Type string `json:"__type"`
|
|
Service []string `json:"serviceAreaIds"`
|
|
}{"SetEligibleServiceAreasInput:http://internal.amazon.com/coral/com.amazon.omwbuseyservice/", []string{serviceareaid}}
|
|
wh_b := new(bytes.Buffer)
|
|
json.NewEncoder(wh_b).Encode(wh_body)
|
|
wh_req, _ := http.NewRequest("POST", "https://flex-capacity-na.amazon.com/eligibleServiceAreas", wh_b)
|
|
wh_req.Header = FlexHead.Auth(wh_req.Method, wh_req.URL.Path, wh_req.Host)
|
|
wh_resp, _ := client.Do(wh_req)
|
|
defer wh_resp.Body.Close()
|
|
if wh_resp.StatusCode == 200 {
|
|
fmt.Println("Warehouse Successfully Changed")
|
|
} else {
|
|
fmt.Println("Warehouse Change Failed")
|
|
}
|
|
io.Copy(ioutil.Discard, wh_resp.Body)
|
|
}
|
|
|
|
func personal() {
|
|
fmt.Println("Changing User Info May Trigger a Tax Info Update")
|
|
var body_response struct {
|
|
Success bool `json:"success"`
|
|
DirectTo string `json:"directTo"`
|
|
Error string `json:"errorReasonCode"`
|
|
Data PersonalInfo `json:"data"`
|
|
}
|
|
get_req, _ := http.NewRequest("GET", "https://logistics.amazon.com/onboarding/account/data/get-personal-info", nil)
|
|
get_req.Header.Add("User-Agent", api.Headers.Refresh)
|
|
get_req.Header.Add("X-Requested-With", "com.amazon.rabbit")
|
|
get_req.Header.Add("Content-Type", "application/json;charset=UTF-8")
|
|
for _, one := range logistics.Response.Tokens.Cookies.AmazonCom {
|
|
get_req.Header.Add("Cookie", fmt.Sprintf("%s=%s", one.Name, one.Value))
|
|
}
|
|
client := &http.Client{}
|
|
get_resp, _ := client.Do(get_req)
|
|
defer get_resp.Body.Close()
|
|
json.NewDecoder(get_resp.Body).Decode(&body_response)
|
|
infoq := []*survey.Question{
|
|
{
|
|
Name: "fname",
|
|
Prompt: &survey.Input{Message: "First Name:",
|
|
Default: body_response.Data.Fname,
|
|
},
|
|
},
|
|
{
|
|
Name: "lname",
|
|
Prompt: &survey.Input{Message: "Last Name:",
|
|
Default: body_response.Data.Lname,
|
|
},
|
|
},
|
|
{
|
|
Name: "address",
|
|
Prompt: &survey.Input{Message: "Address:",
|
|
Default: body_response.Data.Address,
|
|
},
|
|
},
|
|
{
|
|
Name: "address2",
|
|
Prompt: &survey.Input{Message: "Address2:",
|
|
Default: body_response.Data.Address2,
|
|
},
|
|
},
|
|
{
|
|
Name: "city",
|
|
Prompt: &survey.Input{Message: "City:",
|
|
Default: body_response.Data.City,
|
|
},
|
|
},
|
|
{
|
|
Name: "state",
|
|
Prompt: &survey.Input{Message: "State:",
|
|
Default: body_response.Data.State,
|
|
},
|
|
},
|
|
{
|
|
Name: "zip",
|
|
Prompt: &survey.Input{Message: "Zip:",
|
|
Default: body_response.Data.Zip,
|
|
},
|
|
},
|
|
{
|
|
Name: "county",
|
|
Prompt: &survey.Input{Message: "County:",
|
|
Default: body_response.Data.County,
|
|
},
|
|
},
|
|
{
|
|
Name: "country",
|
|
Prompt: &survey.Input{Message: "Country:",
|
|
Default: body_response.Data.Country,
|
|
},
|
|
},
|
|
{
|
|
Name: "phone",
|
|
Prompt: &survey.Input{Message: "Phone Number:",
|
|
Default: body_response.Data.Phone,
|
|
},
|
|
},
|
|
}
|
|
var infoa PersonalInfo
|
|
survey.Ask(infoq, &infoa)
|
|
b := new(bytes.Buffer)
|
|
json.NewEncoder(b).Encode(infoa)
|
|
set_req, _ := http.NewRequest("POST", "https://logistics.amazon.com/onboarding/account/data/submit-personal-info", b)
|
|
set_req.Header.Add("User-Agent", api.Headers.Refresh)
|
|
set_req.Header.Add("X-Requested-With", "com.amazon.rabbit")
|
|
set_req.Header.Add("Content-Type", "application/json;charset=UTF-8")
|
|
for _, one := range logistics.Response.Tokens.Cookies.AmazonCom {
|
|
set_req.Header.Add("Cookie", fmt.Sprintf("%s=%s", one.Name, one.Value))
|
|
}
|
|
set_resp, _ := client.Do(set_req)
|
|
defer set_resp.Body.Close()
|
|
json.NewDecoder(set_resp.Body).Decode(&body_response)
|
|
if body_response.Success {
|
|
fmt.Println("Info Successfully Updated")
|
|
}
|
|
}
|