程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Écrivez un script en python, connectez - vous automatiquement au Wifi, connectez - vous automatiquement au réseau du campus

編輯:Python

Source::Réseau

1.Principe de réalisation

Je viens d'apprendre.httpAccord,C'est comme un examen.

En résumé,,Trouver l'interface de connexion via l'URL,Et envoyerpostDemande,Soumettre les informations de connexion au serveur,Pour compléter la connexion.

1.1- Oui. URL

L'URL dont nous parlons,En fait, c'est un localisateur de ressources unifié(uniform resource locatorAbréviationsURL),Par cette adresse unique,Le service correspondant peut être trouvé.Son format standard est le suivant:

Accord://Nom d'utilisateur:Mot de [email protected] - domaine.Nom de domaine.Domaine de premier niveau:Numéro de port/Table des matières/Nom du fichier.Suffixe de fichier?Paramètres=Valeur#Le logo

Ce n'est qu'un format standard,Certaines informations peuvent être omises,Comme les informations de connexion, etc,Et l'adresse du serveur peut être utilisée comme adresse de domaine,Peut également être utiliséipAdresse.Le chemin de fichier hiérarchique est en fait la ressource serveur à laquelle vous accédez,Point d'interrogation?

Derrière.getParamètres demandés.httpLe Protocole comporte plusieurs méthodes de demande,postEtgetJuste deux d'entre eux.

1.getLa méthode consiste principalement à obtenir des informations sur les ressources du serveur,Les paramètres demandés sont généralement placés dansurl?Derrière.

2.post La méthode consiste principalement à soumettre les données au serveur , Soumettre dans le corps du message .

http L'essence de l'accord est d'obtenir une sorte de “Ressources”(Vidéo、Audio、Page Web、Photos……), Et la transmission est sa fonction .En fait,, La plupart des comportements en ligne , La communication inter - processus est en cours ,Puisque c'est une communication,, Pour obtenir et envoyer des informations , Donc ça correspond à notre vie , La plupart des comportements en ligne ne sont pas différents :

1. Obtenez les ressources sur le serveur localement ( Télécharger une courte vidéo 、Fiction en ligne……)

2. Pousser le serveur local vers le serveur (Recherche、Connexion、Passer une commande……)

1.2 httpFormat du message de demande

Première ligne: [Méthodes] + [url] + [Version]

Header: Propriétés demandées, Paires de valeurs Clés séparées par deux points;Utiliser entre chaque ensemble de propriétés\nSéparation;Une ligne vide rencontrée indiqueHeaderFin partielle

Body: Tout ce qui suit une ligne videBody. BodyAutoriser une chaîne vide. SiBodyExiste, DansHeaderIl y en aura un Content-LengthPropriété pour identifierBodyLongueur;

1.3 http Format de l'en - tête de réponse

Première ligne: [Numéro de version] + [Code d'état] + [Explication du Code d'état]

Header: Propriétés demandées, Paires de valeurs Clés séparées par deux points;Utiliser entre chaque ensemble de propriétés\nSéparation;Une ligne vide rencontrée indiqueHeaderFin partielle

Body: Tout ce qui suit une ligne videBody. BodyAutoriser une chaîne vide. SiBodyExiste, DansHeaderIl y en aura un Content-LengthPropriété pour identifierBodyLongueur; Si le serveur renvoie unhtmlPage, AlorshtmlLe contenu de la page est bodyMoyenne.

HTTPFréquentHeader:

Content-Type: Type de données(text/htmlAttendez.) Content-Length: BodyLongueur

Host: Le client informe le serveur, La ressource demandée est sur quel hôte et sur quel port; User-Agent: Déclarer les informations de version du système d'exploitation et du navigateur de l'utilisateur;

referer: De quelle page la page courante a - t - elle sauté;

location: Collocation3xxCode d'état utilisé, Dites au client où aller ensuite;

Cookie: Pour stocker de petites quantités d'informations sur le client. Généralement utilisé pour les sessions de mise en œuvre(session)La fonction de;

2.Réalisation concrète

import requestsimport socket# AccèsipAdressedef get_host_ip():
"""
Requête nativeipAdresse
:return: ip
"""
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
finally:
s.close()
return ip
user_ip = get_host_ip()# Adresse du réseau campus , Il vaut mieux ne pas utiliser le url, Il est également recommandé de saisir le paquet pour post_addr = "http://10.10.244.11:801/eportal/"# Les deux accolades ci - dessous sont copiées sur le site de connexion du campus de votre école , Deux guillemets de chaque côté du point - virgule post_header = { #Informations sur l'en - tête,En saisissant le sac,Accès}
post_data = {
#Données du corps,Obtenir par capture de paquets}
#SoumettrehttpMessage de demandez = requests.post(post_addr, data=post_data, headers=post_header)print(" Connexion réussie au réseau campus ,Réseau localipComme suit:")print(user_ip)#input("")

Voici la logique principale du Code , Les détails doivent également être remplis . Au début, l'ordinateur n'était pas installé requestsEnveloppé, Vous devez d'abord l'installer vous - même ,Derrièrepython Tous les paquets à importer sont pip3Commande d'installation.Si elle n'est pas installéepip3Ordre de,Veuillez installer vous - même.

pip3 install requests

2.1 Accèsurl

Ouvrez d'abord la fenêtre de connexion Internet sur Google explorer ,Et appuyez surF12 Clé en mode développeur , Vérifier le journal de conservation ,Entrez le mot de passe du compte,Se connecter, Lors de l'obtention d'un login sur le réseau httpMessage de demande.

Et voir les paquets capturés , Regardez le premier ,Généralement le premier, Si vous n'êtes pas à l'aise, vous pouvez entrer dans la zone pour voir , Voir la méthode de demande dans l'en - tête ,Assurez - vous que oui.post. Et il y a une URL de demande à l'intérieur ,C'esturlC'est.Il suffit de copier? Ce qui précède le point d'interrogation , Il y en a derrière. getParamètre de requête pour la méthode, Je ne vois pas ce que ça veut dire. urlExplication.

Tirez vers le bas, Et en - têtes de réponse , Demander des informations telles que l'en - tête ,:warning:Attention!, Parce qu'on va demander une connexion au serveur , Donc ce qu'il nous faut, c'est un en - tête de requête. ,Plutôt que de répondre,Ne vous méprenez pas.

# Adresse du réseau campus , Il vaut mieux ne pas utiliser le url, Il est également recommandé de saisir le paquet pour post_addr = "http://10.10.244.11:801/eportal/"

C'est ainsi que la première étape est franchie , J'ai l'adresse du réseau du campus . Pourquoi n'est - il pas recommandé de copier directement à partir du navigateur , Comme dans notre école, la réponse est 3xx, Description l'URL a été redirigée , Donc l'adresse du paquet est plus précise .

2.2 Obtenir l'en - tête du message de demande

Remplir l'en - tête de la requête dans le bloc de code ,Sectionheader A été expliqué ci - dessus , En savoir plus . Le format rempli est la valeur clé key:valuesMode,keyEtvalues Toutes les chaînes doivent être citées , Les valeurs des touches supérieure et inférieure sont séparées par des virgules , Voici mon propre message ,Juste un exemple.

# Les deux accolades ci - dessous sont copiées sur le site de connexion du campus de votre école , Deux guillemets de chaque côté du point - virgule post_header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': '10.10.244.11',
'Referer': 'http://10.10.244.11/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36',}

2.3 Obtenir les données du message de demande

Mettez la chaîne de requête dans la charge utile 、 Les données du formulaire sont remplies dans le bloc , Le principal téléchargement ici est vos informations de connexion ,Ne le remplissez pas mal.

post_data = {
'c': 'ACSetting',
'a': 'Login',
'DDDDD': 'xxxx',
'upass': 'xxxxx',
'protocol': 'http:',
'hostname': '10.10.244.11',
'iTermType': '1',
'wlanuserip': user_ip,
'wlanacip': 'xxxxxx',
'wlanacname': 'SPL-BRAS-SR8806-X',
'mac': '00-00-00-00-00-00',
'ip': user_ip,
'enAdvert': '0',
'queryACIP': '0',
'loginMethod': '1'}

2.4 Obtenez le réseau local de cet ordinateur ip

Pourquoi écrire une seule fonction pour obtenir l'hôte IPEt alors?,Parce queIP L'adresse est divisée en fixe IPAdresse et dynamiqueIPAdresse, Ce que nous devons obtenir est dynamique IPAdresse, Ça change tout le temps , Impossible de remplir l'adresse obtenue par capture de paquets directement dans les données demandées , Ou vous changez d'endroit , Peut - être que cette adresse est morte. .

FixeIP:FixeIP L'adresse est assignée de façon permanente à un ordinateur pour utilisation IPAdresse, Ce sont généralement des serveurs spéciaux qui ont des fixations IPAdresse.

DynamiqueIP:Parce queIP Les ressources de l'adresse sont très rares , Les abonnés à l'accès commuté par téléphone ou à large bande n'ont généralement pas d'accès fixe IPAdresse,Mais parISP Allocation dynamique temporaire d'un IPAdresse, Tout cela est fait automatiquement par le système informatique .

# AccèsipAdresse#Importation requisesocketSac, Le système doit être autonome def get_host_ip():
"""
Requête nativeipAdresse
:return: ip
"""
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0] finally:
s.close()
return ip
user_ip = get_host_ip()

C'est écrit ici. , Connexion automatique au réseau du campus , Mais seulement si vous ouvrez d'abord Wi-Fi, Réseau de campus relié à l'école Wi-Fi.Après tout, .Les fonctionnalités actuelles ne peuvent que vous aider à vous connecter au réseau campus ,Connexion au réseau campusWi-Fi C'est toujours à toi de faire , Si vous étiez connecté à un autre réseau, , Donc vous avez encore un changement de réseau .

Il faut donc ajouter une autre connexion automatique Wi-FiLa fonction de,Juste à temps.pythonIl y en a un.pywifi Le pack peut supporter cette fonctionnalité .Mais!!Directpip3 Installationpywifi Non pris en charge dans le paquet mac osDeWi-FiContrôle, Parce que le développement de ceci pywifi L'auteur du paquet n'en a pas besoin. mac osSystème,Alors...pywifiLes paquets ne sont pris en charge quewindowsEtlinux.

Heureusement que, Puis quelqu'un a posé la question , L'auteur a ensuite écrit mac osLe sac de, Mais je dois le télécharger moi - même . Moi aussi, j'ai traversé beaucoup de hauts et de bas ,Pour résoudre ce problème.

3.Connexion automatiqueWi-Fi

Ou installer d'abord au terminal pywifiSac,Et trouverpywifi Emplacement du paquet , Remplacer tout le contenu par le support moc os DepywifiSac.

pip3 install pywifi

Si vous ne trouvez paspywifi Le chemin peut d'abord exécuter la commande de désinstallation , Ensuite, le chemin du paquet qui a été installé apparaîtra , Puis copiez le chemin désiré ,Il vaut mieux choisirnLes ordres, Arrêtez de désinstaller. .

Après avoir obtenu le chemin d'installation , Peut être vu dans le terminal ,On peut aussimac Affichage en mode fichier visuel , Je préfère la visualisation , .Certains dossiers sont traduits en chinois lorsqu'ils sont ouverts , Je crois qu'on peut le trouver par cœur. .

TrouverpywifiAprès le chemin, Télécharger le support mac osDepywifiC'est fait., Remplacer après le téléchargement . Et ce soutien mac osDepywifiOù est - il?? Voici l'auteur githubAdresse,AuteurawkmanInIssue24 Il y a une réponse. , Il a écrit une compatibilité MacosDedemoProcédure.

mocÉditionpywifi

Réponse de l'auteur

Peut être utilisé au terminalgitTéléchargement des commandes,C'est possible., Télécharger directement dans l'entrepôt de l'auteur ,Comme vous voulez..git Les commandes de téléchargement sont les suivantes :-b Il y a des branches derrière , Auteur placé dans macos_devC'est parti..

git clone -b macos_dev https://github.com/awkman/pywifi.git

Après le téléchargement, vérifiez si macDe.pyDocumentation, Pas de problème si c'est inclus . Et j'ai inclus macCelui - ci.pywifi Documents et documents antérieurs pywifiIl suffit de remplacer.D'abord.cdAu dossier courant,Et puiscp Copier sur le chemin original ( Comment trouver le chemin? ), Le même nom de fichier remplacera automatiquement le contenu .

cd pywifi
cp -r pywifi /Users/wenanqin/Library/Python/3.8/lib/python/site-packages

J'ai fini comme ça ,Exécuter ou signaler une erreur,Parce que la découverte_wifiutil_macos.py Il y a un paquet qui n'est pas installé , C'est fini. .

pip3 install pyobjc

Commencez par terminer la connexion wifiCode de fonction, Sur un chemin unifié ,Créer un nouveauwifi.pyDocumentation.

import pywifiimport time# Enregistrer les constantes d'écriture dans le paquet from pywifi import constdef wifi_connect_status():
"""
Déterminer si la machine a une carte réseau sans fil , Et l'état de la connexion
:return: Connecté ou avec une carte réseau sans fil retournée 1,Sinon, retournez à0
"""
# Créer un objet métaligne
wifi = pywifi.PyWiFi() # Prendre la machine actuelle , Première carte réseau Meta
iface = wifi.interfaces()[0] # Il est possible d'avoir plusieurs cartes Wi - Fi ,Alors, spécifiez
#Déterminer si la connexion est réussie
if iface.status() in [const.IFACE_CONNECTED,const.IFACE_INACTIVE]: #print('wifi Déjà connecté au réseau ')
return 1
else:
print("Mon frère., Je n'ai pas réglé l'ouverture automatique Wi-FiFonction, Ouvre d'abord. wifiEssaie encore.?") return 0def scan_wifi():
"""
Numériser les pièces jointes wifi
:return: Objet des résultats de la numérisation
"""
# Numériser les pièces jointes wifi
wifi = pywifi.PyWiFi()
iface = wifi.interfaces()[0]
iface.scan() # Numériser les pièces jointes wifi
time.sleep(1)
basewifi = iface.scan_results() # for i in basewifi:
# print('wifiRésultats du Scan:{}'.format(i.ssid)) # ssid PourwifiNom
# print('wifiMatérielMACAdresse:{}'.format(i.bssid))
return basewifidef connect_wifi():
wifi = pywifi.PyWiFi() # Créer unwifiObjet
ifaces = wifi.interfaces()[0] # Prenez la première carte réseau infinie
#print(" Nom de la carte réseau sans fil locale :")
#print(ifaces.name()) # Nom de la carte sans fil de sortie
ifaces.disconnect() # Déconnecter la carte réseau
time.sleep(3) # Tampon3Secondes
profile = pywifi.Profile() # Profil
profile.ssid = "NJUPT-CMCC" # wifiNom
# Connexion au réseau du campus sans mot de passe , Module de connexion supplémentaire
# profile.auth = const.AUTH_ALG_OPEN # Un mot de passe est requis
# profile.akm.append(const.AKM_TYPE_WPA2PSK) # Type de chiffrement
# profile.cipher = const.CIPHER_TYPE_CCMP # Unit é de chiffrement
# profile.key = '4000103000' #wifiMot de passe
ifaces.remove_all_network_profiles() # Supprimer d'autres profils
tmp_profile = ifaces.add_network_profile(profile) # Charger le profil
ifaces.connect(tmp_profile) # Connexion
time.sleep(1) # Essayez.10 Si les secondes se connectent avec succès
isok = True
if ifaces.status() == const.IFACE_CONNECTED:
print(" Connexion réussie au réseau campus ") else:
print(" Impossible de se connecter au réseau campus ") #ifaces.disconnect() # Déconnecter
time.sleep(1) return isok

Il y a trois fonctions ici , Pour les deux premiers tests , En fait, vous ne pouvez appeler que le troisième .link.py Appelez la connexion avant de vous connecter au réseau du campus wifiModule.

import requestsimport socket# Importer ce qui vient d'être écrit wifiModule, Doit être dans le même dossier import wifi#VoirwifiStatutwifi.wifi_connect_status()#Connexionwifiwifi.connect_wifi()# AccèsipAdressedef get_host_ip():
"""
Requête nativeipAdresse
:return: ip
"""
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
finally:
s.close()
return ip
user_ip = get_host_ip()# Adresse du réseau campus post_addr = "http://10.10.244.11:801/eportal/"# Les deux accolades ci - dessous sont copiées sur le site de connexion du campus de votre école , Deux guillemets de chaque côté du point - virgule post_header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': '10.10.244.11',
'Referer': 'http://10.10.244.11/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36',}
post_data = {
'c': 'ACSetting',
'a': 'Login',
'DDDDD': ',0,[email protected]',
'upass': 'xxxxx',
'protocol': 'http:',
'hostname': '10.10.244.11',
'iTermType': '1',
'wlanuserip': user_ip,
'wlanacip': 'xxxxxxx',
'wlanacname': 'SPL-BRAS-SR8806-X',
'mac': '00-00-00-00-00-00',
'ip': user_ip,
'enAdvert': '0',
'queryACIP': '0',
'loginMethod': '1'}
z = requests.post(post_addr, data=post_data, headers=post_header)# .Si vous ne voulez pas fermer la fenêtre manuellement à chaque fois, vous pouvez supprimer ce qui suit input,Et ensuite,print Changez ce que vous voulez. print(" Connexion réussie au réseau campus ,Réseau localipComme suit:")print(user_ip)#input("")

4.EmballéexeDocumentation

1.Installer d'abordpyinstallerSac

pip3 install pyinstaller

2.TrouverpyinstallerChemin de commande(Avecbin, L'ancienne méthode désinstalle le chemin de vue ), Je ne peux pas exécuter directement pyinstallerDirectives,Parce quepythonC'est le système., Les variables d'environnement n'ont pas été configurées .

3. Exécuter l'emballage des instructions

D'abord.cd Sous le chemin vers le fichier à emballer ,Puis exécutez la commande, J'a i installé un programme de clic droit , Facile à utiliser

#Oui. xx.py Emballé sous xx.exe

/Users/wenanqin/Library/Python/3.8/bin/pyinstaller -F xx.py

Fin de l'opération , Trois fichiers seront générés ,exeDocumentsdistDans le dossier,Jusqu'ici., Tout est fait. .

Exécution de la procédure,Comme ci - dessus.

Lectures recommandées  Cliquez sur le titre pour sauter

  • PythonManuel d'apprentissage

  • PandasApprendre le grand sac cadeau

  • 100+PythonProjet crawler

  • PythonManuel d'introduction à l'analyse des données

  • À l'intérieur de l'Université du Zhejiang PythonTutoriels

  • 240- Oui.Python Cas d'exercice avec code source

  • 70- Oui.PythonUn programme de pratique classique

  • C'est réglé30SectionPython Petit jeu avec code source


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved