Как я могу показать свои персональные рекламные баннеры в Центре программного обеспечения Ubuntu?
Я видел некоторые определения 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, если это возможно.
Откройте /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)
. Измените False
на True
.
Теперь сделайте /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
, чтобы сработал первый баннер.
Вам также нужен веб-сервер, работающий на 8800 с cgi-bin
, чтобы это работало. Если у вас этого нет, запустите это в 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
, чтобы он заполнил пространство, но вы поняли это.