【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令

哈嘍大家好,我是鵬哥。

今天想記錄的學習主題是 —— 基於pythonista3 app開發自己的iphone應用程序

~~~上課鈴~~~

 

(由於今天被小夥伴推薦了這首歌,因此就應他的要求,作爲此文的背景音樂吧!)

あいの唄wacci - 感情百景(期間生産限定盤)

1

寫在前面

之前看到翔哥發過一篇如何將安卓手機打造成Python開發環境,心生羨慕。可是由於不捨得那麼多的英雄和皮膚,因此只能繼續玩着iphone。

網上有很多人都說Appstore裏也有 python的開發工具:Pythonista 3,售價68元。對這款app,大家的評價都被五毛黨刷成:雖貴真香。抱着被騙的心態,我也花了68元大洋玩了。結果是:

真香!真香!

 

2

效果展示

本次開發的應用程序其實就是個小程序,但是不做標題黨,沒人關注呀是個查看杭州天氣的功能。

桌面app:weather

運行結果:

點擊桌面app圖標或者通過siri “查看天氣”:,都可以實現以下功能。

3

如何玩呢

下面我從零開始,一步步教大家如何開發屬於自己的iphone應用。

(1)從Appstore下載pythonista 3

(2)安裝pip依賴的環境腳本:stash庫

python之所以簡單易用,能通過Pip命令快速安裝python庫是其中重要的一個原因。因爲如果在手機上開發python應用,自然也要安裝各種依賴庫。但是Pythonista 3本身並不支持pip命令,但是國外大神自己在GitHub上編寫了程序,實現了iphone pip命令的調用。

有興趣的同學,可以訪問以下地址學習Pip具體實現的代碼實現。

GitHub地址:https://github.com/ywangd/stash

那麼我們如何在iphone上下載stash庫呢?

很簡單,在pythonista 3的console界面輸入以下代碼:

import requests as r;exec(r.get('https://bit.ly/get-stash').text)

 

Tips: 一直右劃,就會劃到console界面

 

(3)下載stash及調用launch_stach.py的坑:

如果你家網絡不好,你就會遇到下面的報錯了:HTTPSConnect連接超時。

這裏有個辦法可以規避,即用電腦直接從github網站上下載getstash.py,然後通過微信轉給iphone。最後在iphone 執行getstash.py也可以成功下載stash庫。

成功界面如下:

下載成功的stash庫會在site-packagesX裏(如下圖,隨機一個文件夾)

從這 裏還可以看到Python2/3的標準庫也被pythonista 3統一下載好了,太貼心!

     然後你會發現,怎麼沒有啓動Pip的腳本:launch_stach.py呢?因爲launch_stach.py被自動放到了iphone的最外層文件夾。

然後你就可以像電腦上一樣,通過pip命令下載庫了:

Tips: 有些庫還是無法下載的,如Pyqt5

 

(4)編寫python代碼

說實話,在iphone上寫爬蟲代碼有點傻,因爲手機打字還是不方便。因此我是在電腦上編碼,然後通過微信傳到手機上實現的。

(5)在桌面上添加應用程序圖標

在Pythonista 工具按鈕裏,有個Home Screen圖標,即可將代碼添加至iphone桌面上,如下圖(爲什麼是通話中?因爲welcome to join the conference……,某些同學懂)

(6)添加快捷命令到siri

選擇創建快捷指令,然後選擇腳本--pythonista3 運行腳本。這些操作按界面提示來即可,沒什麼難度了。然後就可以通過“嗨 Siri”來幫你自動運行python腳本了。是不是很屌?

4

示例代碼

查看杭州天氣的代碼,可以查看之前的博客:【Python成長之路】python 從零學爬蟲 -- 獲取杭州天氣

因此不再詳細介紹代碼了。

# coding=utf-8
# @Auther : "鵬哥賊優秀"
# @Date : 2019/7/28
# @Software : PyCharm

import random
from bs4 import BeautifulSoup
import requests

def getheaders():
    user_list = [
        "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
        "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
        "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
        "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
        "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
        "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
        "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
        "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
        "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
        "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
        "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
        "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
        "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
        "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01",
        "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01",
        "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
        "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01",
        "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"
    ]
    user_agent = random.choice(user_list)
    headers = {'User-Agent': user_agent}
    return headers


def weather():
    url = "http://www.weather.com.cn/weather/101210101.shtml"
    headers = getheaders()
    r = requests.get(url, headers=headers)
    r.encoding = 'utf-8'
    soup = BeautifulSoup(r.text, "lxml")
    lines = soup.find('li', class_="sky skyid lv2 on")
    date = lines.h1.get_text()
    weather = lines.p.string
    low_temp = lines.find('p', class_="tem").i.get_text()
    if not lines.find('p', class_="tem").span:
        high_temp = "未知"
    else:
        high_temp = lines.find('p', class_="tem").span.get_text()
    temp = high_temp + '-' + low_temp
    wind = lines.find('span', class_="NNW").get('title')
    windnumber = lines.find('p', class_="win").i.get_text()
    result = {
        "日期": date,
        "天氣": weather,
        "溫度": temp,
        "風向": wind,
        "風級": windnumber
    }
    print(u"日期:{0} \n天氣:{1} \n溫度:{2} \n風向:{3} \n風級:{4}".format(date, weather, temp, wind, windnumber))
    return result

if __name__ == "__main__":
    print('*****程序開始!******')
    weather()
    print('*****程序結束!******')

對了,要運行這段代碼,需要在pyhonista中下載lxml庫。如果不想下載,可以將soup = BeautifulSoup(r.text, "lxml") 改成,效果是一樣的。

soup = BeautifulSoup(s, "html.parser")

 

5

總結

Pythonista3 在sample裏有些很有意思的代碼,如消消樂(300行代碼實現的,大神是真的牛逼!、三維繪圖等。

然後預告下週的博客主題,基於Pythonista 3開發自己的iphone入口,如下圖。好啦,下週見!

~~~下課鈴~~~

 

 

點擊下方詩句,可以留言互動喔  

 

清風以北過南巷,南巷故人不知歸。你本無意穿堂風,偏偏孤倨引山洪。

 

掃描二維碼

    與鵬哥一起

學python吧!

發佈了38 篇原創文章 · 獲贊 17 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章