Programming Hulp gevraagd met overzetten van Python module

Bompaization

Active member
Ik heb een python module waarmee je uw Growatt omvormer kan uitlezen gebruikt om een android app te maken met behulp van Beeware.
Dat is gelukt, maar Beeware/Toga is nog te beperkt om dat een beetje deftig uit te bouwen, meer dan een heel simpele GUI gaat niet.
Ik ben dan maar begonnen om de module om te zetten naar Solar2D (vroeger bekend als Corona SDK), aangezien ik hier vroeger een paar games mee ontwikkeld heb. Dit is eigenlijk LUA.
Ik denk dat ik dicht bij een oplossing zit, maar ik loop vast op een sessionId probleem. Inloggen gaat prima, maar bij het oproepen van omvormer data 'vergeet' hij mijn credentials. Corona heeft geen session.request zoals python dus daar loopt mijn 'vertaling' vast.
Nochthans matchen 'saved cookie' en 'sent cookie', maar toch wil ie niet meewerken, de response header verwijst naar een 'je-bent-niet-ingelogd'-pagina.
Ik ben zeker dat het iets stom is, maar ik vind het niet.

Code:
local crypto = require("crypto")
local json = require("json")


local GrowattApi = {
    server_url = "https://server.growatt.com/",
    agent_identifier = "Dalvik/2.1.0 (Linux; U; Android 12; https://github.com/indykoning/PyPi_GrowattServer)",
}

local function hash_password(password)
    local password_md5 = crypto.digest(crypto.md5, password)
    for i=1, string.len(password_md5), 2 do
        if string.sub(password_md5, i, i) == '0' then
            password_md5 = string.sub(password_md5, 1, i-1) .. 'c' .. string.sub(password_md5, i+1)
        end
    end
    return password_md5
end

function GrowattApi:new(add_random_user_id, agent_identifier)
    local instance = {}
    if agent_identifier ~= nil then
        instance.agent_identifier = agent_identifier
    else
        instance.agent_identifier = self.agent_identifier
    end

    if add_random_user_id then
        print "adding random user_id"
        local random_number = ""
        for i=1, 5 do
            random_number = random_number .. tostring(math.random(0, 9))
        end
        instance.agent_identifier = instance.agent_identifier .. " - " .. random_number
    end

    instance.request_headers = {
        ["User-Agent"] = instance.agent_identifier,
    }

    setmetatable(instance, { __index = self })
    return instance
end

function GrowattApi:get_url(endpoint)
    local url = self.server_url .. endpoint
    return url
end

local function networkListener(event)
    if (event.isError) then
        print("Network error:", event.response)
    else
        print("Response headers:", json.encode(event.responseHeaders))
        print("JSON response:", event.response) --try anyway
        local contentType = event.responseHeaders["Content-Type"]
        if (contentType == "application/json") then
            local response = json.decode(event.response)
            print("JSON response:", response)
        else
            print("Unknown response type:", contentType)
        end
    end
end

function GrowattApi:login(username, password, is_password_hashed)
    is_password_hashed = is_password_hashed or false
    if not is_password_hashed then
        password = hash_password(password)
    end

    local headers = {}
    headers["Content-Type"] = "application/x-www-form-urlencoded"
    local params = {
        headers = headers,
        body = "userName=" .. username .. "&password=" .. password,
    }

    network.request(
        self:get_url('newTwoLoginAPI.do'),
        'POST',
        function(response)
            if response.phase == "ended" and response.status == 200 then
                local data = json.decode(response.response)["back"]
                if data["success"] then  -- this works fine
                    data["userId"] = data["user"]["id"]
                    data["userLevel"] = data["user"]["rightlevel"]
                    -- Save the cookie
                    local cookie = response.responseHeaders["Set-Cookie"]
                    self.cookie = cookie
                    print ("saved cookie ", self.cookie)
                end
                print ("data = ", data, "length =", #data)
                return data
            else
            print "there was no response to my login attempt :("
            end
        end,
        params
    )
end

 -- calling this with a 1 second delay in main.lua just to make sure it is passed after login
 -- will implement better when I sort out the cookie stuff
function GrowattApi:tlx_detail(tlx_id)
    print("tlx_id is", tlx_id) -- check if the id is passed correctly, which it is
    local url = self:get_url('newTlxApi.do')
    local headers = {
        ["Set-Cookie"] = self.cookie
    }
    print ("sending cookie :", self.cookie)
    local params = {
        headers = headers,
        params = {
            op = 'getTlxDetailData',
            id = tlx_id
        }
    }
    network.request(url, 'GET', networkListener, params)
end

return GrowattApi
 
Terug
Bovenaan