Posts: 2,701
Threads: 327
Joined: Apr 2022
Reputation:
217
Code: (Select All)
$Console:Only
_Dest _Console
ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2020
Function GetPublicIP$
f = FreeFile
Open "tempPIP.txt" For Output As #f: Close f
Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"
Open "tempPIP.txt" For Input As #f
If LOF(f) Then
Do
Line Input #f, temp$
If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
' Ignore it. What we want is the last line of info generated here.
Loop Until EOF(1)
End If
Close f
l = _InStrRev(last$, "Address:")
If l Then GetPublicIP$ = Mid$(last$, l + 10)
Kill "tempPIP.txt"
End Function
Sub Lat_Long (ip$, lat, lon)
out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'ip-api.com/line/"
out$ = out$ + ip$
out$ = out$ + "?fields=lat,lon' -OutFile '.\temp.txt'" + Chr$(34)
Shell _Hide out$
Open "temp.txt" For Input As #1
Input #1, lat
Input #1, lon
Close 1
End Sub
Sub SunStuff (lat, lon, month, day, year)
out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'https://api.sunrise-sunset.org/json?lat="
out$ = out$ + _Trim$(Str$(lat)) + "&lng="
out$ = out$ + _Trim$(Str$(lon)) + "&date="
d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
out$ = out$ + d$ + "' -OutFile '.\temp.txt'"
Shell out$
Open "temp.txt" For Binary As #1
t$ = Space$(LOF(1))
Get #1, 1, t$
'strip off unwanted stuff
l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
Do
l = InStr(t$, Chr$(34))
t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
Loop Until l = 0
Do
l = InStr(t$, "_")
t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
Loop Until l = 0
t$ = _Trim$(t$)
t$ = Left$(t$, Len(t$) - 1)
Do
l = InStr(t$, ",")
If l = 0 Then Exit Do
whole$ = Left$(t$, l)
l$ = Left$(whole$, InStr(whole$, ":") - 1)
r$ = Mid$(whole$, InStr(whole$, ":") + 1)
r$ = Left$(r$, Len(r$) - 1)
Print l$; " is "; r$
t$ = Mid$(t$, l + 1)
Loop
Close 1
End Sub
Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
Should be an interesting day in Aus: Sunrise 9:08 pm, Sunset 11:25 am ???
Posts: 2,701
Threads: 327
Joined: Apr 2022
Reputation:
217
(10-18-2024, 03:22 AM)PhilOfPerth Wrote: Should be an interesting day in Aus: Sunrise 9:08 pm, Sunset 11:25 am ???
That's actually right.
You just have to adjust for the time zone difference for wherever you are from UTC, and then maybe add/subtract an hour for Daylight Savings Time, if applicable.
Times are all in UTC time. (I guess I should've said that to start with.
I'm just guessing, but would +9 sound about right for you, where you're at? 6:08 AM and 8:25 PM for DEC 25th?
Posts: 8
Threads: 1
Joined: Apr 2022
Reputation:
1
I noticed a problem in line 34: After changing 'ip-api.com' to 'www.ip-api.com', it worked fine. Without 'www', an error occurs during execution in line 38 because the file 'temp.txt' is not found.
Greetings from Germany
"Give a man a program and he will be happy for a day. Teach him to program and he will be happy for the rest of his life."
Posts: 2,701
Threads: 327
Joined: Apr 2022
Reputation:
217
(10-18-2024, 12:44 PM)CletusSnow Wrote: I noticed a problem in line 34: After changing 'ip-api.com' to 'www.ip-api.com', it worked fine. Without 'www', an error occurs during execution in line 38 because the file 'temp.txt' is not found.
Greetings from Germany
Which version of Windows an Powershell, do you know? I haven't had any issues with it, but that doesn't mean much as various versions of these tools get upgraded over time and systems and such. I'm just curious if I can narrow down the problem and see why it works on my machine (and apparently Phil's as well), and yet needs to be modified for yours.
Maybe it's a firewall or antivirus thing in effect? Honestly, it's sometimes hard to tell when dealing with interweb unk.
Posts: 8
Threads: 1
Joined: Apr 2022
Reputation:
1
10-19-2024, 06:34 AM
(This post was last modified: 10-19-2024, 06:47 AM by CletusSnow.)
I have Windows 10 19045.5070 and PowerShell 7.4.5. Standard Windows security and firewall. Same issue on my Tablet and my other PC. Maybe special effects only for Germany?
Edit: It works fine on a virtual machine with Windows 11 26100 and PowerShell 1.0. It still works after an upgrade to PS 7.4.5
"Give a man a program and he will be happy for a day. Teach him to program and he will be happy for the rest of his life."
Posts: 200
Threads: 5
Joined: Apr 2022
Reputation:
22
10-19-2024, 06:52 AM
(This post was last modified: 10-19-2024, 08:36 AM by JRace.)
The program doesn't work for me even with @CletusSnow's fix.
It looks like Invoke-Webrequest was introduced in PS 3, so it doesn't work on my lowly Win7 box which is stuck with PS 2.0. (I've tried upgrading, but the MS installer package laughs in derision and shuts down.)
If someone needs to check their PS version, they can type $PSVersionTable at the PS prompt.
Edit: got it to work using curl instead of PowersHell:
Code: (Select All) $Console:Only
_Dest _Console
ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2020
Function GetPublicIP$
f = FreeFile
Open "tempPIP.txt" For Output As #f: Close f
Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"
Open "tempPIP.txt" For Input As #f
If LOF(f) Then
Do
Line Input #f, temp$
If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
' Ignore it. What we want is the last line of info generated here.
Loop Until EOF(1)
End If
Close f
l = _InStrRev(last$, "Address:")
If l Then GetPublicIP$ = Mid$(last$, l + 10)
Kill "tempPIP.txt"
End Function
Sub Lat_Long (ip$, lat, lon)
'out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'ip-api.com/line/"
out$ = "curl -s -o ./temp.txt " + Chr$(34) + "http://www.ip-api.com/line/"
out$ = out$ + ip$
out$ = out$ + "?fields=lat,lon" + Chr$(34)
'out$ = out$ + "?fields=lat,lon' -OutFile '.\temp.txt'" + Chr$(34)
Shell _Hide out$
Open "temp.txt" For Input As #1
Input #1, lat
Input #1, lon
Close 1
End Sub
Sub SunStuff (lat, lon, month, day, year)
'out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'https://api.sunrise-sunset.org/json?lat="
out$ = "curl -s -o temp.txt " + Chr$(34) + "http://api.sunrise-sunset.org/json?lat="
out$ = out$ + _Trim$(Str$(lat)) + "&lng="
out$ = out$ + _Trim$(Str$(lon)) + "&date="
d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
' out$ = out$ + d$ + "' -OutFile '.\temp.txt'"
Shell out$
Open "temp.txt" For Binary As #1
t$ = Space$(LOF(1))
Get #1, 1, t$
'strip off unwanted stuff
l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
Do
l = InStr(t$, Chr$(34))
t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
Loop Until l = 0
Do
l = InStr(t$, "_")
t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
Loop Until l = 0
t$ = _Trim$(t$)
t$ = Left$(t$, Len(t$) - 1)
Do
l = InStr(t$, ",")
If l = 0 Then Exit Do
whole$ = Left$(t$, l)
l$ = Left$(whole$, InStr(whole$, ":") - 1)
r$ = Mid$(whole$, InStr(whole$, ":") + 1)
r$ = Left$(r$, Len(r$) - 1)
Print l$; " is "; r$
t$ = Mid$(t$, l + 1)
Loop
Close 1
End Sub
Man, that late sunrise/sunset in the wintertime really messes with my sleep schedule.
Posts: 2,701
Threads: 327
Joined: Apr 2022
Reputation:
217
10-20-2024, 12:03 PM
(This post was last modified: 10-20-2024, 12:04 PM by SMcNeill.)
@CletusSnow
@JRace
Give this version a shot, guys:
Code: (Select All)
$Unstable:Http
$Console:Only
_Dest _Console
ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2024
Function GetPublicIP$
f = FreeFile
Open "tempPIP.txt" For Output As #f: Close f
Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"
Open "tempPIP.txt" For Input As #f
If LOF(f) Then
Do
Line Input #f, temp$
If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
' Ignore it. What we want is the last line of info generated here.
Loop Until EOF(1)
End If
Close f
l = _InStrRev(last$, "Address:")
If l Then GetPublicIP$ = Mid$(last$, l + 10)
Kill "tempPIP.txt"
End Function
Sub Lat_Long (ip$, lat, lon)
out$ = "www.ip-api.com/line/" + ip$ + "?fields=lat"
t$ = Download$(out$, junk&)
lat = Val(t$)
out$ = "www.ip-api.com/line/" + ip$ + "?fields=lon"
t$ = Download$(out$, junk&)
lon = Val(t$)
End Sub
Sub SunStuff (lat, lon, month, day, year)
out$ = "api.sunrise-sunset.org/json?lat="
out$ = out$ + _Trim$(Str$(lat)) + "&lng="
out$ = out$ + _Trim$(Str$(lon)) + "&date="
d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
out$ = out$ + d$
t$ = Download$(out$, junk&)
'strip off unwanted stuff
l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
Do
l = InStr(t$, Chr$(34))
t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
Loop Until l = 0
Do
l = InStr(t$, "_")
t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
Loop Until l = 0
t$ = _Trim$(t$)
t$ = Left$(t$, Len(t$) - 1)
Do
l = InStr(t$, ",")
If l = 0 Then Exit Do
whole$ = Left$(t$, l)
l$ = Left$(whole$, InStr(whole$, ":") - 1)
r$ = Mid$(whole$, InStr(whole$, ":") + 1)
r$ = Left$(r$, Len(r$) - 1)
Print l$; " is "; r$
t$ = Mid$(t$, l + 1)
Loop
Close 1
End Sub
' Content of the HTTP response is returned. The statusCode is also assigned.
Function Download$ (url As String, statusCode As Long)
h& = _OpenClient("HTTP:" + url)
statusCode = _StatusCode(h&)
While Not EOF(h&)
_Limit 60
Get #h&, , s$
content$ = content$ + s$
Wend
Close #h&
Download$ = content$
End Function
Here, I've taken out the powershell commands and swapped this over to using our native QB64PE tcp/ip connections to download from the internet. I'm thinking this should work for everyone without any issues.
(This may even work for Linux/Mac folks, if you can supply your lat/lon coordinates for it. (Or ip address, as we use it to look up your lat/lon for you.)
Posts: 200
Threads: 5
Joined: Apr 2022
Reputation:
22
Smooth as silk on Win7 Pro 64-bit.
Posts: 8
Threads: 1
Joined: Apr 2022
Reputation:
1
Yep, it works.
"Give a man a program and he will be happy for a day. Teach him to program and he will be happy for the rest of his life."
|