I need to build a feature in my app, where i need to show some content based on zip-code. Is there any way to find user location and ultimately find zip code?
I don’t know if there is a inbuilt way. But, you can use external API. you can find zip code by Passing a IP Address. This is not a good way. Currently, Roku not Blocking any External API may be in Future like IOS. I hope this is helpful
@chaklasiyanikun Thanks for the reply. This is the same i have tried, but results are not very accurate with ip address.
@Manvendra It depends on API. I tried many API. and Found There is not a single one that gives an accurate result. But, I suggest one API which is better than all other. I’m not sure this is giving accurate result. But better than other API. I hope this is helpful.
@chaklasiyanikun Thanks. I will look into it.
This is very doable but as you and another user said, you need an external api and more importantly, one that is reliable in accuracy.
I can only recommend one api that has been flawless in which I use for weather features on the Roku and web apps.
You can see a demo with the response on page load and get a free api at https://ipstack.com/
Now we add a little bit of. code.
deviceInfo = CreateObject("roDeviceInfo")
ip = deviceInfo.GetExternalIp()
url = "http://api.ipstack.com/" + ip + "?access_key=yourIpStacksApiKey"
m.locationData = createObject("roSGNode", "locationDataReader")
m.locationData.contenturi = url
m.locationData.observeField("content", "locationDataResponse")
m.locationData.control = "RUN"
Create a task
<?xml version = "1.0" encoding = "utf-8" ?>
<component name = "locationDataReader" extends = "Task" >
<interface>
<field id = "contenturi" type = "uri" />
<field id = "content" type = "node" />
</interface>
<script type = "text/brightscript" >
<![CDATA[
sub init()
m.top.functionName = "getContent"
end sub
' **********************************************
sub getContent()
apiurl = m.top.url
m.port = CreateObject ("roMessagePort")
dataRequest = CreateObject("roUrlTransfer")
dataRequest.setURL(apiurl)
dataRequest.EnableEncodings(true)
https = "https:"
if LCase(Left(apiurl, Len(https))) = https
dataRequest.SetCertificatesFile ("common:/certs/ca-bundle.crt")
'dataRequest.AddHeader ("X-Roku-Reserved-Dev-Id", "")
dataRequest.InitClientCertificates ()
end if
response = dataRequest.getToString()
'the data will returned as json and you can decide to parse or use regex to get the zipcode
zipRegex = CreateObject ("roRegex", "zip.:.(\d+).,.latitude", "")
if zipRegex.isMatch(response)
zipcode = zipRegex.Match(response)
'if the regex returned data
print zipcode
end if
'print the whole json response
print response
end sub
]]>
</script>
</component>
@norcaljohnny Thank you so much. I will try this for sure.
