1

学校でクラスの開始を監視するための小さなツールを作成しています。

数分ごとに各部門から現在のクラスの空き状況を取得する Python スクリプトを作成しました。

大学のサイトがこれを返し始めるまで、スクリプトは適切に機能していました。

SIS Server is not available at this time 

Uni が私のサーバーをブロックしたに違いありません。それは、他の PC から直接 URL にアクセスしたときに得られる出力だからです。しかし、ユニのサイトで POST を実行する中間フォームを通過すると、そのメッセージが表示されません。

私がリクエストしている URL はhttps://s4.its.unc.edu/SISMisc/SISTalkerServletです

これは私のpythonコードがどのように見えるかです:

data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"})
f = urllib.urlopen("https://s4.its.unc.edu/SISMisc/SISTalkerServlet", data)
s =  f.read()
print (s)

私は本当に困惑しています!Python が適切なリクエストを送信していないようです。最初は適切な投稿データを送信していないと思っていましたが、URL をローカル ボックスに変更したところ、Apache が受け取った投稿データは問題ないようでした。

システムが実際に機能しているのを見たい場合は、https://s4.its.unc.edu/SISMisc/browser/student_pass_z.jspに移動し、[ゲストとして入力] ボタンをクリックしてから、[コースの利用可能性] を探します。 . (これで、私がこれを作成する理由がわかりました!)

最も奇妙なことは、これが午前 11 時まで機能していたことです。以前にも同じエラーが発生しましたが、数分間しか続きませんでした。これは、ユニによるサーバーのブロックよりも、どこかで問題があることを示しています。

更新 提案に応じて、より正当なリファラー/ユーザーエージェントで遊んでみました。同じ結果です。これは私が試したものです:

import httplib
import urllib
headers =  {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4',"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain","Referrer": "https://s4.its.unc.edu/SISMisc/SISTalkerServlet"}
data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"})
c = httplib.HTTPSConnection("s4.its.unc.edu",443)
c.request("POST", "/SISMisc/SISTalkerServlet",data,headers)
r = c.getresponse()
print r.read()
4

2 に答える 2

2

この投稿はコードを修正しようとはしていませんが、デバッグツールを提案しています。

昔々、私はオンラインフォームに記入するプログラムをコーディングしていました。ブラウザがPOSTやCookieをどのように処理しているかを正確に知るために、ネットワークスニファであるWireShark(http://www.wireshark.org/ )をインストールしました。このアプリケーションを使用すると、IPおよびハードウェアレベルで送受信されていたデータをチャンクごとに表示できました。

同様のプログラムを試して、ネットワークフローを比較することを検討してください。これは、ブラウザが実行していることとスクリプトが実行していることの違いを浮き彫りにする可能性があります。

于 2009-04-08T04:20:00.410 に答える
0

奇妙な非ブラウザ User-Agent 文字列からの複数のリクエストを確認した後、サイトから参照されていないユーザーをブロックしている可能性があります。たとえば、PHP には$_SERVER['HTTP_REFERRER']IIRC と呼ばれる機能があり、ユーザーを現在のページに誘導したページをチェックします。プログラムは User-Agent 文字列に含まれていないため (直接アクセスしようとしている)、それに基づいてアクセスを妨げている可能性が非常に高くなります。http リクエストのヘッダーにリファラーを追加してみて、どうなるか見てみましょう。(できれば、アクセスしようとしているページにリンクしているページ)

http://whatsmyuseragent.com/は、なりすましユーザー エージェントの作成を支援します。

次に、ヘッダーを次のように作成します...

headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}

そして、それらを HTTPConnection リクエストの追加パラメーターとして送信します...

conn.request("POST", "/page/on/site", params, headers)

詳細な参照と例については、 httplibの python doc を参照してください。

于 2009-04-08T01:42:34.623 に答える