草庐IT

go - 在 golang 中发出 post 请求

coder 2023-06-30 原文

我正在尝试使用 golang 自动执行以下操作

  • 生成密码(完成)
  • 向所有设备推送通知(使用 pushbullet 完成)
  • 在 192.168.0.1 更改 wifi 路由器密码(需要完成)

Wifi 路由器页面位于 192.168.0.1 Wifi Router page

这是使用 Fiddler 捕获的原始数据。 (手动更改时)

POST http://192.168.0.1/goform/form2WlanBasicSetup.cgi HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.1/d_wlan_basic.asp
Cookie: curShow=
X-Skyzip-Mode: high
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 233

domain=1&hiddenSSID=0&ssid=Home&band=9&chan=0&chanwid=1&txRate=0&method_cur=0&method=6&authType=2&length=1&format=1&defaultTxKeyId=1&key1=&pskFormat=0&pskValue=3ADI0NSXEAYOI0M&checkWPS2=1&save=Apply&basicrates=496&operrates=4080

和我的golang代码如下

func RouterPass(pass string) {
    routerUrl := "http://192.168.0.1"
    resource := "/goform/form2WlanBasicSetup.cgi"
    data := url.Values{}
    data.Set("domain", "1")
    data.Add("ssid", "Home")
    data.Add("band", "9")
    data.Add("chan", "0")
    data.Add("chanwid", "1")
    data.Add("txRate", "0")
    data.Add("method_cur", "0")
    data.Add("method", "6")
    data.Add("authType", "2")
    data.Add("length", "1")
    data.Add("format", "1")
    data.Add("defaultTxKeyId", "1")
    data.Add("pskFormat", "0")
    data.Add("pskValue", pass)
    data.Add("checkWPS2", "1")
    data.Add("save", "Apply")
    data.Add("basicrates", "496")
    data.Add("operrates", "4080")

    u, _ := url.ParseRequestURI(routerUrl)
    u.Path = resource
    u.RawQuery = data.Encode()
    urlStr := fmt.Sprintf("%v", u) 

    client := &http.Client{}
    r, _ := http.NewRequest("POST", urlStr, nil)
    // r.Header.Add("Authorization", "auth_token=\"XXXXXXX\"")
    r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    r.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))

    resp, _ := client.Do(r)
    fmt.Println(pass)
    fmt.Println(resp.Status)
}

但我无法更改密码。 我做错了什么?

最佳答案

希望这对其他人有帮助。

有效的代码

func ChangePassword(password string) {
    hc := http.Client{}
    routerURL := "http://192.168.0.1/goform/form2WlanBasicSetup.cgi"
    form := url.Values{}
    form.Add("domain", "1")
    form.Add("hiddenSSID", "0")
    form.Add("ssid", "Linux-PC")
    form.Add("band", "9")
    form.Add("chan", "0")
    form.Add("chanwid", "1")
    form.Add("txRate", "0")
    form.Add("method_cur", "0")
    form.Add("method", "6")
    form.Add("authType", "2")
    form.Add("length", "1")
    form.Add("format", "1")
    form.Add("defaultTxKeyId", "1")
    form.Add("key1", "")
    form.Add("pskFormat", "0")
    form.Add("pskValue", password)
    form.Add("checkWPS2", "1")
    form.Add("save", "Apply")
    form.Add("basicrates", "496")
    form.Add("operrates", "4080")
    req, err := http.NewRequest("POST", routerURL, strings.NewReader(form.Encode()))
    if err != nil {
        panic(err)
    }
    req.PostForm = form
    req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0")
    req.Header.Add("Referer", "http://192.168.0.1/d_wlan_basic.asp")
    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

    fmt.Println(form)
    resp, err := hc.Do(req)
    if err != nil {
        panic(err)
    }
    fmt.Println(resp.Status)
    fmt.Println(password)
}

关于go - 在 golang 中发出 post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34623523/

有关go - 在 golang 中发出 post 请求的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  6. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  7. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  8. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  9. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  10. ruby-on-rails - 如何通过 POST 发送多个相同的键/参数? - 2

    如果我必须在一个HTTP请求中发送一堆post参数,所有这些参数都具有相同的名称,我该如何构建要发布的data对象?想象一个带有一些复选框的表单,它们都具有相同的name属性但具有不同的值(如果它们被选中):我想用ruby​​构建它(但它需要根据在表单上选择的内容动态创建):data={"color"=>"red","color"=>"green","color"=>"blue"}然后将数据发送到某个URL:Net::HTTP.post_form(url,data)我无法控制接收端,所以我必须发送它期望接收的参数。怎么办? 最佳答案

随机推荐