单击一个按钮(在网页上)运行客户端python脚本

时间:2012-06-27 19:47:12

标签: python html frameworks

所以我试图修改一些HTML,以便有一个启动python脚本的按钮,该脚本作用于自己系统中的几个文件。

更具体地说,我有一个python脚本,它通过snort日志读取并生成一个指向新网站的链接(实际上,这是一个获取数据包捕获流搜索参数的IP地址) 我正在尝试将此脚本实现为网站上的按钮。 -note:如果点击按钮的人需要在他们自己的机器上安装script.py,那就没关系了

我已经尝试做关于这个主题的作业,但似乎有无限的选择 - 其中大多数都没有得到任何两方的约定。 我需要一个框架吗?我不能只使用一些<来自其目录的python脚本吗?脚本/>或我的HTML代码中的东西?

3 个答案:

答案 0 :(得分:1)

简短回答:你不能。

您无法从浏览器访问用户计算机上的文件,甚至更少执行它们。想象一下,有多少安全漏洞。

但是,您可以在许多GUI工具包(Qt或wx具有Web视图或类似工具)中实现您自己的简单Web浏览器(例如,显示单个页面)。或者,您需要为正在使用的浏览器开发(或查找)插件/插件,并与之通信。它将取决于每个浏览器等。我不知道这是否可行。或者,用户将下载一个他将选择运行而不是保存的文件,该文件将执行您的脚本。

实际上,我刚看到thisthis这基本上是你安装的插件(基于IronPython和Silverlight),我不确定你是否可以执行用户系统上的脚本虽然。它可以执行页面中嵌入的代码。

答案 1 :(得分:1)

OP问题的替代解决方案:

解决方案概要:

  1. 通过带有'GET'的HTML表单发送用户输入
  2. 处理发送到shell脚本的网址编码值'GET'的值
  3. Shell脚本解析值并保存它们,并在调用它运行时将参数传递给Python脚本。
  4. 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