【问题标题】:Shell: Connecting to a website and accessing a fieldShell:连接到网站并访问字段
【发布时间】:2012-09-12 10:08:09
【问题描述】:

我想编写一个脚本,它接受一个文本参数,打开一个到特定网站的连接,并使用字段的 ID 将 arg 输入到文本字段中。这可能吗?我该怎么做?我是个彻头彻尾的菜鸟

编辑:

具体流程:

- start script with string
- input string into text field on web page
- click form button
- wait for processing
- click hyperlink

【问题讨论】:

  • 你想对结果做什么?
  • 触发同一站点上的两个按钮,下载已处理的文件
  • 所以您需要多个步骤(即一个页面不止一次提交)?
  • 查看编辑 :) 更具体一点
  • 开始阅读“curl”程序的文档并查看一些示例

标签: bash shell scripting


【解决方案1】:

为了让您开始,这是我从当地食堂订购今天午餐的脚本:

URL="https://lunch.com/lunch/cgi-bin/order.cgi"

O="order=Order"
A="amount_%d=%%d&amount_foil_container_%d=%%d"

function order_lunch() {
  if [[ -n "$@" ]]; then
    curl -u "$USER":"$PASSWORD" \
         -d $(printf $(printf "$O&$A&$A&$A&$A" 0 0 1 1 2 2 3 3) \
                     "${@:2:8}") \
         "$URL";
  else
    echo "Nothing to order.";
  fi;
}

输入是以下格式的字符串

2012-08-23 1 0 0 0 0 0 0 0

每个字段表示不同的菜肴,即日期后第一个位置的 1 是“1 个意大利面”

祝你好运。

【讨论】:

    【解决方案2】:

    ...“打开与特定网站的连接并使用字段 ID 将 arg 输入到文本字段中”...

    您的意思是您要填写并发送 HTML <form> ... </form>,对吗?

    我会使用 curl (http://curl.haxx.se/)。使用 curl 您可以非常轻松地自动执行 HTTP POST 请求,假设您的网站具有以下形式(摘自:http://curl.haxx.se/docs/httpscripting.html):

    <form method="POST" action="junk.cgi">
          <input type=text name="birthyear">
          <input type=submit name=press value=" OK ">
    </form>
    

    此命令将填写并发送表单(假设该表单在 http://www.example.com/when.cgi 上可用):

    curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when.cgi
    

    【讨论】:

    • 这已经接近完美了,但是表单提交后怎么点击超链接呢?
    • 从响应中解析链接 & curl &lt;link&gt;
    【解决方案3】:

    如果您确切知道需要填写哪个字段,则可以使用lynx 来完成。假设您使用脚本作为输入参数获得字符串 S。然后您创建一个命令脚本,它将引导lynx 完成其行为。

    例如,假设S=foo,您的字段是网页中的第二个字段。之后,还有两个字段,然后是提交按钮。之后,您等待页面加载并单击超链接(然后退出)。网页是 www.something.com。

    命令脚本将在文件 bar.txt 中:

    key <tab> //get to first field
    key <tab> //get to second field
    key f     //input f
    key o     //input o
    key o     //input o
    key <tab> //get to third field
    key <tab> //get to fourth field
    key <tab> //get to sumbit button
    key ^J    //click submit and wait for load
    key <tab> //get to hyperlink
    key ^J    //click hyperlink and wait for load
    key Q     //exit
    key y     //confirm exit
    

    然后主命令将是lynx www.something.com -accept_all_cookies -cmd_script=bar.txt

    现在您需要做的就是动态创建输入字符串。

    #!/bin/bash
    script=bar.txt
    input=$1
    webpage=www.something.com
    len=${#input}
    echo 'key <tab>' > $script
    echo 'key <tab>' >> $script
    for i in `echo $input|fold -w1` 
    do
        echo 'key '$i >> $script
    done
    echo 'key <tab>' >> $script
    echo 'key <tab>' >> $script
    echo 'key <tab>' >> $script
    echo 'key ^J' >> $script
    echo 'key <tab>' >> $script
    echo 'key ^J' >> $script
    echo 'key Q' >> $script
    echo 'key y' >> $script
    
    lnyx $webpage -accept_all_cookies -cmd_script=bar.txt
    

    现在您需要做的就是保存脚本,将其修改为可执行并命名为./script your_string

    【讨论】:

    • 这很棒。在过去的一个小时里,我一直在玩 lynx,试图让它全部工作,但似乎不支持 javascript,并且需要它来运行该进程
    • Lynx 不支持 javascript。您必须在 bash 中完成所有操作吗?否则你也可以试试 Selenium。
    【解决方案4】:

    认为您需要先掌握表单,然后再尝试此操作。

    意味着您可以在本地复制包含表单所有值的 thml 文件,表单操作可以是结束 url 步骤 3 和 4,还可以查看自动提交 java 脚本

    提交表单后的最终超链接 - 如果最后一步通过解析帖子的结果然后使用 curl 或 wget 或其他可以充当点击的东西

    E2A bash 脚本的问题是我上面创建表单的概念是废话,因为然后执行 java 脚本命令行浏览器或链接/lynx/wget/curl 等将是一个挑战。

    第一个问题是表单是否支持获取和发布 - 如果表单操作只能发布,那么您将无法将表单字段作为变量发送,即

    http://destinatio-form-url.com/acceptform.cgi?user=something&address=something_else

    上面的示例是如果支持 get 时如何生成表单值,但如果您需要发布,则需要生成表单,并将表单操作设置为发布以获取该 url,就像我说的那样,您需要创建表单。

    如果假设您可以通过上述格式发送它,那么要注意的是可点击链接中的响应是否在另一个点击之外 - 您可以看到问题,如果它返回到提交给的同一页面上- 通过 grepping 查找特定内容并 grepping/awking 来解析 html 非常容易,直到您获得确切的 url 并触发,

    在这里看看我的回答

    bash script to login to webpage

    这就是您在 java 中进行身份验证的方式,获取一个 cookie,然后作为登录用户进行,这就是您发布表单所需要的一切

    我要说的是在 bash 中是可能的,但是对于 url 处理可能会用更好的语言来完成,它为您提供所有库来执行此操作并使其优雅而不是调用各种系统命令

    给出的例子是用 Java 编写的,但可以是任何语言,perl、php、python 等等,它们都应该有用于此任务的库,因为 Perl 在 google 中查找 LWP html 和许多特定的库,如 LWP HTML您可以使用的解析器等

    一切顺利

    如果有帮助,我认为链接支持 java 脚本..

    它就像 lynx,但有更多的插件

        apt-cache search links|grep browser
    amule-gnome-support - ed2k links handling support for GNOME web browsers
    elinks - advanced text-mode WWW browser
    elinks-data - advanced text-mode WWW browser - data files
    elinks-doc - advanced text-mode WWW browser - documentation
    elinks-lite - advanced text-mode WWW browser - lightweight version
    libhtmlunit-core-js-java - GUI-Less browser for Java programs - JavaScript engine
    libhtmlunit-java - GUI-Less browser for Java programs
    libjenkins-htmlunit-java - Jenkins branch of HtmlUnit browser testing for web apps
    libphp-snoopy - Snoopy is a PHP class that simulates a web browser
    links - Web browser running in text mode
    links2 - Web browser running in both graphics and text mode
    man2html - browse man pages in your web browser
    surf - simple web browser
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多