所以我试图修改一些HTML,以便有一个启动python脚本的按钮,该脚本作用于自己系统中的几个文件。
更具体地说,我有一个python脚本,它通过snort日志读取并生成一个指向新网站的链接(实际上,这是一个获取数据包捕获流搜索参数的IP地址) 我正在尝试将此脚本实现为网站上的按钮。 -note:如果点击按钮的人需要在他们自己的机器上安装script.py,那就没关系了
我已经尝试做关于这个主题的作业,但似乎有无限的选择 - 其中大多数都没有得到任何两方的约定。 我需要一个框架吗?我不能只使用一些<来自其目录的python脚本吗?脚本/>或我的HTML代码中的东西?
答案 0 :(得分:1)
简短回答:你不能。
您无法从浏览器访问用户计算机上的文件,甚至更少执行它们。想象一下,有多少安全漏洞。
但是,您可以在许多GUI工具包(Qt或wx具有Web视图或类似工具)中实现您自己的简单Web浏览器(例如,显示单个页面)。或者,您需要为正在使用的浏览器开发(或查找)插件/插件,并与之通信。它将取决于每个浏览器等。我不知道这是否可行。或者,用户将下载一个他将选择运行而不是保存的文件,该文件将执行您的脚本。
实际上,我刚看到this和this这基本上是你安装的插件(基于IronPython和Silverlight),我不确定你是否可以执行用户系统上的脚本虽然。它可以执行页面中嵌入的代码。
答案 1 :(得分:1)
OP问题的替代解决方案:
解决方案概要:
Javascript和php很好地使用这个设置,并允许从那里的mysql等。
使用'GET',我们使用shell脚本将客户端的用户输入发送到服务器端。
示例Index.php
<!DOCTYPE html>
<html>
<head>
<title>Google Email Search</title>
</head>
<body>
<h1>Script Options</h1>
<form action="/cgi-bin/call.sh" method="get">
<TABLE BORDER="1">
<TR>
<TD>Keyword:</TD>
<TD><input type="text" name="query" value="Query"></TD>
</TR>
<TR>
<TD># of Pages:</TD>
<TD><input type="text" name="pages" value="1"></TD>
</TR>
<TR>
<TD>Output File Name:</TD>
<TD><input type="text" name="output_name" value="results"></TD>
</TR>
<TR>
<TD>E-mail Address:</TD>
<TD><input type="text" name="email_address" value="example@gmail.com">
</TD>
</TR>
<TR>
<TD><input type="submit" value="Submit"></TD>
</TR>
</TABLE>
</form>
</body>
</html>
用于调用python脚本的示例shell脚本,该脚本位于cgi-bin或其他指定的“可执行”允许目录中。
#!/bin/bash
# Runs the cgi-script, using the shell, using 'get' results from the index html form we parse it to the options in the python script.
echo "Content-type: text/html"
echo ""
echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title></title>'
echo '</head>'
echo '<body>'
query=`echo "$QUERY_STRING" | sed -n 's/^.*query=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
pages=`echo "$QUERY_STRING" | sed -n 's/^.*pages=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
output_name=`echo "$QUERY_STRING" | sed -n 's/^.*output_name=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
email_address=`echo "$QUERY_STRING" | sed -n 's/^.*email_address=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
echo '<h1>'
echo 'Running...'
echo '</h1>'
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
cd "$DIR"
python main.py -query $query -pages $pages -o $output_name
echo ''
echo '</body>'
echo '</html>'
示例Python脚本。
从shell脚本调用:
#!/usr/bin/env python
from xgoogle.search import GoogleSearch
import urllib2, re, csv, os
import argparse
class ScrapeProcess(object):
emails = [] # for duplication prevention
def __init__(self, filename):
self.filename = filename
self.csvfile = open(filename, 'wb+')
self.csvwriter = csv.writer(self.csvfile)
def go(self, query, pages):
search = GoogleSearch(query)
search.results_per_page = 10
for i in range(pages):
search.page = i
results = search.get_results()
for page in results:
self.scrape(page)
def scrape(self, page):
try:
request = urllib2.Request(page.url.encode("utf8"))
html = urllib2.urlopen(request).read()
except Exception, e:
return
emails = re.findall(r'([A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*)', html)
for email in emails:
if email not in self.emails: # if not a duplicate
self.csvwriter.writerow([page.title.encode('utf8'), page.url.encode("utf8"), email])
self.emails.append(email)
parser = argparse.ArgumentParser(description='Scrape Google results for emails')
parser.add_argument('-query', type=str, default='test', help='a query to use for the Google search')
parser.add_argument('-pages', type=int, default=10, help='number of Google results pages to scrape')
parser.add_argument('-o', type=str, default='emails.csv', help='output filename')
args = parser.parse_args()
args.o = args.o+'.csv' if '.csv' not in args.o else args.o # make sure filename has .csv extension
s = ScrapeProcess(args.o)
s.go(args.query, args.pages)
完整的工作示例位于此处: https://github.com/mhenes/Google-EmailScraper
免责声明这是我的git-使用分叉项目来显示此功能。
答案 2 :(得分:-2)
IronPython可能是您正在寻找的解决方案: http://ironpython.net/
通过以下链接中提供的教程和代码,您应该能够创建对事件做出反应的html元素,例如html&#34; button&#34;就像你提到的那样。
我一直在玩IronPython并且已经成功进行了对脚本的内部和外部调用。下面的教程很可能包含您可能遇到的任何其他问题。
helloworld.html -
IronPython警报示例,文档中的内部python脚本。
要在浏览器中开发Python应用程序,您只需要自己喜欢的文本编辑器;所以打开它,创建一个HTML文件,引用dlr.js,然后你可以使用脚本标签来运行Python代码:
<html>
<head>
<script src="http://gestalt.ironpython.net/dlr-latest.js"
type="text/javascript"></script>
</head>
<body>
<script type="text/python">
window.Alert("Hello from Python")
</script>
</body>
</html>
<强> repl.py 强>
在REPL窗口中执行此操作,所以让我们在浏览器中打开一个;只需在页面中放置以下脚本标记:
from Microsoft.Scripting.Silverlight import Repl
if 'document' not in globals():
import System
document = System.Windows.Browser.HtmlPage.Document
if 'window' not in globals():
import System
window = System.Windows.Browser.HtmlPage.Window
class PythonRepl(object):
__ironpython__ = 'silverlightDlrRepl1'
__minimize__ = 'silverlightDlrWindowLink'
__container__ = 'silverlightDlrWindowContainer'
def __init__(self):
self.repl = Repl.Show('python')
def hide_all_panels(self):
window.Eval("sdlrw.hideAllPanels(document.getElementById(\"%s\"))" % self.__minimize__)
def show_panel(self, id):
window.Eval("sdlrw.showPanel(\"%s\")" % id)
def show_ironpython(self):
self.show_panel(self.__ironpython__)
def remove(self):
document.Body.RemoveChild(document.silverlightDlrWindowContainer)
def show():
prepl = PythonRepl()
repl = prepl.repl
import sys
sys.stdout = repl.OutputBuffer
sys.stderr = repl.OutputBuffer
return prepl
if document.QueryString.ContainsKey('console'):
prepl = show()
if document.QueryString['console'] == 'hide':
prepl.hide_all_panels()
else:
prepl.show_ironpython()
<强> dom.py 强>
IronPython示例:用于添加DOM元素并将其HTML内容更改为&#34; Ouch!&#34;点击时:
dir(document)
div = document.CreateElement("div")
div.innerHTML = "Hello from Python!"
document.Body.AppendChild(div)
div.id = "message"
div.SetStyleAttribute("font-size", "24px")
def say_ouch(o, e):
o.innerHTML = "Ouch!"
document.message.events.onclick += say_ouch
请注意:IronPython需要SilverLight,因此它只适用于FireFox或Safari。
与您的问题相关的优秀教程: http://jimmy.schementi.com/2010/03/pycon-2010-python-in-browser.html