为我的插件实现Kodi登录功能
我正在尝试为我的Kodi向导实现一个登录功能,但当我打开这个插件时,显示的只是空白目录,而不是我向导的内容。
我想做的是,通过Kodi插件的设置输入用户名和密码。这里有一个设置的xml文件,用来存储用户名和密码信息(这个文件保存在插件资源文件夹里,名为settings.xml)。
在Kodi的插件设置菜单中输入用户名和密码后,我打开向导插件,结果目录是空的。
有没有人能告诉我,我的代码中哪里导致了这种情况?以下是Default.py的代码:
import xbmc, xbmcaddon, xbmcgui, xbmcplugin,os,sys
import shutil
import urllib2,urllib
import re
import extract
import time
import downloader
import plugintools
import zipfile
import ntpath
import base64
import os
import re
import urllib,urllib2
import cookielib
import weblogin
USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
base='HotBoxz Media Center Wizard'
ADDON=xbmcaddon.Addon(id='plugin.program.test')
VERSION = "1.0.1"
PATH = "Example Wizard"
dp = xbmcgui.DialogProgress()
dialog = xbmcgui.Dialog()
EXCLUDES = ['plugin.program.test']
HOME = xbmc.translatePath('special://home/')
logged_in_string = 'Welcome to'
def LOGIN(username,password):
uc = username[0].upper() + username[1:]
lc = username.lower()
logged_in = weblogin.doLogin(__datapath__,username,password)
if logged_in == True:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')
def check_login(source,username):
#the string you will use to check if the login is successful.
logged_in_string = 'Welcome to'
#search for the string in the html, without caring about upper or lower case
if re.search(logged_in_string,source,re.IGNORECASE):
return True
else:
return False
def doLogin(username, password):
if username and password:
login_url = 'http://p.xxe.press/login.php'
header_string = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
login_data = urllib.urlencode({'username':username, 'password':password})
req = urllib2.Request(login_url, login_data)
req.add_header('User-Agent',header_string)
response = opener.open(req)
source = response.read()
response.close()
login = check_login(source,username)
return login
else:
return False
def CATEGORIES(LOGIN):
usrsettings = xbmcaddon.Addon(id='plugin.program.test')
use_account = usrsettings.getSetting('use-account')
if use_account == 'true':
#get username and password and do login with them
#also get whether to hid successful login notification
username = usrsettings.getSetting('username')
password = usrsettings.getSetting('password')
if logged_in_string == True:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')
def OPEN_URL(url):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
link=response.read()
response.close()
return link
def wizard(name,url,description):
path = xbmc.translatePath(os.path.join('special://home/addons','packages'))
dp = xbmcgui.DialogProgress()
dp.create("Wizard","Wizard is Whizzing down your Wires ",'', 'Put the kettle on')
lib=os.path.join(path, name+'.zip')
try:
os.remove(lib)
except:
pass
downloader.download(url, lib, dp)
addonfolder = xbmc.translatePath(os.path.join('special://','home'))
time.sleep(2)
dp.update(0,"", "Extracting now, Please Wait")
print '======================================='
print addonfolder
print '======================================='
extract.all(lib,addonfolder,dp)
dialog = xbmcgui.Dialog()
dialog.ok("DOWNLOAD COMPLETE! ", 'To ensure all changes are saved, this app must close', 'Press OK to continue.')
killxbmc()
def killxbmc():
choice = xbmcgui.Dialog().yesno('Force Close', 'You are about to close', 'Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
if choice == 0:
return
elif choice == 1:
pass
myplatform = platform()
print "Platform: " + str(myplatform)
if myplatform == 'osx': # OSX
print "############ try osx force close #################"
try: os.system('killall -9 XBMC')
except: pass
try: os.system('killall -9 Kodi')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'linux': #Linux
print "############ try linux force close #################"
try: os.system('killall XBMC')
except: pass
try: os.system('killall Kodi')
except: pass
try: os.system('killall -9 xbmc.bin')
except: pass
try: os.system('killall -9 kodi.bin')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'android': # Android
print "############ try android force close #################"
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "Your system has been detected as Android, you ", "[COLOR=yellow][B]MUST[/COLOR][/B] force close. [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Pulling the power cable is the simplest method to force close.")
elif myplatform == 'windows': # Windows
print "############ try windows force close #################"
try:
os.system('@ECHO off')
os.system('tskill XBMC.exe')
except: pass
try:
os.system('@ECHO off')
os.system('tskill Kodi.exe')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im Kodi.exe /f')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im XBMC.exe /f')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
else: #ATV
print "############ try atv force close #################"
try: os.system('killall AppleTV')
except: pass
print "############ try raspbmc force close #################" #OSMC / Raspbmc
try: os.system('sudo initctl stop kodi')
except: pass
try: os.system('sudo initctl stop xbmc')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","Your platform could not be detected so just pull the power cable.")
def platform():
if xbmc.getCondVisibility('system.platform.android'):
return 'android'
elif xbmc.getCondVisibility('system.platform.linux'):
return 'linux'
elif xbmc.getCondVisibility('system.platform.windows'):
return 'windows'
elif xbmc.getCondVisibility('system.platform.osx'):
return 'osx'
elif xbmc.getCondVisibility('system.platform.atv2'):
return 'atv2'
elif xbmc.getCondVisibility('system.platform.ios'):
return 'ios'
def addDir(name,url,mode,iconimage,fanart,description):
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+urllib.quote_plus(iconimage)+"&fanart="+urllib.quote_plus(fanart)+"&description="+urllib.quote_plus(description)
ok=True
liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": description } )
liz.setProperty( "Fanart_Image", fanart )
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
return ok
def get_params():
param=[]
paramstring=sys.argv[2]
if len(paramstring)>=2:
params=sys.argv[2]
cleanedparams=params.replace('?','')
if (params[len(params)-1]=='/'):
params=params[0:len(params)-2]
pairsofparams=cleanedparams.split('&')
param={}
for i in range(len(pairsofparams)):
splitparams={}
splitparams=pairsofparams[i].split('=')
if (len(splitparams))==2:
param[splitparams[0]]=splitparams[1]
return param
def killxbmc():
choice = xbmcgui.Dialog().yesno('Force Close', 'We will now attempt to force close, Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
if choice == 0:
INDEX()
elif choice == 1:
pass
myplatform = platform()
print "Platform: " + str(myplatform)
if myplatform == 'osx': # OSX
print "############ try osx force close #################"
try: os.system('killall -9 XBMC')
except: pass
try: os.system('killall -9 Kodi')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'linux': #Linux
print "############ try linux force close #################"
try: os.system('killall XBMC')
except: pass
try: os.system('killall Kodi')
except: pass
try: os.system('killall -9 xbmc.bin')
except: pass
try: os.system('killall -9 kodi.bin')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
elif myplatform == 'android': # Android
print "############ try android force close #################"
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
try: os._exit(1)
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "Be prepared to unplug your device, you ", "[COLOR=yellow][B]MUST[/COLOR][/B] press OK then unplug power from device and restart for changes to take effect. [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Pulling the power cable is the simplest method to force close.")
elif myplatform == 'windows': # Windows
print "############ try windows force close #################"
try:
os.system('@ECHO off')
os.system('tskill XBMC.exe')
except: pass
try:
os.system('@ECHO off')
os.system('tskill Kodi.exe')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im Kodi.exe /f')
except: pass
try:
os.system('@ECHO off')
os.system('TASKKILL /im XBMC.exe /f')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
else: #ATV
print "############ try atv force close #################"
try: os.system('killall AppleTV')
except: pass
print "############ try raspbmc force close #################" #OSMC / Raspbmc
try: os.system('sudo initctl stop kodi')
except: pass
try: os.system('sudo initctl stop xbmc')
except: pass
dialog.ok("[COLOR=red][B]WARNING !!![/COLOR][/B]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","Your platform could not be detected so just pull the power cable.")
def FRESHSTART(params):
choice2 = xbmcgui.Dialog().yesno("Are you sure?", 'Are you sure you want to wipe this install?', '', 'All addons EXCLUDING this Media Center Wizard will be completely wiped!', yeslabel='Yes',nolabel='No')
if choice2 == 0:
return
elif choice2 == 1:
dp.create("Please Wait","FRESHSTART IN PROGRESS",'', 'Please Wait, Wizard will close when complete')
try:
for root, dirs, files in os.walk(HOME,topdown=True):
dirs[:] = [d for d in dirs if d not in EXCLUDES]
for name in files:
try:
os.remove(os.path.join(root,name))
os.rmdir(os.path.join(root,name))
except: pass
for name in dirs:
try: os.rmdir(os.path.join(root,name)); os.rmdir(root)
except: pass
except: pass
dialog.ok('Completed','FreshStart Successful, Press ok to close, you will need to reopen the App for changes to take effect...','','')
xbmc.executebuiltin('XBMC.Reset')
params=get_params()
url=None
name=None
mode=None
iconimage=None
fanart=None
description=None
try:
url=urllib.unquote_plus(params["url"])
except:
pass
try:
name=urllib.unquote_plus(params["name"])
except:
pass
try:
iconimage=urllib.unquote_plus(params["iconimage"])
except:
pass
try:
mode=int(params["mode"])
except:
pass
try:
fanart=urllib.unquote_plus(params["fanart"])
except:
pass
try:
description=urllib.unquote_plus(params["description"])
except:
pass
print str(PATH)+': '+str(VERSION)
print "Mode: "+str(mode)
print "URL: "+str(url)
print "Name: "+str(name)
print "IconImage: "+str(iconimage)
def setView(content, viewType):
# set content type so library shows more views and info
if content:
xbmcplugin.setContent(int(sys.argv[1]), content)
if ADDON.getSetting('auto-view')=='true':
xbmc.executebuiltin("Container.SetViewMode(%s)" % ADDON.getSetting(viewType) )
if mode==None or url==None or len(url)<1:
CATEGORIES(LOGIN)
elif mode==1:
wizard(name,url,description)
elif mode==6:
FRESHSTART(params)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
我还使用了import weblogin,这里是weblogin.py的内容:
-- 编码: UTF-8 --
""" weblogin 作者: Anarchintosh @ xbmcforums Copyleft (GNU GPL v3) 从2011年起
这个例子是为Fantasti.cc登录配置的 如果想查看完整指南,请访问: http://forum.xbmc.org/showthread.php?p=772597#post772597
使用方法: 在你的default.py中写:
import weblogin logged_in = weblogin.doLogin('保存cookie的路径','用户名','密码')
logged_in的值会是True或False,取决于登录是否成功。 """
import os
import re
import urllib,urllib2
import cookielib
### TESTING SETTINGS (will only be used when running this file independent of your addon)
# Remember to clear these after you are finished testing,
# so that your sensitive details are not in your source code.
# These are only used in the: if __name__ == "__main__" thing at the bottom of this script.
myusername = ''
mypassword = ''
#note, the cookie will be saved to the same directory as weblogin.py when testing
def check_login(source,username):
#the string you will use to check if the login is successful.
#you may want to set it to: username (no quotes)
logged_in_string = 'Welcome to'
#search for the string in the html, without caring about upper or lower case
if re.search(logged_in_string,source,re.IGNORECASE):
return True
else:
return False
def doLogin(cookiepath, username, password):
#check if user has supplied only a folder path, or a full path
if not os.path.isfile(cookiepath):
#if the user supplied only a folder path, append on to the end of the path a filename.
cookiepath = os.path.join(cookiepath,'cookies.lwp')
#delete any old version of the cookie file
try:
os.remove(cookiepath)
except:
pass
if username and password:
#the url you will request to.
login_url = 'http://p.xxe.press/login.php'
#the header used to pretend you are a browser
header_string = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
#build the form data necessary for the login
login_data = urllib.urlencode({'username':username, 'password':password})
#build the request we will make
req = urllib2.Request(login_url, login_data)
req.add_header('User-Agent',header_string)
#initiate the cookielib class
cj = cookielib.LWPCookieJar()
#install cookielib into the url opener, so that cookies are handled
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#do the login and get the response
response = opener.open(req)
source = response.read()
response.close()
#check the received html for a string that will tell us if the user is logged in
#pass the username, which can be used to do this.
login = check_login(source,username)
#if login suceeded, save the cookiejar to disk
if login == True:
cj.save(cookiepath)
#return whether we are logged in or not
return login
else:
return False
#code to enable running the .py independent of addon for testing
if __name__ == "__main__":
if myusername is '' or mypassword is '':
print 'YOU HAVE NOT SET THE USERNAME OR PASSWORD!'
else:
logged_in = doLogin(os.getcwd(),myusername,mypassword)
print 'LOGGED IN:',logged_in
相关问题:
- 暂无相关问题
1 个回答
0
首先,登录的时候你需要你的用户名和密码!如果模式是空的,就执行 CATEGORIES(LOGIN)。然后你进入 CATEGORIES(LOGIN) 这个步骤:如果 logged_in_string 是真的,那 logged_in_string 到底是什么呢?所以我觉得你需要在 CATEGORIES 函数里加点东西。
def CATEGORIES(LOGIN):
usrsettings = xbmcaddon.Addon(id='plugin.program.test')
use_account = usrsettings.getSetting('use-account')
if use_account == 'true':
#get username and password and do login with them
#also get whether to hid successful login notification
username = usrsettings.getSetting('username')
password = usrsettings.getSetting('password')
if logged_in_string == True:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')
我的代码:
def CATEGORIES(LOGIN):
usrsettings = xbmcaddon.Addon(id='plugin.program.test')
use_account = usrsettings.getSetting('use-account')
if use_account == 'true':
#get username and password and do login with them
#also get whether to hid successful login notification
username = usrsettings.getSetting('username')
password = usrsettings.getSetting('password')
logged_in_string = doLogin(username, password) # do and check your login
if logged_in_string:
link = OPEN_URL('http://example.com').replace('\n','').replace('\r','')
match = re.compile('name="(.+?)".+?rl="(.+?)".+?mg="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link)
for name,url,iconimage,fanart,description in match:
addDir(name,url,1,iconimage,fanart,description)
setView('movies', 'MAIN')
addDir('FRESH START','url',6,'','','')