2

Optimizely のようなプロキシを作成しようとしています。にアクセスするhttp://optimizely.comと、どのサイトでも Optimizely を試すことができます。次に例を示しますhttps://www.optimizely.com/edit#url=espn.com

ページを少し分析したところ、プロキシとして機能する実際の URL が edit.optimizely.com にあることがわかりました: http://edit.optimizely.com/http://espn.go.com/?optimizely_compatibility= false&optimizely_disable=true

このページの多くのリクエストは edit.optimizely.com/{uri} に戻ります。実際のドメインを保持するために Cookie を使用しているようで (そこにある Cookie で確認できますlast_path=http://espn.go.com/;)、URL はサーバーでプロキシされます。

[requests][2] を Optimizely プロキシと同様の方法で動作するプロキシとして使用するトルネード アプリを作成しましたが、それがリクエストの意図ではないことはわかっており、多くの Web サイトで失敗します。私は似たようなものを実装する「正しい」方法を疑問に思っています。Twistedを使用して簡単にプロキシを作成し、それを使用するようにシステムのグローバル プロキシ設定を変更できることはわかっていますが、次のようにして espn.com のコンテンツを返すアプリを作成する方法がわかりませんhttp://localhost:8000/http://espn.com。リクエストのようなものを悪用しています...(つまりreturn requests.get('http://espn.com').content

content-types、content-lengths、その他の雑多なものをどのように処理しますか。ヘッダー、ユーザーにデータを返す...

4

1 に答える 1

0

したがって、トルネードでこれを行う方法はわかりません(経験はまったくありません)が、Flaskで例を挙げることができます。

まず第一に、あなたができるようにするプロキシを書くことはとにかくないと思いますhttp://localhost:8000/http://espn.com. たとえば、Optimizely は使用せずhttp://espn.comespn.com. 同じことをします。

Flask に慣れていない場合は、非常に簡単です。これがあなたができる証明ですlocalhost:8000/espn.com

from flask import Flask

app = Flask(__name__)

@app.route('/<uri>')
def fake_proxy(uri):
    return uri

if __name__ == '__main__':
    app.run(debug=True)

それをファイルに保存してからproxy1.py実行python proxy1.pyすると、デバッグサーバーが起動し、(ブラウザで)アクセスしてブラウザに出力できhttp://localhost:5000/espn.comますespn.com。成功!

Web サイトのコンテンツを単純に表示するには、return requests.get('http://' + uri).content. Flask でデフォルトで設定されている content-type はわかりませんが、ほとんどのブラウザーは HTML を検出して適切に表示するため、心配する必要はありません。

これについて正確に知りたい場合は、Flask のドキュメント、特に応答について調べて作業を開始してください。

これをデプロイしたい場合は、デバッグサーバー以外のものを使用する必要があります (つまり、現在実行している方法)。そのため、gunicorn、セロリなど、さまざまなソリューションを検討する必要があります。 .

Twisted でそれを続けたいのであれば、Twisted のドキュメントは素晴らしく、この特定の Flask アプリよりもはるかに難しいことはないと確信しています。

これがどのように機能するかを忘れてしまうと思われる場合は、「/」のルートを追加して、使用情報を返すだけです。動作するのに html の書式設定さえ必要ありません。


編集

OP のコメントの後、私は彼の質問を完全には理解していないことに気付きました。これは、より良いことをするための試みです。

Content-Types、Content-Lengths、およびその他のヘッダーを適切に設定するには、リクエストから Response オブジェクトを実際に保存する必要があります。たとえば、次のコードを見てください。

 import requests

 r = requests.get('http://httpbin.org/get')

次に、headers 属性を見てください。

 r.headers

応答で返されるヘッダーのディクショナリ (大文字と小文字を区別せずにアクセスできます) です。そこにある 1 つのヘッダーはSet-Cookieヘッダーです (スクレイピングしているサイトが Cookie を設定すると仮定します)。

Cookie も設定しているため、新しい Cookie を適切に構築して、サイトのサイトに干渉せず、RFC が意図したとおりに適切に追加できるようにする必要があります。

そこにある辞書には、送信する必要があると見なされるContent-LengthContent-Type、およびその他すべてのヘッダーがあります。好きなように転送してください。

また、私は Optimizely であまり遊んでいませんでしたが、ページ上のリンクをクリックすることでサイトを離れることはなかったと思います。上記の単純な例では、プロキシを離れることになります。とは言っても、あなたはすでにその事件をそのまま処理しているようですので、私の助けは必要ありません。

Optimizely が実際にどのように機能しているかについては、読み込み、編集、表示に大量の JavaScript を使用していると思われます。すべてが、その使用のために設計された「内部」API ( ) を通過するように見えるedit.optimizely.comため、すべてが 1 か所で発生しているわけではありません。

彼らの API がどのように設計されたのか、どのように機能するのかはわかりませんが、傍受されたパケットを十分に受信して、彼らが何をしているのか、API がどのように見えるのかを判断できれば、トラフィックを盗聴し、おそらくそれをいじることができるのではないかと思います。

requests がこれに適したライブラリであるかどうかについて: requests は (おそらく、自分でテストしたことはありません) urllib2 よりもはるかに高速です。これは、スレッド化された状況とスレッド化されていない (または greenlet の) 状況でうまく機能します。セッション オブジェクトを使用すると、espn.com(たとえば) によって設定されたすべての Cookie が保存され、Cookie が設定されていないことを ESPN が通知してもナビゲーションが妨げられることはありません。しかし実際には、それがあなたが構築しているツールに適したライブラリであるかどうかはわかりません. それは完全にあなたの呼びかけです。

于 2013-05-12T00:46:03.790 に答える