Android 'te local ip öğrenme_?

Tabii ki önemli bir proje geliştiriyorsak böyle bir API kullanmak daha iyi olabilir. Kodumu bunun için güncelledim:

import socket

def get_public_ip():
    s=socket.socket()
    s.connect(("api.ipify.org",80))
    s.send(b'GET / HTTP/1.1\r\nHost: api.ipify.org\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n')
    return s.recv(1024).rsplit(b"\n",1)[1].decode()

Burada tam olarak ne demek istediniz? Socket kullandığımız için recv metodunun dönüş değeri bunun gibi bir şey oluyor:

b'HTTP/1.1 200 OK\r\nCache-Control: private\r\nContent-Type: text/html\r\nServer: \r\nDate: Tue, 31 Dec 2019 14:09:03 GMT\r\nConnection: close\r\nContent-Length: 11\r\n\r\n95.70.130.8'

Ay dogru, HTTP kutuphanesi gibi dusundum ben:

ip = urllib.request.urlopen("https://api.ipify.org").read().decode('ascii')

1 Beğeni

Diğer şekli de bu sanırım

https://ipv4bot.whatismyipaddress.com/

O da HTML donduruyor :​/

Bi de HTTP degil HTTPS lutfen :slight_smile:

1 Beğeni

Tamam düzelttim :smiley:

HTTP(S) protokolü kullanmadan bağlanabildiğimiz bir API hizmeti varmı ki?

Benim dedigim HTTP(S) uzerinden donen verinin turu. https://api.ipify.org plaintext donduruyor, https://ipv4bot.whatismyipaddress.com/ bozuk bir HTML. Pratikte onemli degil ama yazilan servisin kalitesi hakkinda bir fikir verebilir.

İşin ilginç tarafı yolladığımız isteğe göre https://ipv4bot.whatismyipaddress.com/ adresinin farklı değerler, yani sizin deyiminiz ile bozuk bir HTML döndürmesi. Ki bence bu Accept-Encoding: gzip, deflate kısmından kaynaklanıyor. Yani bana biraz servisin hakkını yemişsiniz gibi geldi :slightly_smiling_face: Biz headerde gzip dediğimiz için bize o şekilde dönüş yapıyor.

import gzip
import socket

s = socket.socket()
s.connect(("ipv4bot.whatismyipaddress.com",80))
s.send(b'GET / HTTP/1.1\r\nHost: api.ipify.org\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n')

raw = s.recv(1024)
data = raw.rsplit(b"\n",1)[1]
print(gzip.decompress(data))

Benim bozuk HTML’den kastim bu:

212.156.4.4

Bazi versiyonlar <body> tag’inin kullanilmamasina izin veriyor ama o versiyonlarin doctype anotasyonu istiyor olmalari lazim. Son versiyon sart kiliyor.

Donen datayi elestirirken enkapsule eden protokolu/encoding’i elestirecek degilim :​) (Yoksa bastaki HTTP/1.1 200’e laf ederdim) Accept-Encoding yollayan dusunsun nasil decode edecegini :​)

Bu arada gzip ve deflate kabul etmissin ama donen datayi gzip ile decompress ediyorsun.

1 Beğeni

Ben de emin olamamıştım bozuk HTML’den kastınızın ne olduğuna :​)

Diğer şekilde nasıl yapabiliriz?

Sadece gzip istenebilir veya donen encoding’in gzip mi deflate mi olduguna bakip ona gore decode edilebilir.

Ben de deflate için nasıl decode edebileceğimizi sormuştum. Bulamadım da.

Ben de bilmiyorum. zlib olabilir.

deflate'li bir server bulursak (ben kurmaya usendim) deneyebilirim.