Saya ingin melihat apakah saya dapat mengakses API online, tetapi untuk itu saya perlu memiliki akses Internet.
Bagaimana saya bisa melihat apakah ada koneksi yang tersedia dan aktif menggunakan Python?
python
networking
aF.
sumber
sumber
easy_install system_of_tubes
Jawaban:
Mungkin Anda bisa menggunakan sesuatu seperti ini:
Saat ini, 216.58.192.142 adalah salah satu alamat IP untuk google.com. Ubah
http://216.58.192.142
ke situs apa pun yang diharapkan dapat merespons dengan cepat .IP tetap ini tidak akan memetakan ke google.com selamanya. Jadi kode ini tidak kuat - akan membutuhkan pemeliharaan konstan agar tetap berfungsi.
Alasan mengapa kode di atas menggunakan alamat IP tetap alih-alih nama domain yang memenuhi syarat (FQDN) adalah karena FQDN akan membutuhkan pencarian DNS. Ketika mesin tidak memiliki koneksi internet yang berfungsi, pencarian DNS itu sendiri dapat memblokir panggilan ke
urllib_request.urlopen
lebih dari satu detik. Terima kasih kepada @rzetterberg karena menunjukkan ini.Jika alamat IP tetap di atas tidak berfungsi, Anda dapat menemukan alamat IP saat ini untuk google.com (di unix) dengan menjalankan
sumber
urlopen
tidak akan memakan waktu lebih lama dari 1 detik bahkan jika internet tidak" pada "." - kutipan. Ini tidak benar jika url yang diberikan tidak valid, maka pencarian DNS akan diblokir. Itu hanya berlaku untuk koneksi aktual ke server web. Cara paling sederhana untuk menghindari blok lookup DNS ini adalah dengan menggunakan IP-adress sebagai gantinya, maka dijamin hanya membutuhkan waktu 1 detik :)http://google.com
lalu Anda selesaikan semua masalah yang semua orang bicarakan di sini. Tidak perlu menggunakan alamat ip ...Jika kita dapat terhubung ke beberapa server Internet, maka kita memang memiliki konektivitas. Namun, untuk pendekatan tercepat dan paling dapat diandalkan, semua solusi harus memenuhi persyaratan berikut, paling tidak:
Untuk mematuhinya, satu pendekatan bisa jadi, periksa apakah salah satu server DNS publik Google dapat dijangkau. Alamat IPv4 untuk server ini adalah
8.8.8.8
dan8.8.4.4
. Kami dapat mencoba menghubungkan ke salah satu dari mereka.Nmap cepat dari tuan rumah
8.8.8.8
memberikan hasil di bawah ini:Seperti yang dapat kita lihat,
53/tcp
terbuka dan tidak disaring. Jika Anda adalah pengguna non-root, ingatlah untuk menggunakansudo
atau-Pn
argumen untuk Nmap untuk mengirim paket probe buatan dan menentukan apakah sebuah host sudah habis.Sebelum kita mencoba dengan Python, mari kita uji konektivitas menggunakan alat eksternal, Netcat:
Menegaskan netcat bahwa kita dapat mencapai
8.8.8.8
lebih53/tcp
. Sekarang kita dapat mengatur koneksi socket ke8.8.8.8:53/tcp
dalam Python untuk memeriksa koneksi:Pendekatan lain bisa dengan mengirim probe DNS yang dibuat secara manual ke salah satu server ini dan menunggu jawaban. Tapi, saya berasumsi, ini mungkin terbukti lebih lambat dibandingkan dengan penurunan paket, kegagalan resolusi DNS, dll. Berikan komentar jika Anda berpikir sebaliknya.
UPDATE # 1: Berkat komentar @ theamk, batas waktu sekarang menjadi argumen dan diinisialisasi
3s
secara default.UPDATE # 2: Saya melakukan tes cepat untuk mengidentifikasi implementasi tercepat dan paling umum dari semua jawaban yang valid untuk pertanyaan ini. Berikut ringkasannya:
Dan sekali lagi:
True
dalam output di atas menandakan bahwa semua implementasi dari masing-masing penulis dengan benar mengidentifikasi konektivitas ke Internet. Waktu ditunjukkan dengan resolusi milidetik.UPDATE # 3: Diuji lagi setelah pengecualian menangani perubahan:
sumber
close()
soket?Akan lebih cepat untuk hanya membuat permintaan KEPALA sehingga tidak ada HTML yang akan diambil.
Juga saya yakin google akan lebih suka cara ini :)
sumber
Sebagai alternatif untuk jawaban ubutnu / Kevin C, saya menggunakan
requests
paket seperti ini:Bonus: ini dapat diperluas ke fungsi ini yang mem-ping sebuah situs web.
sumber
google.com
lagi, maka mereka akan memblokir IP kami. Jadi, apakah ada cara lain.?Hanya untuk memperbarui apa yang dikatakan unutbu untuk kode baru dalam Python 3.2
Dan, untuk dicatat, input di sini (referensi) adalah url yang ingin Anda periksa: Saya sarankan memilih sesuatu yang menghubungkan cepat tempat Anda tinggal - yaitu saya tinggal di Korea Selatan, jadi saya mungkin akan menetapkan referensi ke http: / /www.naver.com .
sumber
Anda bisa mencoba mengunduh data, dan jika koneksi gagal, Anda akan tahu bahwa sesuatu dengan koneksi tidak baik.
Pada dasarnya Anda tidak dapat memeriksa apakah komputer terhubung ke internet. Mungkin ada banyak alasan kegagalan, seperti konfigurasi DNS yang salah, firewall, NAT. Jadi, bahkan jika Anda melakukan beberapa tes, Anda tidak dapat menjamin bahwa Anda akan memiliki koneksi dengan API Anda sampai Anda mencobanya.
sumber
Untuk python 3, gunakan
urllib.request.urlopen(host)
sumber
Coba operasi yang Anda coba lakukan. Jika gagal, python harus memberi Anda pengecualian untuk memberi tahu Anda.
Untuk mencoba beberapa operasi sepele terlebih dahulu untuk mendeteksi koneksi akan memperkenalkan kondisi balapan. Bagaimana jika koneksi internet valid ketika Anda menguji tetapi turun sebelum Anda perlu melakukan pekerjaan yang sebenarnya?
sumber
Ini mungkin tidak berfungsi jika localhost telah diubah dari
127.0.0.1
CobaKecuali diedit, IP komputer Anda akan menjadi 127.0.0.1 saat tidak terhubung ke internet. Kode ini pada dasarnya mendapatkan alamat IP dan kemudian bertanya apakah itu adalah alamat IP localhost. Semoga itu bisa membantu
sumber
sumber
Solusi portabel modern dengan
requests
:Atau, versi yang memunculkan pengecualian:
sumber
Cara terbaik untuk melakukan ini adalah membuatnya mengecek alamat IP yang selalu diberikan python jika tidak dapat menemukan situs web. Dalam hal ini, ini adalah kode saya:
sumber
favorit saya, saat menjalankan skrip pada sebuah cluster atau tidak
ini berjalan dengan tenang, tidak mengunduh apa pun kecuali memeriksa apakah file jarak jauh yang diberikan ada di web
sumber
Mengambil jawaban unutbu sebagai titik awal, dan telah dibakar di masa lalu oleh perubahan alamat IP "statis", saya telah membuat kelas sederhana yang memeriksa sekali menggunakan pencarian DNS (yaitu, menggunakan URL " https: // www .google.com "), lalu menyimpan alamat IP dari server yang merespons untuk digunakan pada pemeriksaan selanjutnya. Dengan begitu, alamat IP selalu terkini (dengan asumsi kelas diinisialisasi ulang setidaknya sekali setiap beberapa tahun atau lebih). Saya juga memberikan pujian kepada jawaban ini , yang menunjukkan kepada saya bagaimana cara mendapatkan alamat IP server (setelah pengalihan, dll.). Harap abaikan kekonyolan dari solusi ini, saya akan mencoba contoh yang minimal di sini. :)
Inilah yang saya miliki:
sumber
Mengambil jawaban Enam, saya pikir kita bisa menyederhanakan entah bagaimana, masalah penting karena pendatang baru hilang dalam masalah yang sangat teknis.
Di sini, apa yang akhirnya akan saya gunakan untuk menunggu koneksi saya (3G, lambat) dibuat sekali sehari untuk pemantauan PV saya.
Bekerja di bawah Pyth3 dengan Raspbian 3.4.2
maksimum berjalan: 5 menit jika tercapai saya akan mencoba dalam waktu satu jam tetapi sedikit script lain!
sumber
Mengambil jawaban Ivelin dan menambahkan beberapa pemeriksaan tambahan karena router saya memberikan alamat ip 192.168.0.1 dan mengembalikan kepala jika tidak memiliki koneksi internet saat menanyakan google.com.
sumber
Ini berfungsi untuk saya di Python3.6
sumber
Saya menambahkan beberapa ke kode Joel.
sumber
Untuk proyek saya, saya menggunakan skrip yang dimodifikasi untuk melakukan ping ke server DNS publik google 8.8.8.8. Menggunakan batas waktu 1 detik dan pustaka python inti tanpa ketergantungan eksternal:
Nilai batas waktu pilih adalah 1, tetapi bisa menjadi angka pilihan floating point untuk gagal lebih mudah daripada 1 detik dalam contoh ini.
sumber
impor permintaan dan coba kode python sederhana ini.
sumber