Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2014 16:47:46

bodycom
Зарегистрирован: 2014-01-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Всем доброго времени суток.
Прошу помощи в разборе скрипта для телевизора.

Сам скрипт:

#!/usr/bin/env python3
import http.client
from tkinter import *
import xml.etree.ElementTree as etree
import socket
import re
import sys
lgtv = {}
dialogMsg =""
headers = {"Content-Type": "application/atom+xml"}
lgtv["pairingKey"] = "DDGWAF"
class MyDialog:
    def __init__(self, parent, dialogMsg):
        top = self.top = Toplevel(parent)
        Label(top, text = dialogMsg, justify="left").pack()
        self.e = Entry(top)
        self.e.pack(padx=5)
        self.e.focus_set()
        b = Button(top, text="Ok", command=self.ok)
        b.pack(pady=5)
        top.bind("<Return>", self.ok)
        top.title("Lg Commander")
        top.geometry("410x280+10+10")
    def ok(self,dummy=None):
        global result
        result = self.e.get()
        self.top.destroy()
def getip():
    strngtoXmit =   'M-SEARCH * HTTP/1.1' + '\r\n' + \
                    'HOST: 239.255.255.250:1900'  + '\r\n' + \
                    'MAN: "ssdp:discover"'  + '\r\n' + \
                    'MX: 2'  + '\r\n' + \
                    'ST: urn:schemas-upnp-org:device:MediaRenderer:1'  + '\r\n' +  '\r\n'
    bytestoXmit = strngtoXmit.encode()
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.settimeout(3)
    found = False
    gotstr = 'notyet'
    i = 0
    ipaddress = None
    sock.sendto( bytestoXmit,  ('239.255.255.250', 1900 ) )
    while not found and i <= 5 and gotstr == 'notyet':
        try:
            gotbytes, addressport = sock.recvfrom(512)
            gotstr = gotbytes.decode()
        except:
            i += 1
            sock.sendto( bytestoXmit, ( '239.255.255.250', 1900 ) )
        if re.search('LG', gotstr):
            ipaddress, _ = addressport
            found = True
        else:
            gotstr = 'notyet'
        i += 1
    sock.close()
    if not found : sys.exit("Lg TV not found")
    return ipaddress
def displayKey():
    conn = http.client.HTTPConnection( lgtv["ipaddress"], port=8080)
    reqKey = "<?xml version=\"1.0\" encoding=\"utf-8\"?><auth><type>AuthKeyReq</type></auth>"
    conn.request("POST", "/hdcp/api/auth", reqKey, headers=headers)
    httpResponse = conn.getresponse()
    if httpResponse.reason != "OK" : sys.exit("Network error")
    return httpResponse.reason
def getSessionid():
    conn = http.client.HTTPConnection( lgtv["ipaddress"], port=8080)
    pairCmd = "<?xml version=\"1.0\" encoding=\"utf-8\"?><auth><type>AuthReq</type><value>" \
            + lgtv["pairingKey"] + "</value></auth>"
    conn.request("POST", "/hdcp/api/auth", pairCmd, headers=headers)
    httpResponse = conn.getresponse()
    if httpResponse.reason != "OK" : return httpResponse.reason
    tree = etree.XML(httpResponse.read())
    return tree.find('session').text
def getPairingKey():
    displayKey()
    root = Tk()
    root.withdraw()
    dialogMsg = "Please enter the pairing key\nyou see on your TV screen\n"
    d = MyDialog(root, dialogMsg)
    root.wait_window(d.top)
    lgtv["pairingKey"] = result
    d.top.destroy()
def handleCommand(cmdcode):
    conn = http.client.HTTPConnection( lgtv["ipaddress"], port=8080)
    cmdText = "<?xml version=\"1.0\" encoding=\"utf-8\"?><command><session>" \
                + lgtv["session"]  \
                + "</session><type>HandleKeyInput</type><value>" \
                + cmdcode \
                + "</value></command>"
    conn.request("POST", "/hdcp/api/dtv_wifirc", cmdText, headers=headers)
    httpResponse = conn.getresponse()
#main()
lgtv["ipaddress"] = getip()
theSessionid = getSessionid()
while theSessionid == "Unauthorized" :
    getPairingKey()
    theSessionid = getSessionid()
if len(theSessionid) < 8 : sys.exit("Could not get Session Id: " + theSessionid)
lgtv["session"] = theSessionid
dialogMsg =""
for lgkey in lgtv :
    dialogMsg += lgkey + ": " + lgtv[lgkey] + "\n"
dialogMsg += "Success in establishing command session\n"
dialogMsg += "=" * 28 + "\n"
dialogMsg += "Enter command code i.e. a number between 0 and 255\n"
dialogMsg += "Enter a number greater than 255 to quit.\n"
dialogMsg += "Some useful codes:\n"
dialogMsg += "for EZ_ADJUST     menu enter   255 \n"
dialogMsg += "for IN START        menu enter   251 \n"
dialogMsg += "for Installation     menu enter   207 \n"
dialogMsg += "for POWER_ONLY mode enter   254 \n"
dialogMsg += "Warning: do not enter 254 if you \ndo not know what POWER_ONLY mode is. "
result = "91"
while int(result) <= 255:
    root = Tk()
    root.withdraw()
    d = MyDialog(root, dialogMsg)
    root.wait_window(d.top)
    handleCommand(result)

Не подключается к телевизору, пишет:
Microsoft Windows
© Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\User>C:\Python33\python.exe C:\Users\User\Desktop\lg.pyw
Lg TV not found

Пробую вписать айпишник телевизора: 192.168.1.64 в строку ipadress, _
выдаёт синтаксическую ошибку подсвечивая единицу. Как вообще правильно вписать айпишник?
Помогите пожалуйста.
Заранее благодарю.

Отредактировано bodycom (Янв. 20, 2014 17:53:42)

Офлайн

#2 Янв. 21, 2014 13:59:00

bodycom
Зарегистрирован: 2014-01-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

“отличный” форум, день впустую, 33 просмотра и ни одного ответа, молодцы!!!

Офлайн

#3 Янв. 21, 2014 14:27:31

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Поддерживаю. Всех казнить, казнь снять и снятое видео выложить на форум, чтобы другим было не повадно молчать и не писать ответы на столь злободневные вопросы…

P.S. Тем более ответы вопросы всем уже давно известны. Такие вопросы задают часто. Почти каждый день.

Отредактировано 4kpt_II (Янв. 21, 2014 14:31:12)

Офлайн

#4 Янв. 21, 2014 15:36:11

bodycom
Зарегистрирован: 2014-01-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

4kpt_II
Поддерживаю. Всех казнить, казнь снять и снятое видео выложить на форум, чтобы другим было не повадно молчать и не писать ответы на столь злободневные вопросы…P.S. Тем более ответы вопросы всем уже давно известны. Такие вопросы задают часто. Почти каждый день.
Пожалуйста, направьте на похожую тему. В синтаксисе питона не силен,а в ваших силах мне помочь,наверное. Заранее благодарю!

П.с. Кто-то писал про должен/не должен,умоляю, на всех форумах одинаковые ответы не перетрудитесь,вступать в перепалку же проще чем ответить по существу?

Офлайн

#5 Янв. 21, 2014 15:47:26

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

попробуй сюда вставить

lgtv["ipaddress"] = getip()
lgtv["ipaddress"] = '192.168.1.64'

Офлайн

#6 Янв. 21, 2014 15:48:30

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Поясню Вам Вашу проблему.
Вы хотите, чтобы скрипт, который Вы написали каки-то образом проверили.
У меня нет телевизора. Вообще. Как мне это реализовать. Перелопачевать тучу строк кода тоже не охота (да и времени нет, если чесно). Плюс у Вас сугубо специализированный вопрос…
Я Вам рекомендую следующий механизм решения Вашей проблемы.
Во-первых Вы разграничиваете визуализацию и выполнение. Код разносите по отдельным модулям.
Один модуль будет отвечать за GUI, другой - за выполнения.
Прокатываете каждый код. Тот, который отвечает за GUI пусть берет виртуальные данные для вывода (пусть данные генерятся левой функцией).
Второй код и процесс его выполнения описываете в виде последовательных вызовов функций (только если можно разбить на логически разные этапы). После этого пишите вопросы по-функции которая некорректно работает (предварительно ее ограничив), потом по следующей. И так по-этапам можно будет добраться до готового решения. Если Вы надеетесь, что кто-то будет этот код анализировать без возможности его запуска и искать таким образом в нем ошибку - жестоко ошибаетесь.

P.S. Но это только моя рекомендация. Можете дальше рассказывать про несостоятельность форумчан и их нежелание помочь. Дело Ваше

Офлайн

#7 Янв. 21, 2014 15:53:20

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

4kpt_II
я так понял что не он это писал, ему просто завести надо

Офлайн

#8 Янв. 21, 2014 15:59:11

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Может Вы и правы. Ну тогда ситуация посложнее. Если там одна ошибка, то, возможно, кто-то и сможет помочь. Если там нужно серьезно править - маловероятно…

Офлайн

#9 Янв. 21, 2014 17:05:49

bodycom
Зарегистрирован: 2014-01-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Да,вы правы,скрипт был написан не мной и находится в свободном доступе по адресу: https://github.com/ubaransel/lgcommander
Народ ведь пользуется им наверное,по крайней мере пробовал искать отзывы по скрипту и его ошибкам,ничего не нашел.
‘HOST: 239.255.255.250:1900’ + ‘\r\n’ + \
Этот айпишник откуда его взял автор скрипта,не пойму и порт 1900
Про несостоятельность форумчан я не писал и не собирался.
Мой часовой пояс отличается от Украины на +3 часа,сейчас не за компьютером дома,если поздно не будет- позже попробую вставить предложенную строку и протестировать,результат отпишу. Спасибо за внимание к моей теме.

Офлайн

#10 Янв. 21, 2014 17:41:41

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Помощь в скрипте управления телевизором LG.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version