Найти - Пользователи
Полная версия: Эмуляция браузера PyQT4
Начало » GUI » Эмуляция браузера PyQT4
1 2 3
reclosedev
Если добавить вывод отладочных сообщения JS
import sys
from PyQt4 import QtWebKit
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *
settings = QtWebKit.QWebSettings.globalSettings()
settings.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled, True);
settings.setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
QNetworkProxy.setApplicationProxy(QNetworkProxy(QNetworkProxy.HttpProxy, "127.0.0.1", 8888))
 
class MyPage(QWebPage):
    def javaScriptConsoleMessage(self, message, lineNumber, sourceID):
        print lineNumber, message, sourceID
 
app = QApplication(sys.argv)
web = QWebView()
web.setPage(MyPage())
web.load(QUrl("http://ru.grepolis.com"))
web.show()
sys.exit(app.exec_())
Получаем
0 SECURITY_ERR: DOM Exception 18: An attempt was made to break through the secur
ity policy of the user agent. undefined
0 ReferenceError: Can't find variable: Happening undefined
Беглое гугление дало
http://lfranchi.wordpress.com/2011/08/16/tomahawk-0-2-released/#comment-50

Похоже, проблема QtWebkit. Поищите, может еще что найдете.
Seganapa
Посмотрел в Гугл, очень мало информации, толком разобрать не смог. Может дело в user agent? Он ведь неправильный передает…

Помогите в мой код внедрить толковый user agent, пожалуйста, вдруг поможет…
например:
useragent = “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28”

Как его вставить в мой код?
reclosedev
Seganapa
Как его вставить в мой код
Ну есть же в гугле, нужно переопределить userAgentForUrl в QWebPage.
Вчера пробовал, не помогло.
Seganapa
В гугле то есть, но у меня не получается применить useragent к моему коду (примеры все с классами)… Если не трудно, покажите на моем коде…

а может дело вообще в headers? Как думаете, может нужно точно повторять заголовки???

Нашел код браузера на PyQT
http://www.rkblog.rk.edu.pl/w/p/webkit-pyqt-rendering-web-pages/

Хотел им проверить, вдруг загрузит, но запустить его так и не получилось… Моих знаний Python еще не достаточно.

Ув. reclosedev, не могли бы вы попробовать загрузить Grepolis с помощью этого браузера, вдруг получится, тогда я бы мог использовать его в своем приложении?
reclosedev
Seganapa
но у меня не получается применить useragent к моему коду (примеры все с классами)… Если не трудно, покажите на моем коде…
Seganapa
не могли бы вы попробовать загрузить Grepolis с помощью этого браузера, вдруг получится, тогда я бы мог использовать его в своем приложении?
Пробуйте еще, разбирайтесь, если так нужно. Делать все за вас нет никакого желания.
Seganapa
Все таки удалось запустить этот браузер (http://www.rkblog.rk.edu.pl/w/p/webkit-pyqt-rendering-web-pages/), но он тоже к сожалению не загрузил grepolis…
Seganapa
Продолжается моя эпопея с внедрением браузера в мое приложение.
Так и не удалось мне отыскать причину, по которой webkit ну никак не хочет полностью догружать страницу ru.grepolis.com

Перечитал огромную кучу информацию, перевел немереное количество текста, но ответа так и не нашел. Очень грустно.

В итоге набрел на проект cefpython (http://code.google.com/p/cefpython/). Это Chromium Embedded Framework (Фреймворк привязок Google Chrome)

Он подходит для решения моей задачи как нельзя лучше!
Вот пример кода для загрузки страницы grepolis:
# An example of embedding CEF in wxPython application.
#coding:utf-8
import wx
import sys
import time
import cefpython
# TODO: currently we use wx.Timer to imitate message loop, but
# it would probably be better to use wx.CallLater() and wx.lib.pubsub.
class MainFrame(wx.Frame):
	browser = None
	def __init__(self):
		
		wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, title='wxPython example', size=(1000,800))
		self.CreateMenu()
		self.browser = cefpython.CreateBrowser(self.GetHandle(), browserSettings={}, navigateURL="http://ru.grepolis.com")		
		
		self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
		self.Bind(wx.EVT_SIZE, self.OnSize)
		
	def CreateMenu(self):
		filemenu = wx.Menu()
		filemenu.Append(1, "Открыть")
		filemenu.Append(2, "Выход")
		aboutmenu = wx.Menu()
		aboutmenu.Append(1, "CEF Python")
		menubar = wx.MenuBar()
		menubar.Append(filemenu,"&File")
		menubar.Append(aboutmenu, "&About")
		self.SetMenuBar(menubar)
	def OnSetFocus(self, event):
		cefpython.wm_SetFocus(self.GetHandle(), 0, 0, 0)
	def OnSize(self, event):
		cefpython.wm_Size(self.GetHandle(), 0, 0, 0)
class MyApp(wx.App):
	timer = None
	timerID = 1
	def OnInit(self):
		cefpython.Initialize()
		sys.excepthook = cefpython.ExceptHook
		self.timer = wx.Timer(self, self.timerID)
		self.timer.Start(10) # 10ms
		wx.EVT_TIMER(self, self.timerID, self.OnTimer)
		
		frame = MainFrame()
		self.SetTopWindow(frame)
		frame.Show()
		
		return True
	def OnExit(self):
		self.timer.Stop()
		cefpython.Shutdown()
	def OnTimer(self, event):
		cefpython.SingleMessageLoop()
if __name__ == '__main__':
	
	print('wx.version=%s' % wx.version())
	app = MyApp(False)
	app.MainLoop()

Проверил, все грузится полностью, как нужно… Но вот теперь возник другой вопрос!

КАК ЖЕ ТЕПЕРЬ АВТОМАТИЗИРОВАТЬ ЗАПОЛНЕНИЕ ВВОДА ЛОГИНА И ПАРОЛЯ И НАЖАТЬ НА КНОПКУ АВТОРИЗАЦИИ?

Возможно ли это? Какими средствами? Кто сталкивался? Безуспешно гуглил, очень мало информации по cefpython. Думал написать разработчику, но в связи с трудностями в английском, не могу правильно составить (сформулировать) свой вопрос.

Очень нуждаюсь в помощи…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB