Ubuntu Software Centerでパーソナライズされたバナー展示を表示する


11

独自のパーソナライズされたバナー展示をUbuntu Software Centerで表示するにはどうすればよいですか?

私は上のいくつかのURLの定義を見てきました/usr/share/software-center/softwarecenter/enums.pyし、/usr/share/software-center/softwarecenter/distro/Ubuntu.pyこれまでのところ。

また、ビューからコアまでのコードを追跡しようとしました。しかし、私は迷子になりました。_append_banner_adds呼び出しますSoftwareCenterAgent。を呼び出しますSpawnHelper。それから私は迷子になります。でいくつかの呼び出しもありますがSimpleFileDownloader、それらを追跡することはできません。

また、デバッグログにこのエントリがあることに気付きました。

2013-02-08 15:07:43,731 - softwarecenter.simplefiledownloader - DEBUG - download_file: http://software-center.ubuntu.com/site_media/exhibits/2012/12/SC_banner_Mixxx_2.png None True

これの実装方法に関するドキュメントはありますか?デフォルトのバナーを変更し、きれいな方法で自分のバナーを配置する簡単なレシピは非常に役立ちます。

私は単純に_append_banner_adds関数を書き換えることができると思いますが、私はPythonであまり多作ではないので、可能であればUbuntuが使用しているのと同じ方法を理解して使用したいと思います。

回答:


6

次の/usr/share/software-center/softwarecenter/backend/scagent.pyように、この関数の先頭を開いて編集します。

def query_exhibits(self):
    import urllib, json
    class Obj:
      def __init__(self, obj):
        self.obj = obj
      def __getattr__(self, name):
        if name[:2] == "__": return object.__getattr__(self, name)
        return self.obj[name]

    self.emit("exhibits", [Obj(x) for x in json.loads(urllib.urlopen("http://localhost:8800/cgi-bin/bannerlist.py").read())])
    return

残りはそのままにしておくことができ、到達することはありません。

でスクリプトのサポートが必要な場合は<iframe>、編集

/usr/share/software-center/softwarecenter/ui/gtk3/widgets/exhibits.py

そして見つけるsettings.set_property("enable-scripts", False)。に変更FalseTrueます。

次に、/var/www/cgi-bin/bannerlist.py実行可能にします。

#!/usr/bin/env python
import json

print("Content-type: application/json\n")

print(json.dumps([
{
  "html": "<iframe src='file:/tmp/test.html'></iframe>",
  "title_translated": "Hey dawg",
  "click_url": "http://4chan.org",
  "package_names": ("gimp"),
  "banner_urls": ["file:/"],
  "published": True
},
{
  "html": "<iframe src='http://localhost:8800/cgi-bin/banner.py'></iframe>",
  "title_translated": "Hey dawg",
  "click_url": "http://4chan.org",
  "package_names": ("gimp"),
  "banner_urls": ["file:/"],
  "published": True
}
]))

これは、生成されたバナーリストを示しています。

次に、/var/www/cgi-bin/banner.py実行可能にします。

#!/usr/bin/env python3
import time
print("Content-type: image/svg+xml\n")
print("""
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100"
  style="fill:rgba(0,0,255,0.5);stroke-width:1;stroke:rgba(0,0,0,0.5)"/>
  <text x="0" y="25" fill="black">Time is """ + str(time.time()) + """</text>
</svg> 
""")

これは、生成されたバナーを示しています。

ソフトウェアセンターのキャッシュをクリアする必要がある場合があります。あなたはそれを使用してそれを行うことができますrm -rf ~/.cache/software-center

明らか/tmp/test.htmlに、最初のバナーが機能するためには何かを入れる必要があります。

またcgi-bin、これを機能させるには、8800で実行されているWebサーバーが必要です。これがない場合は、これをBashで実行します。

cd /var/www
python -c "import BaseHTTPServer as h, CGIHTTPServer as c;
i = c.CGIHTTPRequestHandler;
i.cgi_directories = ['/cgi-bin'];
h.HTTPServer(('', 8800),i).serve_forever()"

iframeスペースを埋めるためにスタイルを設定する必要がありますが、それを理解しました。


ありがとう!標準のバナーローテーターを再利用できませんか?複数のクラスを宣言してみましたが、かなりうまくいきました。iframeでスタイリングの問題がありますが、それを整理できるはずです。Webサーバーからバナー展示を収集したいので、おそらくJSONを使用する必要があります。賞金にはこれが含まれており、自分のサーバーからバナーを収集していることに注意してください。この情報を含めると、賞金を授与することができます:)
ホルヘスアレスデリス

@JorgeSuárezdeLis:完了
ヤヌス

わかりました、これは機能していません。アプリケーションで、次のようなエラーが表示されます:(Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py上のローカルバージョンでも同じです/tmp)。古いバージョンは機能していましたが、今ではどこかでURLのスラッシュを削除するようです。展示は正常に収集され、HTMLコンテンツをコンソールに印刷できます。スラッシュはありますが、アプリケーションにはありません!何が起きているのでしょうか?
ホルヘスアレス

さて、URLにアクセスできることを確認しますか?curlコンソールで使用してロードしてみてください。私はそれがエラーメッセージのスラッシュを取り除くだけだと思います。
ヤヌストロエルセン

そうは思いません。スクリーンショットを撮りました。最初の2つの請願書はFirefoxからのものです。バナーリストのみがソフトウェアセンターから収集されているようです。
ホルヘスアレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.