我想编写一个脚本,它接受一个文本参数,打开与特定网站的连接,并使用字段的 ID 将 arg 输入到文本字段中。这可能吗?我该怎么做?我是个彻头彻尾的菜鸟
编辑:
确切的流程:
- start script with string
- input string into text field on web page
- click form button
- wait for processing
- click hyperlink
如果您确切知道需要填写哪个字段,则可以使用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
为了让您开始,这是我从当地食堂订购今天午餐的脚本:
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 Pasta”
祝你好运。
...“打开到特定网站的连接并使用字段的 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
认为您需要先掌握表格,然后再尝试此操作。
这意味着您可以在本地复制包含表单的所有值的 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,
看看我的回答here
这就是你在java中进行身份验证获取cookie然后作为登录用户进行的方式,这就是你发布表单所需要的一切
我要说的是在 bash 中是可能的,但是对于 url 处理可能会用一种更好的语言来完成,它为您提供所有库来执行此操作并使其优雅而不是调用各种系统命令
给出的示例是用 Java 编写的,但可以是任何语言,perl、php、python 等,它们都应该有用于此任务的库,因为 Perl 在 google 中查找 LWP html 以及许多特定的库,如 LWP HTML Parser 等你可以使用
总之一切顺利
如果有帮助,我认为链接支持 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