2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

QWebViewの通信を覗き見る

Last updated at Posted at 2014-11-21

プロキシを使用せずQWebViewの通信を覗き見る方法を記載。
PyQt5を使っているがC++等でも大きくは違わないはず。

試行錯誤の結果なので改善点あれば指摘ください。

QNetworkAccessManagerを継承する

# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    def __init__(self, parent):
        super(NetworkAccessManager, self).__init__(parent)
        self.reply_content = {}
# 以下後述

self.reply_contentは受信内容の保持に使用

QWebPage.setNetworkAccessManager()で上記クラスをQWebPageに設定する

# コード例
nm = MyNetworkAccessManager()

web_view = QWebView()
web_view.page().setNetworkAccessManager(nm)

これでweb_viewの通信はMyNetworkAccessManager経由で行われることになる。

送信を覗き見る

QNetworkAccessManager.createRequest()をオーバーライドして送信を覗き見る。

# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    # __init__は省略

    def createRequest(self, op, req, outgoing_data = None):
        if outgoing_data is not None:
            content = str(outgoing_data.peek(1024*1024), encoding='utf-8'))

        reply = super(MyNetworkAccessManager, self).createRequest(op, req, outgoing_data)
        reply.readyRead.connect(self.on_ready_read)
        reply.finished.connect(self.on_finished)
        self.reply_content[reply] = ''
        return reply

contentに送信内容が入る。ただしGETやHEADの場合は空。

outgoing_dataQIODeviceだが、bytesAvailable()等のメソッドが軒並み0を返してくるので固定値でpeek()を呼んでいる。
peek()はバイト列を返す。ここではエンコーディングをutf-8固定で文字列にしているが、状況に合わせて適当に。

あと受信内容取得のためにreadyRead,finishedシグナルをconnectしている。

受信を覗き見る

# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    # __init__, createRequest 省略

    def _get_content(self, reply):
        content = str(reply.peek(reply.bytesAvailable()), encoding='utf-8')
        self.reply_content[reply] += content

    @pyqtSlot()
    def on_ready_read(self):
        reply = self.sender()
        self._get_content(reply)

    @pyqtSlot()
    def on_finished(self):
        reply = self.sender()
        self._get_content(reply)

        content = self.reply_content[reply]

        del self.reply_content[reply]

readyReadシグナルの度peek()でデータを取り出し辞書に保持。finishedシグナルで辞書からデータ全体を取得している。

_get_content()もutf-8決め打ちしてあるが、状況に合わせて適当に。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?